浏览代码

New namespaces: GL2D (low-level OpenGL functions), Gfx (images and animation objects cooperating with the interface GL2D)

paracelsus 12 年之前
父节点
当前提交
1e0f473761
共有 57 个文件被更改,包括 2245 次插入907 次删除
  1. 27 11
      Global.h
  2. 4 4
      VCMI_VS10.sln
  3. 9 9
      client/AdventureMapClasses.cpp
  4. 4 4
      client/AdventureMapClasses.h
  5. 38 38
      client/CAdvmapInterface.cpp
  6. 5 5
      client/CAdvmapInterface.h
  7. 11 10
      client/CAnimation.cpp
  8. 3 3
      client/CAnimation.h
  9. 0 7
      client/CBitmapHandler.h
  10. 27 27
      client/CCastleInterface.cpp
  11. 4 4
      client/CCastleInterface.h
  12. 23 23
      client/CCreatureWindow.cpp
  13. 5 5
      client/CCreatureWindow.h
  14. 10 17
      client/CDefHandler.cpp
  15. 2 4
      client/CDefHandler.h
  16. 20 20
      client/CHeroWindow.cpp
  17. 1 1
      client/CHeroWindow.h
  18. 30 95
      client/CMT.cpp
  19. 21 20
      client/CMessage.cpp
  20. 2 3
      client/CPlayerInterface.cpp
  21. 97 112
      client/CPreGame.cpp
  22. 17 17
      client/CPreGame.h
  23. 15 15
      client/CQuestLog.cpp
  24. 4 4
      client/CQuestLog.h
  25. 22 22
      client/CSpellWindow.cpp
  26. 3 3
      client/CSpellWindow.h
  27. 39 98
      client/CVideoHandler.cpp
  28. 15 15
      client/CVideoHandler.h
  29. 79 77
      client/GUIClasses.cpp
  30. 19 19
      client/GUIClasses.h
  31. 93 0
      client/Gfx/Animations.cpp
  32. 70 0
      client/Gfx/Animations.h
  33. 63 0
      client/Gfx/CPaletteRGBA.cpp
  34. 46 0
      client/Gfx/CPaletteRGBA.h
  35. 81 0
      client/Gfx/FilesHeaders.h
  36. 440 0
      client/Gfx/Images.cpp
  37. 164 0
      client/Gfx/Images.h
  38. 82 0
      client/Gfx/ImgMakers.cpp
  39. 76 0
      client/Gfx/Manager.cpp
  40. 21 0
      client/Gfx/Manager.h
  41. 4 3
      client/Graphics.cpp
  42. 22 39
      client/UIFramework/CCursorHandler.cpp
  43. 8 7
      client/UIFramework/CCursorHandler.h
  44. 31 11
      client/UIFramework/CGuiHandler.cpp
  45. 1 1
      client/UIFramework/CGuiHandler.h
  46. 9 10
      client/UIFramework/CIntObject.cpp
  47. 5 5
      client/UIFramework/CIntObject.h
  48. 97 88
      client/UIFramework/CIntObjectClasses.cpp
  49. 21 22
      client/UIFramework/CIntObjectClasses.h
  50. 242 0
      client/UIFramework/GL2D.cpp
  51. 17 0
      client/UIFramework/GL2D.h
  52. 5 3
      client/UIFramework/SDL_Extensions.cpp
  53. 15 3
      client/VCMI_client.vcxproj
  54. 59 5
      client/VCMI_client.vcxproj.filters
  55. 3 14
      lib/Filesystem/CResourceLoader.cpp
  56. 13 3
      lib/Filesystem/CResourceLoader.h
  57. 1 1
      lib/VCMI_lib.vcxproj

+ 27 - 11
Global.h

@@ -26,8 +26,9 @@
 
 
 #define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
+#include <cstdint>
 #include <cstdio>
-#include <stdio.h>
+
 #ifdef _WIN32
 #include <tchar.h>
 #else
@@ -68,7 +69,6 @@
 #include <boost/assert.hpp>
 #include <boost/assign.hpp>
 #include <boost/bind.hpp>
-#include <boost/cstdint.hpp>
 #include <boost/date_time/posix_time/posix_time.hpp>
 #include <boost/filesystem.hpp>
 #include <boost/foreach.hpp>
@@ -91,20 +91,20 @@
 #endif
 
 // Integral data types
-typedef boost::uint64_t ui64; //unsigned int 64 bits (8 bytes)
-typedef boost::uint32_t ui32;  //unsigned int 32 bits (4 bytes)
-typedef boost::uint16_t ui16; //unsigned int 16 bits (2 bytes)
-typedef boost::uint8_t ui8; //unsigned int 8 bits (1 byte)
-typedef boost::int64_t si64; //signed int 64 bits (8 bytes)
-typedef boost::int32_t si32; //signed int 32 bits (4 bytes)
-typedef boost::int16_t si16; //signed int 16 bits (2 bytes)
-typedef boost::int8_t si8; //signed int 8 bits (1 byte)
+typedef uint64_t ui64; //unsigned int 64 bits (8 bytes)
+typedef uint32_t ui32;  //unsigned int 32 bits (4 bytes)
+typedef uint16_t ui16; //unsigned int 16 bits (2 bytes)
+typedef uint8_t ui8; //unsigned int 8 bits (1 byte)
+typedef int64_t si64; //signed int 64 bits (8 bytes)
+typedef int32_t si32; //signed int 32 bits (4 bytes)
+typedef int16_t si16; //signed int 16 bits (2 bytes)
+typedef int8_t si8; //signed int 8 bits (1 byte)
 
 // Fixed width bool data type is important for serialization
 static_assert(sizeof(bool) == 1, "Bool needs to be 1 byte in size.");
 
 #if defined _M_X64 && defined _WIN32 //Win64 -> cannot load 32-bit DLLs for video handling
-	#define DISABLE_VIDEO
+	#define DISABLE_VIDEO 1
 #endif
 
 #ifdef __GNUC__
@@ -150,6 +150,22 @@ static_assert(sizeof(bool) == 1, "Bool needs to be 1 byte in size.");
 #define DLL_LINKAGE DLL_IMPORT
 #endif
 
+// Unaligned pointers
+#if defined(__GNUC__) && (defined(__arm__) || defined(__MIPS__) || defined(__sparc__))
+#	define UNALIGNED_PTR(T) struct __attribute__((__packed__)) { \
+		T val; \
+		inline operator T() { return val; }; \
+		inline T operator=(T v) { return val = v; }; \
+	} *
+#elif defined(_MSC_VER) && defined(_M_IA64)
+#	define UNALIGNED_PTR(T) T __unaligned *
+#else
+#	define UNALIGNED_PTR(T) T *
+#endif
+
+typedef UNALIGNED_PTR(uint32_t) ua_ui32_ptr;
+
+
 //defining available c++11 features
 
 //initialization lists - only gcc-4.4 or later

+ 4 - 4
VCMI_VS10.sln

@@ -80,16 +80,16 @@ Global
 		{8F202F43-106D-4F63-AD9D-B1D43E803E8C}.RD|x64.Build.0 = RD|x64
 		{276C3DB0-7A6B-4417-8E5C-322B08633AAC}.Debug|Win32.ActiveCfg = Debug|Win32
 		{276C3DB0-7A6B-4417-8E5C-322B08633AAC}.Debug|Win32.Build.0 = Debug|Win32
-		{276C3DB0-7A6B-4417-8E5C-322B08633AAC}.Debug|x64.ActiveCfg = Debug|Win32
+		{276C3DB0-7A6B-4417-8E5C-322B08633AAC}.Debug|x64.ActiveCfg = Debug|x64
 		{276C3DB0-7A6B-4417-8E5C-322B08633AAC}.RD|Win32.ActiveCfg = RD|Win32
 		{276C3DB0-7A6B-4417-8E5C-322B08633AAC}.RD|Win32.Build.0 = RD|Win32
-		{276C3DB0-7A6B-4417-8E5C-322B08633AAC}.RD|x64.ActiveCfg = RD|Win32
+		{276C3DB0-7A6B-4417-8E5C-322B08633AAC}.RD|x64.ActiveCfg = RD|x64
 		{D15B34EC-A32C-4968-9B0B-66998B579364}.Debug|Win32.ActiveCfg = Debug|Win32
 		{D15B34EC-A32C-4968-9B0B-66998B579364}.Debug|Win32.Build.0 = Debug|Win32
-		{D15B34EC-A32C-4968-9B0B-66998B579364}.Debug|x64.ActiveCfg = Debug|Win32
+		{D15B34EC-A32C-4968-9B0B-66998B579364}.Debug|x64.ActiveCfg = Debug|x64
 		{D15B34EC-A32C-4968-9B0B-66998B579364}.RD|Win32.ActiveCfg = RD|Win32
 		{D15B34EC-A32C-4968-9B0B-66998B579364}.RD|Win32.Build.0 = RD|Win32
-		{D15B34EC-A32C-4968-9B0B-66998B579364}.RD|x64.ActiveCfg = RD|Win32
+		{D15B34EC-A32C-4968-9B0B-66998B579364}.RD|x64.ActiveCfg = RD|x64
 		{C0300513-E845-43B4-9A4F-E8817EAEF57C}.Debug|Win32.ActiveCfg = Debug|Win32
 		{C0300513-E845-43B4-9A4F-E8817EAEF57C}.Debug|Win32.Build.0 = Debug|Win32
 		{C0300513-E845-43B4-9A4F-E8817EAEF57C}.Debug|x64.ActiveCfg = Debug|x64

+ 9 - 9
client/AdventureMapClasses.cpp

@@ -572,9 +572,9 @@ void CMinimap::mouseMoved(const SDL_MouseMotionEvent & sEvent)
 		moveAdvMapSelection();
 }
 
-void CMinimap::showAll(SDL_Surface * to)
+void CMinimap::showAll()
 {
-	CIntObject::showAll(to);
+	CIntObject::showAll();
 	if (minimap)
 	{
 		int3 mapSizes = LOCPLINT->cb->getMapSize();
@@ -589,10 +589,10 @@ void CMinimap::showAll(SDL_Surface * to)
 			ui16(adventureInt->terrain.tilesh * pos.h / mapSizes.y)
 		};
 
-		SDL_GetClipRect(to, &oldClip);
-		SDL_SetClipRect(to, &pos);
-		CSDL_Ext::drawDashedBorder(to, radar, int3(255,75,125));
-		SDL_SetClipRect(to, &oldClip);
+		//* SDL_GetClipRect(to, &oldClip);
+		//* SDL_SetClipRect(to, &pos);
+		//* CSDL_Ext::drawDashedBorder(to, radar, int3(255,75,125));
+		//* SDL_SetClipRect(to, &oldClip);
 	}
 }
 
@@ -648,11 +648,11 @@ CInfoBar::CVisibleInfo::CVisibleInfo(Point position):
 
 }
 
-void CInfoBar::CVisibleInfo::show(SDL_Surface *to)
+void CInfoBar::CVisibleInfo::show()
 {
-	CIntObject::show(to);
+	CIntObject::show();
 	BOOST_FOREACH(auto object, forceRefresh)
-		object->showAll(to);
+		object->showAll();
 }
 
 void CInfoBar::CVisibleInfo::loadHero(const CGHeroInstance * hero)

+ 4 - 4
client/AdventureMapClasses.h

@@ -214,8 +214,8 @@ protected:
 
 	void clickLeft(tribool down, bool previousState);
 	void clickRight(tribool down, bool previousState);
-	void hover (bool on);
-	void mouseMoved (const SDL_MouseMotionEvent & sEvent);
+	void hover(bool on);
+	void mouseMoved(const SDL_MouseMotionEvent & sEvent);
 
 	void moveAdvMapSelection();
 
@@ -231,7 +231,7 @@ public:
 	void setLevel(int level);
 	void setAIRadar(bool on);
 
-	void showAll(SDL_Surface * to);
+	void showAll();
 
 	void hideTile(const int3 &pos); //puts FoW
 	void showTile(const int3 &pos); //removes FoW
@@ -255,7 +255,7 @@ class CInfoBar : public CIntObject
 	public:
 		CVisibleInfo(Point position);
 
-		void show(SDL_Surface *to);
+		void show();
 
 		//functions that must be called only once
 		void loadHero(const CGHeroInstance * hero);

+ 38 - 38
client/CAdvmapInterface.cpp

@@ -252,24 +252,24 @@ void CTerrainRect::showPath(const SDL_Rect * extRect, SDL_Surface * to)
 	} //for (int i=0;i<currentPath->nodes.size()-1;i++)
 }
 
-void CTerrainRect::show(SDL_Surface * to)
+void CTerrainRect::show()
 {
 	if(ADVOPT.smoothMove)
 		CGI->mh->terrainRect
 			(adventureInt->position, adventureInt->anim,
 			 &LOCPLINT->cb->getVisibilityMap(), true, adventureInt->heroAnim,
-			 to, &pos, moveX, moveY, false, int3());
+			 nullptr, &pos, moveX, moveY, false, int3());
 	else
 		CGI->mh->terrainRect
 			(adventureInt->position, adventureInt->anim,
 			 &LOCPLINT->cb->getVisibilityMap(), true, adventureInt->heroAnim,
-			 to, &pos, 0, 0, false, int3());
+			 nullptr, &pos, 0, 0, false, int3());
 
 	//SDL_BlitSurface(teren,&genRect(pos.h,pos.w,0,0),screen,&genRect(547,594,7,6));
 	//SDL_FreeSurface(teren);
 	if (currentPath/* && adventureInt->position.z==currentPath->startPos().z*/) //drawing path
 	{
-		showPath(&pos, to);
+		//* showPath(&pos, to);
 	}
 }
 
@@ -350,14 +350,14 @@ void CResDataBar::draw(SDL_Surface * to)
 	graphics->fonts[FONT_SMALL]->renderTextLeft(to, processStr(datetext,temp), Colors::WHITE, Point(txtpos[7].first,txtpos[7].second));
 }
 
-void CResDataBar::show(SDL_Surface * to)
+void CResDataBar::show()
 {
 
 }
 
-void CResDataBar::showAll(SDL_Surface * to)
+void CResDataBar::showAll()
 {
-	draw(to);
+	draw(nullptr);
 }
 
 CAdvMapInt::CAdvMapInt():
@@ -445,13 +445,13 @@ void CAdvMapInt::fswitchLevel()
 	{
 		position.z--;
 		underground.setIndex(0,true);
-		underground.showAll(screenBuf);
+		underground.showAll();
 	}
 	else
 	{
 		underground.setIndex(1,true);
 		position.z++;
-		underground.showAll(screenBuf);
+		underground.showAll();
 	}
 	updateScreen = true;
 	minimap.setLevel(position.z);
@@ -652,36 +652,36 @@ void CAdvMapInt::deactivate()
 		LOCPLINT->cingconsole->deactivate();
 	}
 }
-void CAdvMapInt::showAll(SDL_Surface * to)
+void CAdvMapInt::showAll()
 {
-	blitAt(bg,0,0,to);
+	//* blitAt(bg,0,0,to);
 
 	if(state != INGAME)
 		return;
 
-	kingOverview.showAll(to);
-	underground.showAll(to);
-	questlog.showAll(to);
-	sleepWake.showAll(to);
-	moveHero.showAll(to);
-	spellbook.showAll(to);
-	advOptions.showAll(to);
-	sysOptions.showAll(to);
-	nextHero.showAll(to);
-	endTurn.showAll(to);
-
-	minimap.showAll(to);
-	heroList.showAll(to);
-	townList.showAll(to);
+	kingOverview.showAll();
+	underground.showAll();
+	questlog.showAll();
+	sleepWake.showAll();
+	moveHero.showAll();
+	spellbook.showAll();
+	advOptions.showAll();
+	sysOptions.showAll();
+	nextHero.showAll();
+	endTurn.showAll();
+
+	minimap.showAll();
+	heroList.showAll();
+	townList.showAll();
 	updateScreen = true;
-	show(to);
+	show();
 
-	resdatabar.draw(to);
+	//* resdatabar.draw(to);
 
-	statusbar.show(to);
+	statusbar.show();
 
-	infoBar.showAll(to);
-	LOCPLINT->cingconsole->showAll(to);
+	infoBar.showAll();
+	LOCPLINT->cingconsole->showAll();
 }
 
 bool CAdvMapInt::isHeroSleeping(const CGHeroInstance *hero)
@@ -701,7 +701,7 @@ void CAdvMapInt::setHeroSleeping(const CGHeroInstance *hero, bool sleep)
 	updateNextHero(NULL);
 }
 
-void CAdvMapInt::show(SDL_Surface * to)
+void CAdvMapInt::show()
 {
 	if(state != INGAME)
 		return;
@@ -746,14 +746,14 @@ void CAdvMapInt::show(SDL_Surface * to)
 	}
 	if(updateScreen)
 	{
-		terrain.show(to);
-		for(int i=0;i<4;i++)
-			blitAt(gems[i]->ourImages[LOCPLINT->playerID.getNum()].bitmap,ADVOPT.gemX[i],ADVOPT.gemY[i],to);
+		terrain.show();
+//*		for(int i=0;i<4;i++)
+//*			blitAt(gems[i]->ourImages[LOCPLINT->playerID.getNum()].bitmap,ADVOPT.gemX[i],ADVOPT.gemY[i],to);
 		updateScreen=false;
-		LOCPLINT->cingconsole->showAll(to);
+		LOCPLINT->cingconsole->showAll();
 	}
-	infoBar.show(to);
-	statusbar.showAll(to);
+	infoBar.show();
+	statusbar.showAll();
 }
 
 void CAdvMapInt::selectionChanged()
@@ -1490,7 +1490,7 @@ void CAdvMapInt::aiTurnStarted()
 	CCS->musich->playMusicFromSet("enemy-turn", true);
 	adventureInt->minimap.setAIRadar(true);
 	adventureInt->infoBar.startEnemyTurn(LOCPLINT->cb->getCurrentPlayer());
-	adventureInt->infoBar.showAll(screen);//force refresh on inactive object
+	adventureInt->infoBar.showAll(); //force refresh on inactive object
 }
 
 void CAdvMapInt::adjustActiveness(bool aiTurnStart)

+ 5 - 5
client/CAdvmapInterface.h

@@ -55,7 +55,7 @@ public:
 	void clickRight(tribool down, bool previousState);
 	void hover(bool on);
 	void mouseMoved (const SDL_MouseMotionEvent & sEvent);
-	void show(SDL_Surface * to);
+	void show();
 	void showPath(const SDL_Rect * extRect, SDL_Surface * to);
 	int3 whichTileIsIt(const int & x, const int & y); //x,y are cursor position
 	int3 whichTileIsIt(); //uses current cursor pos
@@ -76,8 +76,8 @@ public:
 	~CResDataBar();
 
 	void draw(SDL_Surface * to);
-	void show(SDL_Surface * to);
-	void showAll(SDL_Surface * to);
+	void show();
+	void showAll();
 };
 
 /// That's a huge class which handles general adventure map actions and 
@@ -147,8 +147,8 @@ public:
 	void activate();
 	void deactivate();
 
-	void show(SDL_Surface * to); //redraws terrain
-	void showAll(SDL_Surface * to); //shows and activates adv. map interface
+	void show(); //redraws terrain
+	void showAll(); //shows and activates adv. map interface
 
 	void select(const CArmedInstance *sel, bool centerView = true);
 	void selectionChanged();

+ 11 - 10
client/CAnimation.cpp

@@ -1218,9 +1218,9 @@ CAnimImage::~CAnimImage()
 	delete anim;
 }
 
-void CAnimImage::showAll(SDL_Surface * to)
+void CAnimImage::showAll()
 {
-	IImage *img;
+/*	IImage *img;
 
 	if ( flags & CShowableAnim::BASE && frame != 0)
 		if ((img = anim->getImage(0, group)))
@@ -1228,6 +1228,7 @@ void CAnimImage::showAll(SDL_Surface * to)
 
 	if ((img = anim->getImage(frame, group)))
 		img->draw(to, pos.x, pos.y);
+*/
 }
 
 void CAnimImage::setFrame(size_t Frame, size_t Group)
@@ -1345,11 +1346,11 @@ void CShowableAnim::clipRect(int posX, int posY, int width, int height)
 	pos.h = height;
 }
 
-void CShowableAnim::show(SDL_Surface * to)
+void CShowableAnim::show()
 {
-	if ( flags & BASE && frame != first)
-		blitImage(first, group, to);
-	blitImage(frame, group, to);
+//*	if ( flags & BASE && frame != first)
+//*		blitImage(first, group, to);
+//*	blitImage(frame, group, to);
 
 	if ((flags & PLAY_ONCE) && frame + 1 == last)
 		return;
@@ -1362,11 +1363,11 @@ void CShowableAnim::show(SDL_Surface * to)
 	}
 }
 
-void CShowableAnim::showAll(SDL_Surface * to)
+void CShowableAnim::showAll()
 {
-	if ( flags & BASE && frame != first)
-		blitImage(first, group, to);
-	blitImage(frame, group, to);
+//*	if ( flags & BASE && frame != first)
+//*		blitImage(first, group, to);
+//*	blitImage(frame, group, to);
 }
 
 void CShowableAnim::blitImage(size_t frame, size_t group, SDL_Surface *to)

+ 3 - 3
client/CAnimation.h

@@ -247,7 +247,7 @@ public:
 	//makes image player-colored
 	void playerColored(PlayerColor player);
 
-	void showAll(SDL_Surface * to);
+	void showAll();
 };
 
 /// Base class for displaying animation, used as superclass for different animations
@@ -308,8 +308,8 @@ public:
 	virtual void reset();
 
 	//show current frame and increase counter
-	void show(SDL_Surface * to);
-	void showAll(SDL_Surface * to);
+	void show();
+	void showAll();
 };
 
 /// Creature-dependend animations like attacking, moving,...

+ 0 - 7
client/CBitmapHandler.h

@@ -1,7 +1,5 @@
 #pragma once
 
-
-
 struct SDL_Surface;
 
 /*
@@ -14,11 +12,6 @@ struct SDL_Surface;
  *
  */
 
-/// Struct which stands for a simple rgba palette
-struct BMPPalette
-{
-	ui8 R,G,B,F;
-};
 
 namespace BitmapHandler
 {

+ 27 - 27
client/CCastleInterface.cpp

@@ -129,7 +129,7 @@ SDL_Color multiplyColors (const SDL_Color &b, const SDL_Color &a, double f)
 	return ret;
 }
 
-void CBuildingRect::show(SDL_Surface * to)
+void CBuildingRect::show()
 {
 	const ui32 stageDelay = 16;
 
@@ -141,20 +141,20 @@ void CBuildingRect::show(SDL_Surface * to)
 	if (stateCounter < S1_TRANSP)
 	{
 		setAlpha(255*stateCounter/stageDelay);
-		CShowableAnim::show(to);
+		CShowableAnim::show();
 	}
 	else
 	{
 		setAlpha(255);
-		CShowableAnim::show(to);
+		CShowableAnim::show();
 	}
 
 	if (border && stateCounter > S1_TRANSP)
 	{
 		if (stateCounter == BUILDED)
 		{
-			if (parent->selectedBuilding == this)
-				blitAtLoc(border,0,0,to);
+		//*	if (parent->selectedBuilding == this)
+		//*		blitAtLoc(border,0,0,to);
 			return;
 		}
 		// key colors in glowing border
@@ -175,7 +175,7 @@ void CBuildingRect::show(SDL_Surface * to)
 			newColor = oldColor;
 
 		SDL_SetColors(border, &newColor, colorID, 1);
-		blitAtLoc(border,0,0,to);
+	//*	blitAtLoc(border,0,0,to);
 		SDL_SetColors(border, &oldColor, colorID, 1);
 
 	}
@@ -183,14 +183,14 @@ void CBuildingRect::show(SDL_Surface * to)
 		stateCounter++;
 }
 
-void CBuildingRect::showAll(SDL_Surface * to)
+void CBuildingRect::showAll()
 {
 	if (stateCounter == 0)
 		return;
 
-	CShowableAnim::showAll(to);
-	if(!active && parent->selectedBuilding == this && border)
-		blitAtLoc(border,0,0,to);
+	CShowableAnim::showAll();
+//*	if(!active && parent->selectedBuilding == this && border)
+//*		blitAtLoc(border,0,0,to);
 }
 
 std::string getBuildingSubtitle(const CStructure * structure)//hover text for building
@@ -370,7 +370,7 @@ void CHeroGSlot::clickLeft(tribool down, bool previousState)
 		{
 			setHighlight(true);
 			owner->garr->selectSlot(nullptr);
-			showAll(screen2);
+			showAll();
 		}
 		hover(false);hover(true); //refresh statusbar
 	}
@@ -545,18 +545,18 @@ void CCastleBuildings::removeBuilding(BuildingID building)
 	recreate();
 }
 
-void CCastleBuildings::show(SDL_Surface * to)
+void CCastleBuildings::show()
 {
-	CIntObject::show(to);
+	CIntObject::show();
 	BOOST_FOREACH(CBuildingRect * str, buildings)
-		str->show(to);
+		str->show();
 }
 
-void CCastleBuildings::showAll(SDL_Surface * to)
+void CCastleBuildings::showAll()
 {
-	CIntObject::showAll(to);
+	CIntObject::showAll();
 	BOOST_FOREACH(CBuildingRect * str, buildings)
-		str->showAll(to);
+		str->showAll();
 }
 
 const CGHeroInstance* CCastleBuildings::getHero()
@@ -749,9 +749,9 @@ void CCastleBuildings::enterCastleGate()
 			availableTowns.push_back(t->id.getNum());//add to the list
 		}
 	}
-	CPicture *titlePic = new CPicture (LOCPLINT->castleInt->bicons->ourImages[BuildingID::CASTLE_GATE].bitmap, 0,0, false);//will be deleted by selection window
-	GH.pushInt (new CObjectListWindow(availableTowns, titlePic, CGI->generaltexth->jktexts[40],
-	    CGI->generaltexth->jktexts[41], boost::bind (&CCastleInterface::castleTeleport, LOCPLINT->castleInt, _1)));
+//*	CPicture *titlePic = new CPicture (LOCPLINT->castleInt->bicons->ourImages[BuildingID::CASTLE_GATE].bitmap, 0,0, false);//will be deleted by selection window
+//*	GH.pushInt (new CObjectListWindow(availableTowns, titlePic, CGI->generaltexth->jktexts[40],
+//*	    CGI->generaltexth->jktexts[41], boost::bind (&CCastleInterface::castleTeleport, LOCPLINT->castleInt, _1)));
 }
 
 void CCastleBuildings::enterDwelling(int level)
@@ -858,7 +858,7 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, const CGTownInst
 	center();
 	updateShadow();
 
-	garr = new CGarrisonInt(305, 387, 4, Point(0,96), panel->bg, Point(62,374), town->getUpperArmy(), town->visitingHero);
+	garr = new CGarrisonInt(305, 387, 4, Point(0,96), NULL /*panel->bg*/, Point(62,374), town->getUpperArmy(), town->visitingHero);
 	heroes = new HeroSlots(town, Point(241, 387), Point(241, 483), garr, true);
 	title = new CLabel(85, 387, FONT_MEDIUM, TOPLEFT, Colors::WHITE, town->name);
 	income = new CLabel(195, 443, FONT_SMALL, CENTER);
@@ -873,7 +873,7 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, const CGTownInst
 	garr->addSplitBtn(split);
 
 	Rect barRect(9, 182, 732, 18);
-	statusbar = new CGStatusBar(new CPicture(*panel, barRect, 9, 555, false));
+	statusbar = new CGStatusBar(new CPicture(panel->getImage(), barRect, 9, 555, false));
 	resdatabar = new CResDataBar("ZRESBAR", 3, 575, 32, 2, 85, 85);
 
 	townlist = new CTownList(3, Point(744, 414), "IAM014", "IAM015");
@@ -1283,7 +1283,7 @@ CHallInterface::CHallInterface(const CGTownInstance *Town):
 	resdatabar->pos.x += pos.x;
 	resdatabar->pos.y += pos.y;
 	Rect barRect(5, 556, 740, 18);
-	statusBar = new CGStatusBar(new CPicture(*background, barRect, 5, 556, false));
+	statusBar = new CGStatusBar(new CPicture(background->getImage(), barRect, 5, 556, false));
 
 	title = new CLabel(399, 12, FONT_MEDIUM, CENTER, Colors::WHITE, town->town->buildings[BuildingID(town->hallLevel()+BuildingID::VILLAGE_HALL)]->Name());
 	exit = new CAdventureMapButton(CGI->generaltexth->hcommands[8], "", 
@@ -1357,7 +1357,7 @@ CBuildWindow::CBuildWindow(const CGTownInstance *Town, const CBuilding * Buildin
 	OBJ_CONSTRUCTION_CAPTURING_ALL;
 
 	new CAnimImage(town->town->clientInfo.buildingsIcons, building->bid, 0, 125, 50);
-	new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+	new CGStatusBar(new CPicture(background->getImage(), Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 
 	new CLabel(197, 30, FONT_MEDIUM, CENTER, Colors::WHITE,
 	            boost::str(boost::format(CGI->generaltexth->hcommands[7]) % building->Name()));
@@ -1450,7 +1450,7 @@ CFortScreen::CFortScreen(const CGTownInstance * town):
 	resdatabar->pos.y += pos.y;
 
 	Rect barRect(4, 554, 740, 18);
-	statusBar = new CGStatusBar(new CPicture(*background, barRect, 4, 554, false));
+	statusBar = new CGStatusBar(new CPicture(background->getImage(), barRect, 4, 554, false));
 }
 
 void CFortScreen::creaturesChanged()
@@ -1595,7 +1595,7 @@ CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner):
 	resdatabar->pos.x += pos.x;
 	resdatabar->pos.y += pos.y;
 	Rect barRect(7, 556, 737, 18);
-	statusBar = new CGStatusBar(new CPicture(*background, barRect, 7, 556, false));
+//*	statusBar = new CGStatusBar(new CPicture(*background, barRect, 7, 556, false));
 	
 	exit = new CAdventureMapButton(CGI->generaltexth->allTexts[593],"",boost::bind(&CMageGuildScreen::close,this), 748, 556,"TPMAGE1.DEF",SDLK_RETURN);
 	exit->assignedKeys.insert(SDLK_ESCAPE);
@@ -1658,7 +1658,7 @@ CBlacksmithDialog::CBlacksmithDialog(bool possible, CreatureID creMachineID, Art
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL;
 
-	statusBar = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+//*	statusBar = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 	
 	animBG = new CPicture("TPSMITBK", 64, 50);
 	animBG->needRefresh = true;

+ 4 - 4
client/CCastleInterface.h

@@ -52,8 +52,8 @@ public:
 	void clickLeft(tribool down, bool previousState);
 	void clickRight(tribool down, bool previousState);
 	void mouseMoved (const SDL_MouseMotionEvent & sEvent);
-	void show(SDL_Surface * to);
-	void showAll(SDL_Surface * to);
+	void show();
+	void showAll();
 };
 
 /// Dwelling info box - right-click screen for dwellings
@@ -146,8 +146,8 @@ public:
 	void addBuilding(BuildingID building);
 	void removeBuilding(BuildingID building);//FIXME: not tested!!!
 	
-	void show(SDL_Surface * to);
-	void showAll(SDL_Surface * to);
+	void show();
+	void showAll();
 };
 
 /// Creature info window

+ 23 - 23
client/CCreatureWindow.cpp

@@ -443,7 +443,7 @@ void CCreatureWindow::init(const CStackInstance *Stack, const CBonusSystemNode *
 	else //slider automatically places bonus Items
 		recreateSkillList (0);
 
-	showAll(screen2);
+	showAll();
 
 	//AUIDAT.DEF
 }
@@ -505,11 +505,11 @@ void CCreatureWindow::recreateSkillList(int Pos)
 	}
 }
 
-void CCreatureWindow::showAll(SDL_Surface * to)
+void CCreatureWindow::showAll()
 {
-	CIntObject::showAll(to);
+	CIntObject::showAll();
 
-	printAtMiddleLoc((type >= COMMANDER ? c->nameSing : c->namePl), 180, 30, FONT_SMALL, Colors::YELLOW, to); //creature name
+//*	printAtMiddleLoc((type >= COMMANDER ? c->nameSing : c->namePl), 180, 30, FONT_SMALL, Colors::YELLOW, to); //creature name
 
 	printLine(0, CGI->generaltexth->primarySkillNames[0], c->valOfBonuses(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK), stackNode->Attack());
 	printLine(1, CGI->generaltexth->primarySkillNames[1], c->valOfBonuses(Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE), stackNode->Defense());
@@ -523,13 +523,13 @@ void CCreatureWindow::showAll(SDL_Surface * to)
 	}
 	if (stackNode->valOfBonuses(Bonus::CASTS))
 	{
-		printAtMiddleLoc(CGI->generaltexth->allTexts[399], 356, 62, FONT_SMALL, Colors::WHITE, to);
+//*		printAtMiddleLoc(CGI->generaltexth->allTexts[399], 356, 62, FONT_SMALL, Colors::WHITE, to);
 		std::string casts;
 		if (type == BATTLE)
 			casts = boost::lexical_cast<std::string>((ui16)dynamic_cast<const CStack*>(stackNode)->casts); //ui8 is converted to char :(
 		else
 			casts = boost::lexical_cast<std::string>(stackNode->valOfBonuses(Bonus::CASTS));
-		printAtMiddleLoc(casts, 356, 82, FONT_SMALL, Colors::WHITE, to);
+//*		printAtMiddleLoc(casts, 356, 82, FONT_SMALL, Colors::WHITE, to);
 	}
 
 	//TODO
@@ -542,29 +542,29 @@ void CCreatureWindow::showAll(SDL_Surface * to)
 	printLine(6, CGI->generaltexth->zelp[441].first, c->valOfBonuses(Bonus::STACKS_SPEED), stackNode->valOfBonuses(Bonus::STACKS_SPEED));
 
 	BOOST_FOREACH(CBonusItem* b, bonusItems)
-		b->showAll (to);
+		b->showAll();
 
 	BOOST_FOREACH(auto s, selectableSkills)
-		s->showAll (to);
+		s->showAll();
 
 	for (int i = 0; i < skillPictures.size(); i++)
 	{
-		skillPictures[i]->bg = BitmapHandler::loadBitmap (skillToFile(i));
-		skillPictures[i]->showAll (to);
+//*		skillPictures[i]->bg = BitmapHandler::loadBitmap (skillToFile(i));
+//*		skillPictures[i]->showAll (to);
 	}
 
 	if (upgradeOptions.size() && (type == COMMANDER_LEVEL_UP && upgradeOptions[selectedOption] >= 100)) //add frame to selected skill
 	{
 		int index = selectedOption - selectableSkills.size(); //this is screwed
-		CSDL_Ext::drawBorder(to, Rect::around(selectableBonuses[index]->pos), int3(Colors::METALLIC_GOLD.r, Colors::METALLIC_GOLD.g, Colors::METALLIC_GOLD.b)); 
+//*		CSDL_Ext::drawBorder(to, Rect::around(selectableBonuses[index]->pos), int3(Colors::METALLIC_GOLD.r, Colors::METALLIC_GOLD.g, Colors::METALLIC_GOLD.b)); 
 	}
 }
 
-void CCreatureWindow::show(SDL_Surface * to)
+void CCreatureWindow::show()
 {
-	CIntObject::show(to);
-	if (!count.empty()) //army stack
-		graphics->fonts[FONT_TIMES]->renderTextRight(to, count, Colors::WHITE, Point(pos.x + 114, pos.y + 174));
+	CIntObject::show();
+//*	if (!count.empty()) //army stack
+//*		graphics->fonts[FONT_TIMES]->renderTextRight(to, count, Colors::WHITE, Point(pos.x + 114, pos.y + 174));
 }
 
 
@@ -709,14 +709,14 @@ CBonusItem::CBonusItem(const Rect &Pos, const std::string &Name, const std::stri
 	removeUsedEvents(ALL); //no actions atm
 }
 
-void CBonusItem::showAll (SDL_Surface * to)
+void CBonusItem::showAll()
 {
 	if (visible)
 	{
-		graphics->fonts[FONT_SMALL]->renderTextLeft(to, name, Colors::YELLOW, Point(pos.x + 72, pos.y + 6));
-		graphics->fonts[FONT_SMALL]->renderTextLeft(to, description, Colors::WHITE,  Point(pos.x + 72, pos.y + 30));
-		if (bonusGraphics && bonusGraphics->bg)
-			blitAtLoc(bonusGraphics->bg, 12, 2, to);
+//*		graphics->fonts[FONT_SMALL]->renderTextLeft(to, name, Colors::YELLOW, Point(pos.x + 72, pos.y + 6));
+//*		graphics->fonts[FONT_SMALL]->renderTextLeft(to, description, Colors::WHITE,  Point(pos.x + 72, pos.y + 30));
+//*		if (bonusGraphics && bonusGraphics->bg)
+//*			blitAtLoc(bonusGraphics->bg, 12, 2, to);
 	}
 }
 
@@ -731,10 +731,10 @@ void CSelectableSkill::clickLeft(tribool down, bool previousState)
 		callback();
 }
 
-void CCreInfoWindow::show(SDL_Surface * to)
+void CCreInfoWindow::show()
 {
-	CIntObject::show(to);
-	creatureCount->showAll(to);
+	CIntObject::show();
+	creatureCount->showAll();
 }
 
 CCreInfoWindow::CCreInfoWindow(const CStackInstance &stack, bool LClicked, boost::function<void()> upgradeFunc, boost::function<void()> dismissFunc, UpgradeInfo *upgradeInfo):

+ 5 - 5
client/CCreatureWindow.h

@@ -94,8 +94,8 @@ public:
 	CCreatureWindow(CreatureID Cid, CreWinType Type, int creatureCount); //c-tor
 
 	void init(const CStackInstance *stack, const CBonusSystemNode *stackNode, const CGHeroInstance *heroOwner);
-	void showAll(SDL_Surface * to);
-	void show(SDL_Surface * to);
+	void showAll();
+	void show();
 	void printLine(int nr, const std::string &text, int baseVal, int val=-1, bool range=false);
 	void sliderMoved(int newpos);
 	void close();
@@ -117,8 +117,8 @@ public:
 	CBonusItem(const Rect &Pos, const std::string &Name, const std::string &Description, const std::string &graphicsName);
 	~CBonusItem();
 
-	void setBonus (const Bonus &bonus);
-	void showAll (SDL_Surface * to);
+	void setBonus(const Bonus &bonus);
+	void showAll();
 };
 
 class CSelectableSkill : public LRClickableAreaWText
@@ -155,7 +155,7 @@ public:
 	void init(const CCreature * cre, const CBonusSystemNode * stackNode, const CGHeroInstance * heroOwner, int creatureCount, bool LClicked);
 	void printLine(int nr, const std::string & text, int baseVal, int val = -1, bool range = false);
 
-	void show(SDL_Surface * to);
+	void show();
 };
 
 CIntObject *createCreWindow(const CStack *s, bool lclick = false);

+ 10 - 17
client/CDefHandler.cpp

@@ -4,7 +4,6 @@
 
 #include "../lib/Filesystem/CResourceLoader.h"
 #include "../lib/VCMI_Lib.h"
-#include "CBitmapHandler.h"
 
 /*
  * CDefHandler.cpp, part of VCMI engine
@@ -52,7 +51,6 @@ CDefEssential::~CDefEssential()
 
 void CDefHandler::openFromMemory(ui8 *table, const std::string & name)
 {
-	BMPPalette palette[256];
 	SDefEntry &de = * reinterpret_cast<SDefEntry *>(table);
 	ui8 *p;
 
@@ -62,13 +60,7 @@ void CDefHandler::openFromMemory(ui8 *table, const std::string & name)
 	height = read_le_u32(&de.height);
 	ui32 totalBlocks = read_le_u32(&de.totalBlocks);
 
-	for (ui32 it=0;it<256;it++)
-	{
-		palette[it].R = de.palette[it].R;
-		palette[it].G = de.palette[it].G;
-		palette[it].B = de.palette[it].B;
-		palette[it].F = 255;
-	}
+	//CPaletteRGBA palette(de);
 
 	// The SDefEntryBlock starts just after the SDefEntry
 	p = reinterpret_cast<ui8 *>(&de);
@@ -115,7 +107,7 @@ void CDefHandler::openFromMemory(ui8 *table, const std::string & name)
 	for(ui32 i=0; i < SEntries.size(); ++i)
 	{
 		Cimage nimg;
-		nimg.bitmap = getSprite(i, table, palette);
+		nimg.bitmap = getSprite(i, table);
 		nimg.imName = SEntries[i].name;
 		nimg.groupNumber = SEntries[i].group;
 		ourImages.push_back(nimg);
@@ -128,7 +120,7 @@ void CDefHandler::expand(ui8 N,ui8 & BL, ui8 & BR)
 	BR = N & 0x1F;
 }
 
-SDL_Surface * CDefHandler::getSprite (int SIndex, const ui8 * FDef, const BMPPalette * palette) const
+SDL_Surface * CDefHandler::getSprite (int SIndex, const ui8 * FDef) const
 {
 	SDL_Surface * ret=NULL;
 
@@ -175,12 +167,12 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, const ui8 * FDef, const BMPPal
 
 	for(int i=0; i<256; ++i)
 	{
-		SDL_Color pr;
-		pr.r = palette[i].R;
-		pr.g = palette[i].G;
-		pr.b = palette[i].B;
-		pr.unused = palette[i].F;
-		(*(ret->format->palette->colors+i))=pr;
+	//	SDL_Color pr;
+	//	pr.r = palette[i].R;
+	//	pr.g = palette[i].G;
+	//	pr.b = palette[i].B;
+	//	pr.unused = palette[i].F;
+	//	(*(ret->format->palette->colors+i))=pr;
 	}
 
 	int ftcp=0;
@@ -371,6 +363,7 @@ CDefHandler * CDefHandler::giveDef(const std::string & defName)
 	delete [] data;
 	return nh;
 }
+
 CDefEssential * CDefHandler::giveDefEss(const std::string & defName)
 {
 	CDefEssential * ret;

+ 2 - 4
client/CDefHandler.h

@@ -1,9 +1,7 @@
 #pragma once
 
 #include "../lib/vcmi_endian.h"
-
 struct SDL_Surface;
-struct BMPPalette;
 
 /*
  * CDefHandler.h, part of VCMI engine
@@ -76,7 +74,7 @@ public:
 
 class CDefHandler
 {
-private:
+private:	
 	ui32 DEFType;
 	struct SEntry
 	{
@@ -94,7 +92,7 @@ public:
 
 	CDefHandler(); //c-tor
 	~CDefHandler(); //d-tor
-	SDL_Surface * getSprite (int SIndex, const ui8 * FDef, const BMPPalette * palette) const; //saves picture with given number to "testtt.bmp"
+	SDL_Surface * getSprite (int SIndex, const ui8 * FDef) const; //saves picture with given number to "testtt.bmp"
 	static void expand(ui8 N,ui8 & BL, ui8 & BR);
 	void openFromMemory(ui8 * table, const std::string & name);
 	CDefEssential * essentialize();

+ 20 - 20
client/CHeroWindow.cpp

@@ -191,7 +191,7 @@ void CHeroWindow::update(const CGHeroInstance * hero, bool redrawNeeded /*= fals
 		OBJ_CONSTRUCTION_CAPTURING_ALL;
 		if(!garr)
 		{
-			garr = new CGarrisonInt(15, 485, 8, Point(), background->bg, Point(15,485), curHero);
+			garr = new CGarrisonInt(15, 485, 8, Point(), NULL /*background->bg*/, Point(15,485), curHero);
 			split = new CAdventureMapButton(CGI->generaltexth->allTexts[256], CGI->generaltexth->heroscrn[32],
 					boost::bind(&CGarrisonInt::splitClick,garr), 539, 519, "hsbtns9.def", false, NULL, false); //deleted by garrison destructor
 			boost::algorithm::replace_first(split->hoverTexts[0],"%s",CGI->generaltexth->allTexts[43]);
@@ -319,55 +319,55 @@ void CHeroWindow::commanderWindow()
 
 }
 
-void CHeroWindow::showAll(SDL_Surface * to)
+void CHeroWindow::showAll()
 {
-	CIntObject::showAll(to);
+	CIntObject::showAll();
 	 
 	//printing hero's name
-	printAtMiddleLoc(curHero->name, 190, 38, FONT_BIG, Colors::YELLOW, to);
+//*	printAtMiddleLoc(curHero->name, 190, 38, FONT_BIG, Colors::YELLOW, to);
 	 
 	//printing hero's level
 	std::string secondLine= CGI->generaltexth->allTexts[342];
 	boost::algorithm::replace_first(secondLine,"%d",boost::lexical_cast<std::string>(curHero->level));
 	boost::algorithm::replace_first(secondLine,"%s",curHero->type->heroClass->name);
-	printAtMiddleLoc(secondLine, 190, 65, FONT_MEDIUM, Colors::WHITE, to);
+//*	printAtMiddleLoc(secondLine, 190, 65, FONT_MEDIUM, Colors::WHITE, to);
 	 	
 	//primary skills names
-	printAtMiddleLoc(CGI->generaltexth->jktexts[1], 52, 99, FONT_SMALL, Colors::YELLOW, to);
-	printAtMiddleLoc(CGI->generaltexth->jktexts[2], 123, 99, FONT_SMALL, Colors::YELLOW, to);
-	printAtMiddleLoc(CGI->generaltexth->jktexts[3], 193, 99, FONT_SMALL, Colors::YELLOW, to);
-	printAtMiddleLoc(CGI->generaltexth->jktexts[4], 262, 99, FONT_SMALL, Colors::YELLOW, to);
+//*	printAtMiddleLoc(CGI->generaltexth->jktexts[1], 52, 99, FONT_SMALL, Colors::YELLOW, to);
+//*	printAtMiddleLoc(CGI->generaltexth->jktexts[2], 123, 99, FONT_SMALL, Colors::YELLOW, to);
+//*	printAtMiddleLoc(CGI->generaltexth->jktexts[3], 193, 99, FONT_SMALL, Colors::YELLOW, to);
+//*	printAtMiddleLoc(CGI->generaltexth->jktexts[4], 262, 99, FONT_SMALL, Colors::YELLOW, to);
 	 
 	//dismiss / quest log
-	printAtMiddleWBLoc(CGI->generaltexth->jktexts[8], 388, 455, FONT_SMALL, 50, Colors::WHITE, to);
-	printAtMiddleWBLoc(CGI->generaltexth->jktexts[9], 534, 455, FONT_SMALL, 50, Colors::WHITE, to);
+//*	printAtMiddleWBLoc(CGI->generaltexth->jktexts[8], 388, 455, FONT_SMALL, 50, Colors::WHITE, to);
+//*	printAtMiddleWBLoc(CGI->generaltexth->jktexts[9], 534, 455, FONT_SMALL, 50, Colors::WHITE, to);
 
 	//printing primary skills' amounts
 	for(int m=0; m<4; ++m)
 	{
 	 	std::ostringstream primarySkill;
 	 	primarySkill << primSkillAreas[m]->bonusValue;
-	 	printAtMiddleLoc(primarySkill.str(), 53 + 70 * m, 166, FONT_SMALL, Colors::WHITE, to);
+//*	 	printAtMiddleLoc(primarySkill.str(), 53 + 70 * m, 166, FONT_SMALL, Colors::WHITE, to);
 	}
 	 
 	//secondary skills
 	for(size_t v=0; v<std::min(secSkillAreas.size(), curHero->secSkills.size()); ++v)
 	{
-	 	printAtLoc(CGI->generaltexth->levels[curHero->secSkills[v].second-1], (v%2) ? 212 : 68, 280 + 48 * (v/2), FONT_SMALL, Colors::WHITE, to);
-	 	printAtLoc(CGI->generaltexth->skillName[curHero->secSkills[v].first], (v%2) ? 212 : 68, 300 + 48 * (v/2), FONT_SMALL, Colors::WHITE, to);
+//*	 	printAtLoc(CGI->generaltexth->levels[curHero->secSkills[v].second-1], (v%2) ? 212 : 68, 280 + 48 * (v/2), FONT_SMALL, Colors::WHITE, to);
+//*	 	printAtLoc(CGI->generaltexth->skillName[curHero->secSkills[v].first], (v%2) ? 212 : 68, 300 + 48 * (v/2), FONT_SMALL, Colors::WHITE, to);
 	}
 	 
 	//printing special ability
-	printAtLoc(CGI->generaltexth->jktexts[5].substr(1, CGI->generaltexth->jktexts[5].size()-2), 69, 183, FONT_SMALL, Colors::YELLOW, to);
-	printAtLoc(curHero->type->specName, 69, 205, FONT_SMALL, Colors::WHITE, to);
+//*	printAtLoc(CGI->generaltexth->jktexts[5].substr(1, CGI->generaltexth->jktexts[5].size()-2), 69, 183, FONT_SMALL, Colors::YELLOW, to);
+//*	printAtLoc(curHero->type->specName, 69, 205, FONT_SMALL, Colors::WHITE, to);
 	 
 	//printing necessery texts
-	printAtLoc(CGI->generaltexth->jktexts[6].substr(1, CGI->generaltexth->jktexts[6].size()-2), 69, 232, FONT_SMALL, Colors::YELLOW, to);
+//*	printAtLoc(CGI->generaltexth->jktexts[6].substr(1, CGI->generaltexth->jktexts[6].size()-2), 69, 232, FONT_SMALL, Colors::YELLOW, to);
 	std::ostringstream expstr;
 	expstr << curHero->exp;
-	printAtLoc(expstr.str(), 68, 252, FONT_SMALL, Colors::WHITE, to);
-	printAtLoc(CGI->generaltexth->jktexts[7].substr(1, CGI->generaltexth->jktexts[7].size()-2), 213, 232, FONT_SMALL, Colors::YELLOW, to);
+//*	printAtLoc(expstr.str(), 68, 252, FONT_SMALL, Colors::WHITE, to);
+//*	printAtLoc(CGI->generaltexth->jktexts[7].substr(1, CGI->generaltexth->jktexts[7].size()-2), 213, 232, FONT_SMALL, Colors::YELLOW, to);
 	std::ostringstream manastr;
 	manastr << curHero->mana << '/' << heroWArt.manaLimit();
-	printAtLoc(manastr.str(), 211, 252, FONT_SMALL, Colors::WHITE, to);
+//*	printAtLoc(manastr.str(), 211, 252, FONT_SMALL, Colors::WHITE, to);
 }

+ 1 - 1
client/CHeroWindow.h

@@ -83,7 +83,7 @@ public:
 	CHeroWindow(const CGHeroInstance *hero); //c-tor
 
 	void update(const CGHeroInstance * hero, bool redrawNeeded = false); //sets main displayed hero
-	void showAll(SDL_Surface * to);
+	void showAll();
 
 	void dismissCurrent(); //dissmissed currently displayed hero (curHero)
 	void questlog(); //show quest log in hero window

+ 30 - 95
client/CMT.cpp

@@ -3,6 +3,7 @@
 #include "StdInc.h"
 #include <boost/filesystem/operations.hpp>
 #include <SDL_mixer.h>
+#include "UIFramework/GL2D.h"
 #include "UIFramework/SDL_Extensions.h"
 #include "CGameInfo.h"
 #include "mapHandler.h"
@@ -40,17 +41,15 @@
 #include "../lib/GameConstants.h"
 #include "UIFramework/CGuiHandler.h"
 
-#ifdef _WIN32
-#include "SDL_syswm.h"
-#endif
 #include "../lib/CDefObjInfoHandler.h"
 #include "../lib/UnlockGuard.h"
 
-#if __MINGW32__
+#if __MINGW32__ || defined(_WIN32)
 #undef main
 #endif
 
 namespace po = boost::program_options;
+namespace fs = boost::filesystem;
 
 /*
  * CMT.cpp, part of VCMI engine
@@ -62,8 +61,7 @@ namespace po = boost::program_options;
  *
  */
 
-std::string NAME_AFFIX = "client";
-std::string NAME = GameConstants::VCMI_VERSION + std::string(" (") + NAME_AFFIX + ')'; //application name
+std::string NAME = GameConstants::VCMI_VERSION + std::string(" (client)"); //application name
 CGuiHandler GH;
 static CClient *client=NULL;
 SDL_Surface *screen = NULL, //main screen surface
@@ -136,8 +134,7 @@ void init()
 	tlog0<<"Initializing VCMI_Lib: "<<tmh.getDiff()<<std::endl;
 
 	pomtime.getDiff();
-	CCS->curh = new CCursorHandler;
-	CCS->curh->initCursor();
+	CCS->curh = new CCursorHandler();
 	CCS->curh->show();
 	tlog0<<"Screen handler: "<<pomtime.getDiff()<<std::endl;
 	pomtime.getDiff();
@@ -177,20 +174,34 @@ static void prog_help(const po::options_description &opts)
 void OSX_checkForUpdates();
 #endif
 
+static void initScreen(int w, int h, bool fullscreen)
+{
+	SDL_EnableUNICODE(1);
+	SDL_WM_SetCaption(NAME.c_str(),""); //set window title
+
+	GL2D::initVideo(w, h, fullscreen);
+
+	SDL_ShowCursor(SDL_DISABLE);
+	SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
+}
+
+
 #ifdef _WIN32
 int _tmain(int argc, _TCHAR* argv[])
 #elif defined(__APPLE__)
 int SDL_main(int argc, char *argv[])
 #else
-int main(int argc, char** argv)
+int main(int argc, char* argv[])
 #endif
 {
+	tlog0 << "Starting... " << std::endl;
+
+#if defined(__APPLE__) || defined(_WIN32)
+	//Set working directory to parent directory of executable
+	//so we can use executable relative pathes
+	fs::current_path(fs::path(argv[0]).parent_path());
+#endif
 #ifdef __APPLE__
-	// Correct working dir executable folder (not bundle folder) so we can use executable relative pathes
-    std::string executablePath = argv[0];
-    std::string workDir = executablePath.substr(0, executablePath.rfind('/'));
-    chdir(workDir.c_str());
-    
     // Check for updates
     OSX_checkForUpdates();
 
@@ -203,7 +214,6 @@ int main(int argc, char** argv)
     fclose(check);
 #endif
     
-	tlog0 << "Starting... " << std::endl;
 	po::options_description opts("Allowed options");
 	opts.add_options()
 		("help,h", "display help and exit")
@@ -242,8 +252,8 @@ int main(int argc, char** argv)
 	}
 
 	//Set environment vars to make window centered. Sometimes work, sometimes not. :/
-	putenv((char*)"SDL_VIDEO_WINDOW_POS");
-	putenv((char*)"SDL_VIDEO_CENTERED=1");
+	putenv("SDL_VIDEO_CENTERED=center");
+	//putenv("SDL_VIDEO_WINDOW_POS");
 
 	// Have effect on X11 system only (Linux).
 	// For whatever reason in fullscreen mode SDL takes "raw" mouse input from DGA X11 extension
@@ -293,7 +303,7 @@ int main(int argc, char** argv)
 		exit(EXIT_FAILURE);
 	}
 
-	setScreenRes(res["width"].Float(), res["height"].Float(), video["bitsPerPixel"].Float(), video["fullscreen"].Bool());
+	initScreen(res["width"].Float(), res["height"].Float(), video["fullscreen"].Bool());
 
 	tlog0 <<"\tInitializing screen: "<<pomtime.getDiff() << std::endl;
 
@@ -315,8 +325,6 @@ int main(int argc, char** argv)
 	if(!vm.count("battle") && !vm.count("nointro"))
 		playIntro();
 
-	SDL_FillRect(screen,NULL,0);
-	CSDL_Ext::update(screen);
 	loading.join();
 	tlog0<<"Initialization of VCMI (together): "<<total.getDiff()<<std::endl;
 
@@ -654,9 +662,9 @@ void processCommand(const std::string &message)
 //plays intro, ends when intro is over or button has been pressed (handles events)
 void playIntro()
 {
-	if(CCS->videoh->openAndPlayVideo("3DOLOGO.SMK", 60, 40, screen, true))
+	if (CCS->videoh->openAndPlayVideo("3DOLOGO.SMK", 60, 40, true))
 	{
-		CCS->videoh->openAndPlayVideo("AZVS.SMK", 60, 80, screen, true);
+		CCS->videoh->openAndPlayVideo("AZVS.SMK", 60, 80, true);
 	}
 }
 
@@ -667,79 +675,6 @@ void dispose()
 	delete logfile;
 }
 
-//used only once during initialization
-static void setScreenRes(int w, int h, int bpp, bool fullscreen, bool resetVideo)
-{
-	// VCMI will only work with 2, 3 or 4 bytes per pixel
-	vstd::amax(bpp, 16);
-	vstd::amin(bpp, 32);
-
-	// Try to use the best screen depth for the display
-	int suggestedBpp = SDL_VideoModeOK(w, h, bpp, SDL_SWSURFACE|(fullscreen?SDL_FULLSCREEN:0));
-	if(suggestedBpp == 0)
-	{
-		tlog1 << "Error: SDL says that " << w << "x" << h << " resolution is not available!\n";
-		return;
-	}
-
-	bool bufOnScreen = (screenBuf == screen);
-	
-	if(suggestedBpp != bpp)
-	{
-		tlog2 << "Note: SDL suggests to use " << suggestedBpp << " bpp instead of"  << bpp << " bpp "  << std::endl;
-	}
-
-	//For some reason changing fullscreen via config window checkbox result in SDL_Quit event
-	if (resetVideo)
-	{
-		if(screen) //screen has been already initialized
-			SDL_QuitSubSystem(SDL_INIT_VIDEO);
-		SDL_InitSubSystem(SDL_INIT_VIDEO);
-	}
-	
-	if((screen = SDL_SetVideoMode(w, h, suggestedBpp, SDL_SWSURFACE|(fullscreen?SDL_FULLSCREEN:0))) == NULL)
-	{
-		tlog1 << "Requested screen resolution is not available (" << w << "x" << h << "x" << suggestedBpp << "bpp)\n";
-		throw std::runtime_error("Requested screen resolution is not available\n");
-	}
-
-	tlog0 << "New screen flags: " << screen->flags << std::endl;
-
-	if(screen2)
-		SDL_FreeSurface(screen2);
-	screen2 = CSDL_Ext::copySurface(screen);
-	SDL_EnableUNICODE(1);
-	SDL_WM_SetCaption(NAME.c_str(),""); //set window title
-	SDL_ShowCursor(SDL_DISABLE);
-	SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
-
-#ifdef _WIN32
-	SDL_SysWMinfo wm;
-	SDL_VERSION(&wm.version);
-	int getwm = SDL_GetWMInfo(&wm);
-	if(getwm == 1)
-	{
-		int sw = GetSystemMetrics(SM_CXSCREEN),
-			sh = GetSystemMetrics(SM_CYSCREEN);
-		RECT curpos;
-		GetWindowRect(wm.window,&curpos);
-		int ourw = curpos.right - curpos.left,
-			ourh = curpos.bottom - curpos.top;
-		SetWindowPos(wm.window, 0, (sw - ourw)/2, (sh - ourh)/2, 0, 0, SWP_NOZORDER|SWP_NOSIZE);
-	}
-	else
-	{
-		tlog3 << "Something went wrong, getwm=" << getwm << std::endl;
-		tlog3 << "SDL says: " << SDL_GetError() << std::endl;
-		tlog3 << "Window won't be centered.\n";
-	}
-#endif
-	//TODO: centering game window on other platforms (or does the environment do their job correctly there?)
-
-	screenBuf = bufOnScreen ? screen : screen2;
-	//setResolution = true;
-}
-
 static void fullScreenChanged()
 {
 	boost::unique_lock<boost::recursive_mutex> lock(*LOCPLINT->pim);

+ 21 - 20
client/CMessage.cpp

@@ -5,6 +5,7 @@
 #include "CDefHandler.h"
 #include "CAnimation.h"
 #include "CGameInfo.h"
+#include "UIFramework/GL2D.h"
 #include "UIFramework/SDL_Extensions.h"
 #include "../lib/CGeneralTextHandler.h"
 #include "Graphics.h"
@@ -46,7 +47,7 @@ public:
 	CComponent *comp;
 
 	//blit component with image centered at this position
-	void showAll(SDL_Surface * to);
+	void showAll();
 
 	//ComponentResolved(); //c-tor
 	ComponentResolved(CComponent *Comp); //c-tor
@@ -117,18 +118,18 @@ void CMessage::dispose()
 SDL_Surface * CMessage::drawDialogBox(int w, int h, PlayerColor playerColor)
 {
 	//prepare surface
-	SDL_Surface * ret = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask);
+//*	SDL_Surface * ret = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask);
 	for (int i=0; i<w; i+=background->w)//background
 	{
 		for (int j=0; j<h; j+=background->h)
 		{
 			Rect srcR(0,0,background->w, background->h);
 			Rect dstR(i,j,w,h);
-			CSDL_Ext::blitSurface(background, &srcR, ret, &dstR);
+//*			CSDL_Ext::blitSurface(background, &srcR, ret, &dstR);
 		}
 	}
-	drawBorder(playerColor, ret, w, h);
-	return ret;
+//*	drawBorder(playerColor, ret, w, h);
+	return nullptr; //* ret;
 }
 
 std::vector<std::string> CMessage::breakText( std::string text, size_t maxLineSize, EFonts font )
@@ -229,8 +230,8 @@ void CMessage::drawIWindow(CInfoWindow * ret, std::string text, PlayerColor play
 
 	for(int i = 0; 
 		i < ARRAY_COUNT(sizes) 
-			&& sizes[i][0] < screen->w - 150  
-			&& sizes[i][1] < screen->h - 150
+			&& sizes[i][0] < GL2D::getScreenWidth() - 150  
+			&& sizes[i][1] < GL2D::getScreenHeight() - 150
 			&& ret->text->slider;
 		i++)
 	{
@@ -263,20 +264,20 @@ void CMessage::drawIWindow(CInfoWindow * ret, std::string text, PlayerColor play
 	vstd::amax(winSize.first, comps.w);
 	vstd::amax(winSize.first, bw);
 
-	vstd::amin(winSize.first, screen->w - 150);
+	vstd::amin(winSize.first, GL2D::getScreenWidth() - 150);
 
-	ret->bitmap = drawDialogBox (winSize.first + 2*SIDE_MARGIN, winSize.second + 2*SIDE_MARGIN, player);
-	ret->pos.h=ret->bitmap->h;
-	ret->pos.w=ret->bitmap->w;
-	ret->center();
+//*	ret->bitmap = drawDialogBox (winSize.first + 2*SIDE_MARGIN, winSize.second + 2*SIDE_MARGIN, player);
+//*	ret->pos.h=ret->bitmap->h;
+//*	ret->pos.w=ret->bitmap->w;
+//*	ret->center();
 
 	int curh = SIDE_MARGIN;
 	int xOffset = (ret->pos.w - ret->text->pos.w)/2;
 
 	if(!ret->buttons.size() && !ret->components.size()) //improvement for very small text only popups -> center text vertically
 	{
-		if(ret->bitmap->h > ret->text->pos.h + 2*SIDE_MARGIN)
-			curh = (ret->bitmap->h - ret->text->pos.h)/2;
+//*		if(ret->bitmap->h > ret->text->pos.h + 2*SIDE_MARGIN)
+//*			curh = (ret->bitmap->h - ret->text->pos.h)/2;
 	}
 
 	ret->text->moveBy(Point(xOffset, curh));
@@ -291,8 +292,8 @@ void CMessage::drawIWindow(CInfoWindow * ret, std::string text, PlayerColor play
 	if(ret->buttons.size())
 	{
 		// Position the buttons at the bottom of the window
-		bw = (ret->bitmap->w/2) - (bw/2);
-		curh = ret->bitmap->h - SIDE_MARGIN - ret->buttons[0]->pos.h;
+//*		bw = (ret->bitmap->w/2) - (bw/2);
+//*		curh = ret->bitmap->h - SIDE_MARGIN - ret->buttons[0]->pos.h;
 
 		for(size_t i=0; i<ret->buttons.size(); i++)
 		{
@@ -395,10 +396,10 @@ ComponentResolved::~ComponentResolved()
 	}
 }
 
-void ComponentResolved::showAll(SDL_Surface *to)
+void ComponentResolved::showAll()
 {
-	CIntObject::showAll(to);
-	comp->showAll(to);
+	CIntObject::showAll();
+	comp->showAll();
 }
 
 ComponentsToBlit::~ComponentsToBlit()
@@ -481,7 +482,7 @@ void ComponentsToBlit::blitCompsOnSur( bool blitOr, int inter, int &curh, SDL_Su
 			cur->moveTo(Point(curw, curh));
 
 			//blit component
-			cur->showAll(ret);
+			cur->showAll();
 			curw += cur->pos.w;
 
 			//if there is subsequent component blit "or"

+ 2 - 3
client/CPlayerInterface.cpp

@@ -318,8 +318,7 @@ void CPlayerInterface::heroMoved(const TryMoveHero & details)
 	{
 		movementPxStep(details, i, hp, ho);
 		adventureInt->updateScreen = true;
-		adventureInt->show(screen);
-		CSDL_Ext::update(screen);
+		adventureInt->show();
 		GH.mainFPSmng->framerateDelay(); //for animation purposes
 	} //for(int i=1; i<32; i+=4)
 	//main moving done
@@ -2185,7 +2184,7 @@ void CPlayerInterface::acceptTurn()
 	adventureInt->infoBar.showDate();
 
 	adventureInt->updateNextHero(NULL);
-	adventureInt->showAll(screen);
+	adventureInt->showAll();
 
 	if(settings["session"]["autoSkip"].Bool() && !LOCPLINT->shiftPressed())
 	{

+ 97 - 112
client/CPreGame.cpp

@@ -39,6 +39,7 @@
 #include "../lib/CThreadHelper.h"
 #include "../lib/CConfigHandler.h"
 #include "../lib/GameConstants.h"
+#include "UIFramework/GL2D.h"
 #include "UIFramework/CGuiHandler.h"
 #include "UIFramework/CIntObjectClasses.h"
 #include "../lib/Mapping/CMapService.h"
@@ -237,8 +238,8 @@ CMenuScreen::CMenuScreen(const JsonNode& configNode):
 	background = new CPicture(config["background"].String());
 	if (config["scalable"].Bool())
 	{
-		if (background->bg->format->palette)
-			background->convertToScreenBPP();
+//*		if (background->bg->format->palette)
+//*			background->convertToScreenBPP();
 		background->scaleTo(Point(screen->w, screen->h));
 	}
 
@@ -265,20 +266,20 @@ CIntObject * CMenuScreen::createTab(size_t index)
 	return new CMenuEntry(this, config["items"].Vector()[index]);
 }
 
-void CMenuScreen::showAll(SDL_Surface * to)
+void CMenuScreen::showAll()
 {
-	CIntObject::showAll(to);
+	CIntObject::showAll();
 
-	if (pos.h != to->h || pos.w != to->w)
-		CMessage::drawBorder(PlayerColor(1), to, pos.w+28, pos.h+30, pos.x-14, pos.y-15);
+	if (pos.w != GL2D::getScreenWidth() || pos.h != GL2D::getScreenHeight())
+		CMessage::drawBorder(PlayerColor(1), nullptr, pos.w+28, pos.h+30, pos.x-14, pos.y-15);
 
 }
 
-void CMenuScreen::show(SDL_Surface * to)
+void CMenuScreen::show()
 {
 	if (!config["video"].isNull())
-		CCS->videoh->update(config["video"]["x"].Float() + pos.x, config["video"]["y"].Float() + pos.y, to, true, false);
-	CIntObject::show(to);
+		CCS->videoh->update(config["video"]["x"].Float() + pos.x, config["video"]["y"].Float() + pos.y, true, false);
+	CIntObject::show();
 }
 
 void CMenuScreen::activate()
@@ -418,12 +419,12 @@ CreditsScreen::CreditsScreen()
 	credits->pos.h = credits->maxH;
 }
 
-void CreditsScreen::showAll(SDL_Surface * to)
+void CreditsScreen::showAll()
 {
 	//Do not draw anything
 }
 
-void CreditsScreen::show(SDL_Surface * to)
+void CreditsScreen::show()
 {
 	static int count = 0;
 	count++;
@@ -436,7 +437,7 @@ void CreditsScreen::show(SDL_Surface * to)
 	SDL_SetClipRect(screenBuf, &creditsArea);
 	SDL_SetClipRect(screen, &creditsArea);
 	redraw();
-	CIntObject::showAll(to);
+	CIntObject::showAll();
 	SDL_SetClipRect(screen, NULL);
 	SDL_SetClipRect(screenBuf, NULL);
 
@@ -460,8 +461,8 @@ void CreditsScreen::clickRight(tribool down, bool previousState)
 CGPreGame::CGPreGame():
 	pregameConfig(new JsonNode(ResourceID("config/mainmenu.json")))
 {
-	pos.w = screen->w;
-	pos.h = screen->h;
+	pos.w = GL2D::getScreenWidth();
+	pos.h = GL2D::getScreenHeight();
 
 	GH.defActionsDef = 63;
 	CGP = this;
@@ -502,7 +503,6 @@ void CGPreGame::disposeGraphics()
 
 void CGPreGame::update()
 {
-	boost::unique_lock<boost::recursive_mutex> lock(*CPlayerInterface::pim); 
 	if(CGP != this) //don't update if you are not a main interface
 		return;
 
@@ -513,25 +513,7 @@ void CGPreGame::update()
 		menu->switchToTab(0);
 	}
 
-	if(SEL)
-		SEL->update();
-
-	// Handles mouse and key input
-	GH.updateTime();
-	GH.handleEvents();
-
-	//if (GH.curInt == NULL) // no redraw, when a new game was created
-		//return;
-
-	GH.topInt()->show(screen);
-
-	if (settings["general"]["showfps"].Bool())
-		GH.drawFPSCounter();
-
-	// draw the mouse cursor and update the screen
-	CCS->curh->drawWithScreenRestore();
-	CSDL_Ext::update(screen);
-	CCS->curh->drawRestored();
+	if (SEL) SEL->update();
 }
 
 void CGPreGame::openCampaignScreen(std::string name)
@@ -1035,11 +1017,11 @@ void CSelectionScreen::propagateNames()
 	*serv << &pn;
 }
 
-void CSelectionScreen::showAll(SDL_Surface *to)
+void CSelectionScreen::showAll()
 {
-	CIntObject::showAll(to);
-	if (bordered && (pos.h != to->h || pos.w != to->w))
-		CMessage::drawBorder(PlayerColor(1), to, pos.w+28, pos.h+30, pos.x-14, pos.y-15);
+	CIntObject::showAll();
+//*	if (bordered && (pos.h != to->h || pos.w != to->w))
+//*		CMessage::drawBorder(PlayerColor(1), to, pos.w+28, pos.h+30, pos.x-14, pos.y-15);
 }
 
 // A new size filter (Small, Medium, ...) has been selected. Populate
@@ -1484,10 +1466,10 @@ void SelectionTab::printMaps(SDL_Surface *to)
 	}
 }
 
-void SelectionTab::showAll(SDL_Surface * to)
+void SelectionTab::showAll()
 {
-	CIntObject::showAll(to);
-	printMaps(to);
+	CIntObject::showAll();
+//*	printMaps(to);
 
 	std::string title;
 	switch(tabType) {
@@ -1505,10 +1487,10 @@ void SelectionTab::showAll(SDL_Surface * to)
 		break;
 	}
 
-	printAtMiddleLoc(title, 205, 28, FONT_MEDIUM, Colors::YELLOW, to); //Select a Scenario to Play
+//*	printAtMiddleLoc(title, 205, 28, FONT_MEDIUM, Colors::YELLOW, to); //Select a Scenario to Play
 	if(tabType != CMenuScreen::campaignList)
 	{
-		printAtMiddleLoc(CGI->generaltexth->allTexts[510], 87, 62, FONT_SMALL, Colors::YELLOW, to); //Map sizes
+//*		printAtMiddleLoc(CGI->generaltexth->allTexts[510], 87, 62, FONT_SMALL, Colors::YELLOW, to); //Map sizes
 	}
 }
 
@@ -1798,10 +1780,10 @@ void RandomMapTab::validateCompOnlyPlayersCnt(int compOnlyPlayersCnt)
 	}
 }
 
-void RandomMapTab::showAll(SDL_Surface * to)
+void RandomMapTab::showAll()
 {
-	CIntObject::showAll(to);
-
+	CIntObject::showAll();
+/*
 	// Headline
 	printAtMiddleLoc(CGI->generaltexth->allTexts[738], 222, 36, FONT_BIG, Colors::YELLOW, to);
 	printAtMiddleLoc(CGI->generaltexth->allTexts[739], 222, 56, FONT_SMALL, Colors::WHITE, to);
@@ -1826,6 +1808,7 @@ void RandomMapTab::showAll(SDL_Surface * to)
 
 	// Monster strength
 	printAtLoc(CGI->generaltexth->allTexts[758], 68, 465, FONT_SMALL, Colors::WHITE, to);
+*/
 }
 
 void RandomMapTab::updateMapInfo()
@@ -1926,7 +1909,7 @@ InfoCard::InfoCard( bool Network )
 	if(SEL->screenType == CMenuScreen::campaignList)
 	{
 		CSelectionScreen *ss = static_cast<CSelectionScreen*>(parent);
-		mapDescription->addChild(new CPicture(*ss->bg, descriptionRect + Point(-393, 0)), true); //move subpicture bg to our description control (by default it's our (Infocard) child)
+		mapDescription->addChild(new CPicture(ss->bg->getImage(), descriptionRect + Point(-393, 0)), true); //move subpicture bg to our description control (by default it's our (Infocard) child)
 	}
 	else
 	{
@@ -1953,13 +1936,13 @@ InfoCard::InfoCard( bool Network )
 			difficulty->block(true);
 
 		//description needs bg
-		mapDescription->addChild(new CPicture(*bg, descriptionRect), true); //move subpicture bg to our description control (by default it's our (Infocard) child)
+		mapDescription->addChild(new CPicture(bg->getImage(), descriptionRect), true); //move subpicture bg to our description control (by default it's our (Infocard) child)
 
 		if(network)
 		{
 			playerListBg = new CPicture("CHATPLUG.bmp", 16, 276);
 			chat = new CChatBox(descriptionRect);
-			chat->chatHistory->addChild(new CPicture(*bg, chat->chatHistory->pos - pos), true); //move subpicture bg to our description control (by default it's our (Infocard) child)
+			chat->chatHistory->addChild(new CPicture(bg->getImage(), chat->chatHistory->pos - pos), true); //move subpicture bg to our description control (by default it's our (Infocard) child)
 
 			chatOn = true;
 			mapDescription->disable();
@@ -1974,14 +1957,14 @@ InfoCard::~InfoCard()
 	delete sFlags;
 }
 
-void InfoCard::showAll(SDL_Surface * to)
+void InfoCard::showAll()
 {
-	CIntObject::showAll(to);
+	CIntObject::showAll();
 
 	//blit texts
 	if(SEL->screenType != CMenuScreen::campaignList)
 	{
-		printAtLoc(CGI->generaltexth->allTexts[390] + ":", 24, 400, FONT_SMALL, Colors::WHITE, to); //Allies
+/*		printAtLoc(CGI->generaltexth->allTexts[390] + ":", 24, 400, FONT_SMALL, Colors::WHITE, to); //Allies
 		printAtLoc(CGI->generaltexth->allTexts[391] + ":", 190, 400, FONT_SMALL, Colors::WHITE, to); //Enemies
 		printAtLoc(CGI->generaltexth->allTexts[494], 33, 430, FONT_SMALL, Colors::YELLOW, to);//"Map Diff:"
 		printAtLoc(CGI->generaltexth->allTexts[492] + ":", 133,430, FONT_SMALL, Colors::YELLOW, to); //player difficulty
@@ -2013,6 +1996,7 @@ void InfoCard::showAll(SDL_Surface * to)
 			}
 
 		}
+	*/
 	}
 
 	if(SEL->current)
@@ -2028,27 +2012,27 @@ void InfoCard::showAll(SDL_Surface * to)
 				if (temp>20) temp=0;
 				std::string sss = CGI->generaltexth->victoryConditions[temp];
 				if (temp && SEL->current->mapHeader->victoryCondition.allowNormalVictory) sss+= "/" + CGI->generaltexth->victoryConditions[0];
-				printAtLoc(sss, 60, 307, FONT_SMALL, Colors::WHITE, to);
+//*				printAtLoc(sss, 60, 307, FONT_SMALL, Colors::WHITE, to);
 
 				temp = SEL->current->mapHeader->victoryCondition.condition;
 				if (temp>12) temp=11;
-				blitAtLoc(CGP->victory->ourImages[temp].bitmap, 24, 302, to); //victory cond descr
+//*				blitAtLoc(CGP->victory->ourImages[temp].bitmap, 24, 302, to); //victory cond descr
 
 				//loss conditoins
 				temp = SEL->current->mapHeader->lossCondition.typeOfLossCon+1;
 				if (temp>20) temp=0;
 				sss = CGI->generaltexth->lossCondtions[temp];
-				printAtLoc(sss, 60, 366, FONT_SMALL, Colors::WHITE, to);
+//*				printAtLoc(sss, 60, 366, FONT_SMALL, Colors::WHITE, to);
 
 				temp=SEL->current->mapHeader->lossCondition.typeOfLossCon;
 				if (temp>12) temp=3;
-				blitAtLoc(CGP->loss->ourImages[temp].bitmap, 24, 359, to); //loss cond
+//*				blitAtLoc(CGP->loss->ourImages[temp].bitmap, 24, 359, to); //loss cond
 			}
 
 			//difficulty
 			assert(SEL->current->mapHeader->difficulty <= 4);
 			std::string &diff = CGI->generaltexth->arraytxt[142 + SEL->current->mapHeader->difficulty];
-			printAtMiddleLoc(diff, 62, 472, FONT_SMALL, Colors::WHITE, to);
+//*			printAtMiddleLoc(diff, 62, 472, FONT_SMALL, Colors::WHITE, to);
 
 			//selecting size icon
 			switch (SEL->current->mapHeader->width)
@@ -2069,11 +2053,11 @@ void InfoCard::showAll(SDL_Surface * to)
 				temp=4;
 				break;
 			}
-			blitAtLoc(sizes->ourImages[temp].bitmap, 318, 22, to);
+//*			blitAtLoc(sizes->ourImages[temp].bitmap, 318, 22, to);
 
 
-			if(SEL->screenType == CMenuScreen::loadGame)
-				printToLoc((static_cast<const CMapInfo*>(SEL->current))->date,308,34, FONT_SMALL, Colors::WHITE, to);
+//*			if(SEL->screenType == CMenuScreen::loadGame)
+//*				printToLoc((static_cast<const CMapInfo*>(SEL->current))->date,308,34, FONT_SMALL, Colors::WHITE, to);
 
 			//print flags
 			int fx = 34  + graphics->fonts[FONT_SMALL]->getStringWidth(CGI->generaltexth->allTexts[390]);
@@ -2089,7 +2073,7 @@ void InfoCard::showAll(SDL_Surface * to)
 			for (auto i = SEL->sInfo.playerInfos.cbegin(); i != SEL->sInfo.playerInfos.cend(); i++)
 			{
 				int *myx = ((i->first == playerColor  ||  SEL->current->mapHeader->players[i->first.getNum()].team == myT) ? &fx : &ex);
-				blitAtLoc(sFlags->ourImages[i->first.getNum()].bitmap, *myx, 399, to);
+//*				blitAtLoc(sFlags->ourImages[i->first.getNum()].bitmap, *myx, 399, to);
 				*myx += sFlags->ourImages[i->first.getNum()].bitmap->w;
 			}
 
@@ -2112,7 +2096,7 @@ void InfoCard::showAll(SDL_Surface * to)
 				tob="200%";
 				break;
 			}
-			printAtMiddleLoc(tob, 311, 472, FONT_SMALL, Colors::WHITE, to);
+//*			printAtMiddleLoc(tob, 311, 472, FONT_SMALL, Colors::WHITE, to);
 		}
 
 		//blit description
@@ -2128,10 +2112,10 @@ void InfoCard::showAll(SDL_Surface * to)
 		}
 
 		//name
-		if (name.length())
-			printAtLoc(name, 26, 39, FONT_BIG, Colors::YELLOW, to);
-		else
-			printAtLoc("Unnamed", 26, 39, FONT_BIG, Colors::YELLOW, to);
+//*		if (name.length())
+//*			printAtLoc(name, 26, 39, FONT_BIG, Colors::YELLOW, to);
+//*		else
+//*			printAtLoc("Unnamed", 26, 39, FONT_BIG, Colors::YELLOW, to);
 	}
 }
 
@@ -2234,9 +2218,10 @@ OptionsTab::~OptionsTab()
 
 }
 
-void OptionsTab::showAll(SDL_Surface * to)
+void OptionsTab::showAll()
 {
-	CIntObject::showAll(to);
+	CIntObject::showAll();
+/*
 	printAtMiddleLoc(CGI->generaltexth->allTexts[515], 222, 30, FONT_BIG, Colors::YELLOW, to);
 	printAtMiddleWBLoc(CGI->generaltexth->allTexts[516], 222, 68, FONT_SMALL, 300, Colors::WHITE, to); //Select starting options, handicap, and name for each player in the game.
 	printAtMiddleWBLoc(CGI->generaltexth->allTexts[517], 107, 110, FONT_SMALL, 100, Colors::YELLOW, to); //Player Name Handicap Type
@@ -2246,6 +2231,7 @@ void OptionsTab::showAll(SDL_Surface * to)
 	printAtMiddleLoc(CGI->generaltexth->allTexts[521], 222, 538, FONT_SMALL, Colors::YELLOW, to); // Player Turn Duration
 	if (turnDuration)
 		printAtMiddleLoc(CGI->generaltexth->turnDurations[turnDuration->value], 319,559, FONT_SMALL, Colors::WHITE, to);//Turn duration value
+*/
 }
 
 void OptionsTab::nextCastle( PlayerColor player, int dir )
@@ -2527,7 +2513,7 @@ OptionsTab::PlayerOptionsEntry::PlayerOptionsEntry( OptionsTab *owner, PlayerSet
 	static const char *bgs[] = {"ADOPRPNL.bmp", "ADOPBPNL.bmp", "ADOPYPNL.bmp", "ADOPGPNL.bmp",
 		"ADOPOPNL.bmp", "ADOPPPNL.bmp", "ADOPTPNL.bmp", "ADOPSPNL.bmp"};
 
-	bg = new CPicture(BitmapHandler::loadBitmap(bgs[s.color.getNum()]), 0, 0, true);
+	bg = new CPicture(Gfx::CManager::getImage(bgs[s.color.getNum()]), 0, 0, true);
 	if(SEL->screenType == CMenuScreen::newGame)
 	{
 		btns[0] = new CAdventureMapButton(CGI->generaltexth->zelp[132], bind(&OptionsTab::nextCastle, owner, s.color, -1), 107, 5, "ADOPLFA.DEF");
@@ -2568,11 +2554,11 @@ OptionsTab::PlayerOptionsEntry::PlayerOptionsEntry( OptionsTab *owner, PlayerSet
 	bonus = new SelectedBox(Point(271, 2), s, BONUS);
 }
 
-void OptionsTab::PlayerOptionsEntry::showAll(SDL_Surface * to)
+void OptionsTab::PlayerOptionsEntry::showAll()
 {
-	CIntObject::showAll(to);
-	printAtMiddleLoc(s.name, 55, 10, FONT_SMALL, Colors::WHITE, to);
-	printAtMiddleWBLoc(CGI->generaltexth->arraytxt[206+whoCanPlay], 28, 39, FONT_TINY, 50, Colors::WHITE, to);
+	CIntObject::showAll();
+//*	printAtMiddleLoc(s.name, 55, 10, FONT_SMALL, Colors::WHITE, to);
+//*	printAtMiddleWBLoc(CGI->generaltexth->arraytxt[206+whoCanPlay], 28, 39, FONT_TINY, 50, Colors::WHITE, to);
 }
 
 void OptionsTab::PlayerOptionsEntry::update()
@@ -3031,11 +3017,11 @@ CMultiMode::CMultiMode()
 	OBJ_CONSTRUCTION_CAPTURING_ALL;
 	bg = new CPicture("MUPOPUP.bmp");
 	bg->convertToScreenBPP(); //so we could draw without problems
-	blitAt(CPicture("MUMAP.bmp"), 16, 77, *bg); //blit img
+//*	blitAt(CPicture("MUMAP.bmp"), 16, 77, *bg); //blit img
 	pos = bg->center(); //center, window has size of bg graphic
 
 	bar = new CGStatusBar(new CPicture(Rect(7, 465, 440, 18), 0));//226, 472
-	txt = new CTextInput(Rect(19, 436, 334, 16), *bg);
+//*	txt = new CTextInput(Rect(19, 436, 334, 16), *bg);
 	txt->setTxt(settings["general"]["playerName"].String()); //Player
 
 	btns[0] = new CAdventureMapButton(CGI->generaltexth->zelp[266], bind(&CMultiMode::openHotseat, this), 373, 78, "MUBHOT.DEF");
@@ -3078,7 +3064,7 @@ CHotSeatPlayers::CHotSeatPlayers(const std::string &firstPlayer)
 
 	for(int i = 0; i < ARRAY_COUNT(txt); i++)
 	{
-		txt[i] = new CTextInput(Rect(60, 85 + i*30, 280, 16), *bg);
+//*		txt[i] = new CTextInput(Rect(60, 85 + i*30, 280, 16), *bg);
 		txt[i]->cb += boost::bind(&CHotSeatPlayers::onChange, this, _1);
 	}
 
@@ -3258,14 +3244,14 @@ void CBonusSelection::goBack()
 	GH.popIntTotally(this);
 }
 
-void CBonusSelection::showAll(SDL_Surface * to)
+void CBonusSelection::showAll()
 {
-	blitAt(background, pos.x, pos.y, to);
-	CIntObject::showAll(to);
+//*	blitAt(background, pos.x, pos.y, to);
+	CIntObject::showAll();
 
-	show(to);
-	if (pos.h != to->h || pos.w != to->w)
-		CMessage::drawBorder(PlayerColor(1), to, pos.w+28, pos.h+30, pos.x-14, pos.y-15);
+	show();
+//*	if (pos.h != to->h || pos.w != to->w)
+//*		CMessage::drawBorder(PlayerColor(1), to, pos.w+28, pos.h+30, pos.x-14, pos.y-15);
 }
 
 void CBonusSelection::loadPositionsOfGraphics()
@@ -3326,22 +3312,22 @@ void CBonusSelection::selectMap( int whichOne, bool initialSelect )
 	}
 }
 
-void CBonusSelection::show(SDL_Surface * to)
+void CBonusSelection::show()
 {
 	//blitAt(background, pos.x, pos.y, to);
 
 	//map name
 	std::string mapName = ourHeader->name;
-
+/*
 	if (mapName.length())
 		printAtLoc(mapName, 481, 219, FONT_BIG, Colors::YELLOW, to);
 	else
 		printAtLoc("Unnamed", 481, 219, FONT_BIG, Colors::YELLOW, to);
-
+*/
 	//map description
-	printAtLoc(CGI->generaltexth->allTexts[496], 481, 253, FONT_SMALL, Colors::YELLOW, to);
+//*	printAtLoc(CGI->generaltexth->allTexts[496], 481, 253, FONT_SMALL, Colors::YELLOW, to);
 
-	mapDesc->showAll(to); //showAll because CTextBox has no show()
+	mapDesc->showAll(); //showAll because CTextBox has no show()
 
 	//map size icon
 	int temp;
@@ -3363,7 +3349,7 @@ void CBonusSelection::show(SDL_Surface * to)
 		temp=4;
 		break;
 	}
-	blitAtLoc(sizes->ourImages[temp].bitmap, 735, 26, to);
+//*	blitAtLoc(sizes->ourImages[temp].bitmap, 735, 26, to);
 
 	//flags
 	int fx = 496  + graphics->fonts[FONT_SMALL]->getStringWidth(CGI->generaltexth->allTexts[390]);
@@ -3373,14 +3359,14 @@ void CBonusSelection::show(SDL_Surface * to)
 	for (auto i = sInfo.playerInfos.cbegin(); i != sInfo.playerInfos.cend(); i++)
 	{
 		int *myx = ((i->first == playerColor  ||  ourHeader->players[i->first.getNum()].team == myT) ? &fx : &ex);
-		blitAtLoc(sFlags->ourImages[i->first.getNum()].bitmap, pos.x + *myx, pos.y + 405, to);
+//*		blitAtLoc(sFlags->ourImages[i->first.getNum()].bitmap, pos.x + *myx, pos.y + 405, to);
 		*myx += sFlags->ourImages[i->first.getNum()].bitmap->w;
 	}
 
 	//difficulty
-	blitAtLoc(diffPics[sInfo.difficulty], 709, 455, to);
+//*	blitAtLoc(diffPics[sInfo.difficulty], 709, 455, to);
 
-	CIntObject::show(to);
+	CIntObject::show();
 }
 
 void CBonusSelection::updateBonusSelection()
@@ -3566,9 +3552,7 @@ void CBonusSelection::updateBonusSelection()
 			if (picNumber != -1)
 				picName += ":" + boost::lexical_cast<std::string>(picNumber);
 
-			CAnimation * anim = new CAnimation();
-			anim->setCustom(picName, 0);
-			bonusButton->setImage(anim);
+			bonusButton->setImage(Gfx::CManager::getAnimation(picName));
 			const SDL_Color brightYellow = { 242, 226, 110, 0 };
 			bonusButton->borderColor = brightYellow;
 			bonuses->addButton(bonusButton);
@@ -3704,7 +3688,7 @@ void CBonusSelection::CRegion::clickLeft( tribool down, bool previousState )
 	{
 		owner->selectMap(myNumber, false);
 		owner->highlightedRegion = this;
-		parent->showAll(screen);
+		parent->showAll();
 	}
 }
 
@@ -3718,23 +3702,23 @@ void CBonusSelection::CRegion::clickRight( tribool down, bool previousState )
 	}
 }
 
-void CBonusSelection::CRegion::show(SDL_Surface * to)
+void CBonusSelection::CRegion::show()
 {
 	//const SCampPositions::SRegionDesc & desc = owner->campDescriptions[owner->ourCampaign->camp->header.mapVersion].regions[myNumber];
 	if (!accessible)
 	{
 		//show as striped
-		blitAtLoc(graphics[2], 0, 0, to);
+//*		blitAtLoc(graphics[2], 0, 0, to);
 	}
 	else if (this == owner->highlightedRegion)
 	{
 		//show as selected
-		blitAtLoc(graphics[1], 0, 0, to);
+//*		blitAtLoc(graphics[1], 0, 0, to);
 	}
 	else
 	{
 		//show as not selected selected
-		blitAtLoc(graphics[0], 0, 0, to);
+//*		blitAtLoc(graphics[0], 0, 0, to);
 	}
 }
 
@@ -3989,12 +3973,12 @@ void CCampaignScreen::CCampaignButton::hover(bool on)
 		hoverLabel->setTxt(" ");
 }
 
-void CCampaignScreen::CCampaignButton::show(SDL_Surface * to)
+void CCampaignScreen::CCampaignButton::show()
 {
 	if (status == CCampaignScreen::DISABLED)
 		return;
 
-	CIntObject::show(to);
+	CIntObject::show();
 
 	// Play the campaign button video when the mouse cursor is placed over the button
 	if (hovered)
@@ -4002,7 +3986,7 @@ void CCampaignScreen::CCampaignButton::show(SDL_Surface * to)
 		if (CCS->videoh->fname != video)
 			CCS->videoh->open(video);
 
-		CCS->videoh->update(pos.x, pos.y, to, true, false); // plays sequentially frame by frame, starts at the beginning when the video is over
+		CCS->videoh->update(pos.x, pos.y, true, false); // plays sequentially frame by frame, starts at the beginning when the video is over
 	}
 	else if (CCS->videoh->fname == video) // When you got out of the bounds of the button then close the video
 	{
@@ -4047,11 +4031,11 @@ CCampaignScreen::CCampaignScreen(const JsonNode &config)
 		campButtons.push_back(new CCampaignButton(node));
 }
 
-void CCampaignScreen::showAll(SDL_Surface *to)
+void CCampaignScreen::showAll()
 {
-	CIntObject::showAll(to);
-	if (pos.h != to->h || pos.w != to->w)
-		CMessage::drawBorder(PlayerColor(1), to, pos.w+28, pos.h+30, pos.x-14, pos.y-15);
+	CIntObject::showAll();
+//*	if (pos.h != to->h || pos.w != to->w)
+//*		CMessage::drawBorder(PlayerColor(1), to, pos.w+28, pos.h+30, pos.x-14, pos.y-15);
 }
 
 void CGPreGame::showLoadingScreen(boost::function<void()> loader)
@@ -4082,12 +4066,12 @@ CLoadingScreen::~CLoadingScreen()
 	loadingThread.join();
 }
 
-void CLoadingScreen::showAll(SDL_Surface *to)
+void CLoadingScreen::showAll()
 {
-	Rect rect(0,0,to->w, to->h);
-	SDL_FillRect(to, &rect, 0);
+//*	Rect rect(0,0,to->w, to->h);
+//*	SDL_FillRect(to, &rect, 0);
 
-	CWindowObject::showAll(to);
+	CWindowObject::showAll();
 }
 
 CPrologEpilogVideo::CPrologEpilogVideo( CCampaignScenario::SScenarioPrologEpilog _spe, std::function<void()> callback )
@@ -4107,9 +4091,9 @@ CPrologEpilogVideo::CPrologEpilogVideo( CCampaignScenario::SScenarioPrologEpilog
 	//SDL_SaveBMP(txt, "txtsrfc.bmp");
 }
 
-void CPrologEpilogVideo::show( SDL_Surface * to )
+void CPrologEpilogVideo::show()
 {
-	memset(to->pixels, 0, to->h*to->pitch); //make bg black
+/*	memset(to->pixels, 0, to->h*to->pitch); //make bg black
 	CCS->videoh->update(pos.x, pos.y, to, true, false);
 	SDL_Rect tmp, our;
 	our = Rect(0, to->h-100, to->w, 100);
@@ -4125,6 +4109,7 @@ void CPrologEpilogVideo::show( SDL_Surface * to )
 		curTxtH = std::max(curTxtH - 1, to->h - txt->h);
 		decrementDelayCounter = 0;
 	}
+*/
 }
 
 void CPrologEpilogVideo::clickLeft( tribool down, bool previousState )

+ 17 - 17
client/CPreGame.h

@@ -69,8 +69,8 @@ public:
 	};
 	CMenuScreen(const JsonNode& configNode);
 
-	void showAll(SDL_Surface * to);
-	void show(SDL_Surface * to);
+	void showAll();
+	void show();
 	void activate();
 	void deactivate();
 
@@ -93,8 +93,8 @@ class CreditsScreen : public CIntObject
 public:
 	CreditsScreen();
 
-	void show(SDL_Surface * to);
-	void showAll(SDL_Surface * to);
+	void show();
+	void showAll();
 
 	void clickLeft(tribool down, bool previousState);
 	void clickRight(tribool down, bool previousState);
@@ -130,7 +130,7 @@ public:
 	CDefHandler *sizes, *sFlags;
 
 	void changeSelection(const CMapInfo *to);
-	void showAll(SDL_Surface * to);
+	void showAll();
 	void clickRight(tribool down, bool previousState);
 	void showTeamsPopup();
 	void toggleChat();
@@ -177,7 +177,7 @@ public:
 	void selectFName(std::string fname);
 	const CMapInfo * getSelectedMapInfo() const;
 
-	void showAll(SDL_Surface * to);
+	void showAll();
 	void clickLeft(tribool down, bool previousState);
 	void keyPressed(const SDL_KeyboardEvent & key);
 	void onDoubleClick();
@@ -247,7 +247,7 @@ public:
 
 		PlayerOptionsEntry(OptionsTab *owner, PlayerSettings &S);
 		void selectButtons(); //hides unavailable buttons
-		void showAll(SDL_Surface * to);
+		void showAll();
 		void update();
 	};
 
@@ -275,7 +275,7 @@ public:
 	void recreate();
 	OptionsTab();
 	~OptionsTab();
-	void showAll(SDL_Surface * to);
+	void showAll();
 
 	int nextAllowedHero(PlayerColor player, int min, int max, int incl, int dir );
 
@@ -298,7 +298,7 @@ public:
      *
      * @param to where the graphics should be inserted
      */
-    void showAll(SDL_Surface * to);
+    void showAll();
 
 	/**
 	 * Updates the map info object and fires the associated callback method.
@@ -483,7 +483,7 @@ public:
 	void postRequest(ui8 what, ui8 dir) override;
 	void postChatMessage(const std::string &txt) override;
 	void propagateNames();
-	void showAll(SDL_Surface *to);
+	void showAll();
 };
 
 /// Save game screen
@@ -551,7 +551,7 @@ public:
 	CPrologEpilogVideo(CCampaignScenario::SScenarioPrologEpilog _spe, std::function<void()> callback);
 
 	void clickLeft(tribool down, bool previousState);
-	void show(SDL_Surface * to);
+	void show();
 };
 
 /// Campaign screen where you can choose one out of three starting bonuses
@@ -594,7 +594,7 @@ class CBonusSelection : public CIntObject
 
 		void clickLeft(tribool down, bool previousState);
 		void clickRight(tribool down, bool previousState);
-		void show(SDL_Surface * to);
+		void show();
 	};
 
 	std::vector<CRegion *> regions;
@@ -626,8 +626,8 @@ public:
 	CBonusSelection(shared_ptr<CCampaignState> _ourCampaign);
 	~CBonusSelection();
 
-	void showAll(SDL_Surface * to);
-	void show(SDL_Surface * to);
+	void showAll();
+	void show();
 
 	void goBack();
 	void startMap();
@@ -659,7 +659,7 @@ private:
 
 	public:
 		CCampaignButton(const JsonNode &config );
-		void show(SDL_Surface * to);
+		void show();
 	};
 
 	CAdventureMapButton *back;
@@ -672,7 +672,7 @@ public:
 	enum CampaignSet {ROE, AB, SOD, WOG};
 
 	CCampaignScreen(const JsonNode &config);
-	void showAll(SDL_Surface *to);
+	void showAll();
 };
 
 /// Handles background screen, loads graphics for victory/loss condition and random town or hero selection
@@ -710,7 +710,7 @@ public:
 	CLoadingScreen(boost::function<void()> loader);
 	~CLoadingScreen();
 
-	void showAll(SDL_Surface *to);
+	void showAll();
 };
 
 extern ISelectionScreenInfo *SEL;

+ 15 - 15
client/CQuestLog.cpp

@@ -40,10 +40,10 @@ void CQuestLabel::clickLeft(tribool down, bool previousState)
 		callback();
 }
 
-void CQuestLabel::showAll(SDL_Surface * to)
+void CQuestLabel::showAll()
 {
 	if (active)
-		CBoundedLabel::showAll (to);
+		CBoundedLabel::showAll ();
 }
 
 CQuestIcon::CQuestIcon (const std::string &defname, int index, int x, int y) :
@@ -58,10 +58,10 @@ void CQuestIcon::clickLeft(tribool down, bool previousState)
 		callback();
 }
 
-void CQuestIcon::showAll(SDL_Surface * to)
+void CQuestIcon::showAll()
 {
-	CSDL_Ext::CClipRectGuard guard(to, parent->pos);
-	CAnimImage::showAll(to);
+//*	CSDL_Ext::CClipRectGuard guard(to, parent->pos);
+	CAnimImage::showAll();
 }
 
 CQuestMinimap::CQuestMinimap (const Rect & position) :
@@ -109,11 +109,11 @@ void CQuestMinimap::iconClicked()
 	moveAdvMapSelection();
 }
 
-void CQuestMinimap::showAll(SDL_Surface * to)
+void CQuestMinimap::showAll()
 {
-	CIntObject::showAll(to); // blitting IntObject directly to hide radar
-	BOOST_FOREACH (auto pic, icons)
-		pic->showAll(to);
+//*	CIntObject::showAll(to); // blitting IntObject directly to hide radar
+//*	BOOST_FOREACH (auto pic, icons)
+//*		pic->showAll(to);
 }
 
 CQuestLog::CQuestLog (const std::vector<QuestInfo> & Quests) :
@@ -151,20 +151,20 @@ void CQuestLog::init()
 	recreateQuestList (0);
 }
 
-void CQuestLog::showAll(SDL_Surface * to)
+void CQuestLog::showAll()
 {
-	CIntObject::showAll (to);
+	CIntObject::showAll();
 	BOOST_FOREACH (auto label, labels)
 	{
-		label->show(to); //shows only if active
+		label->show(); //shows only if active
 	}
 	if (labels.size() && labels[questIndex]->active)
 	{
-		CSDL_Ext::drawBorder(to, Rect::around(labels[questIndex]->pos), int3(Colors::METALLIC_GOLD.r, Colors::METALLIC_GOLD.g, Colors::METALLIC_GOLD.b));
+//*		CSDL_Ext::drawBorder(to, Rect::around(labels[questIndex]->pos), int3(Colors::METALLIC_GOLD.r, Colors::METALLIC_GOLD.g, Colors::METALLIC_GOLD.b));
 	}
-	description->show(to);
+	description->show();
 	minimap->update();
-	minimap->show(to);
+	minimap->show();
 }
 
 void CQuestLog::recreateQuestList (int newpos)

+ 4 - 4
client/CQuestLog.h

@@ -41,7 +41,7 @@ public:
 	CQuestLabel (int x=0, int y=0, EFonts Font = FONT_SMALL, EAlignment Align = TOPLEFT, const SDL_Color &Color = Colors::WHITE, const std::string &Text =  "")
 		: CBoundedLabel (x, y, FONT_SMALL, TOPLEFT, Colors::WHITE, Text){};
 	void clickLeft(tribool down, bool previousState);
-	void showAll(SDL_Surface * to);
+	void showAll();
 };
 
 class CQuestIcon : public CAnimImage
@@ -52,7 +52,7 @@ public:
 	CQuestIcon (const std::string &defname, int index, int x=0, int y=0);
 
 	void clickLeft(tribool down, bool previousState);
-	void showAll(SDL_Surface * to);
+	void showAll();
 };
 
 class CQuestMinimap : public CMinimap
@@ -73,7 +73,7 @@ public:
 	void setLevel(int level);
 	void addQuestMarks (const QuestInfo * q);
 
-	void showAll(SDL_Surface * to);
+	void showAll();
 };
 
 class CQuestLog : public CWindowObject
@@ -100,5 +100,5 @@ public:
 	void printDescription (int which){};
 	void sliderMoved (int newpos);
 	void recreateQuestList (int pos);
-	void showAll (SDL_Surface * to);
+	void showAll();
 };

+ 22 - 22
client/CSpellWindow.cpp

@@ -314,43 +314,43 @@ void CSpellWindow::fRcornerb()
 	GH.breakEventHandling();
 }
 
-void CSpellWindow::showAll(SDL_Surface * to)
+void CSpellWindow::showAll()
 {
-	CWindowObject::showAll(to);
-	blitAt(spellTab->ourImages[selectedTab].bitmap, 524 + pos.x, 88 + pos.y, to);
+	CWindowObject::showAll();
+//*	blitAt(spellTab->ourImages[selectedTab].bitmap, 524 + pos.x, 88 + pos.y, to);
 
 	std::ostringstream mana;
 	mana<<myHero->mana;
-	printAtMiddleLoc(mana.str(), 435, 426, FONT_SMALL, Colors::YELLOW, to);
+//*	printAtMiddleLoc(mana.str(), 435, 426, FONT_SMALL, Colors::YELLOW, to);
 	
-	statusBar->showAll(to);
+	statusBar->showAll();
 
 	//printing school images
 	if(selectedTab!=4 && currentPage == 0)
 	{
-		blitAt(schools->ourImages[selectedTab].bitmap, 117 + pos.x, 74 + pos.y, to);
+//*		blitAt(schools->ourImages[selectedTab].bitmap, 117 + pos.x, 74 + pos.y, to);
 	}
 
 	//printing corners
 	if(currentPage!=0)
 	{
-		blitAt(leftCorner, lCorner->pos.x, lCorner->pos.y, to);
+//*		blitAt(leftCorner, lCorner->pos.x, lCorner->pos.y, to);
 	}
 	if((currentPage+1) < (pagesWithinCurrentTab()) )
 	{
-		blitAt(rightCorner, rCorner->pos.x, rCorner->pos.y, to);
+//*		blitAt(rightCorner, rCorner->pos.x, rCorner->pos.y, to);
 	}
 
 	//printing spell info
 	for(int b=0; b<12; ++b)
 	{
-		spellAreas[b]->showAll(to);
+//*		spellAreas[b]->showAll(to);
 	}
 }
 
-void CSpellWindow::show(SDL_Surface * to)
+void CSpellWindow::show()
 {
-	statusBar->show(to);
+	statusBar->show();
 }
 
 class SpellbookSpellSorter
@@ -766,11 +766,11 @@ void CSpellWindow::SpellArea::clickLeft(tribool down, bool previousState)
 						}
 						if (availableTowns.empty())
 							LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[124]);
-						else
-							GH.pushInt (new CObjectListWindow(availableTowns,
-								new CPicture(graphics->spellscr->ourImages[spell].bitmap, 0, 0, false),
-								CGI->generaltexth->jktexts[40], CGI->generaltexth->jktexts[41],
-								boost::bind (&CSpellWindow::teleportTo, owner, _1, h)));
+//*						else
+//*							GH.pushInt (new CObjectListWindow(availableTowns,
+//*								new CPicture(graphics->spellscr->ourImages[spell].bitmap, 0, 0, false),
+//*								CGI->generaltexth->jktexts[40], CGI->generaltexth->jktexts[41],
+//*								boost::bind (&CSpellWindow::teleportTo, owner, _1, h)));
 					}
 					return;
 				}
@@ -823,15 +823,15 @@ void CSpellWindow::SpellArea::hover(bool on)
 	}
 }
 
-void CSpellWindow::SpellArea::showAll(SDL_Surface * to)
+void CSpellWindow::SpellArea::showAll()
 {
 	if(mySpell < 0)
 		return;
 
 	const CSpell * spell = mySpell.toSpell();
 
-	blitAt(owner->spells->ourImages[mySpell].bitmap, pos.x, pos.y, to);
-	blitAt(owner->schoolBorders[owner->selectedTab >= 4 ? whichSchool : owner->selectedTab]->ourImages[schoolLevel].bitmap, pos.x, pos.y, to); //printing border (indicates level of magic school)
+//*	blitAt(owner->spells->ourImages[mySpell].bitmap, pos.x, pos.y, to);
+//*	blitAt(owner->schoolBorders[owner->selectedTab >= 4 ? whichSchool : owner->selectedTab]->ourImages[schoolLevel].bitmap, pos.x, pos.y, to); //printing border (indicates level of magic school)
 
 	SDL_Color firstLineColor, secondLineColor;
 	if(spellCost > owner->myHero->mana) //hero cannot cast this spell
@@ -846,13 +846,13 @@ void CSpellWindow::SpellArea::showAll(SDL_Surface * to)
 		secondLineColor = Colors::WHITE;
 	}
 	//printing spell's name
-	printAtMiddleLoc(spell->name, 39, 70, FONT_TINY, firstLineColor, to);
+//*	printAtMiddleLoc(spell->name, 39, 70, FONT_TINY, firstLineColor, to);
 	//printing lvl
-	printAtMiddleLoc(CGI->generaltexth->allTexts[171 + spell->level], 39, 82, FONT_TINY, secondLineColor, to);
+//*	printAtMiddleLoc(CGI->generaltexth->allTexts[171 + spell->level], 39, 82, FONT_TINY, secondLineColor, to);
 	//printing  cost
 	std::ostringstream ss;
 	ss << CGI->generaltexth->allTexts[387] << ": " << spellCost;
-	printAtMiddleLoc(ss.str(), 39, 94, FONT_TINY, secondLineColor, to);
+//*	printAtMiddleLoc(ss.str(), 39, 94, FONT_TINY, secondLineColor, to);
 }
 
 void CSpellWindow::SpellArea::setSpell(SpellID spellID)

+ 3 - 3
client/CSpellWindow.h

@@ -58,7 +58,7 @@ private:
 		void clickLeft(tribool down, bool previousState);
 		void clickRight(tribool down, bool previousState);
 		void hover(bool on);
-		void showAll(SDL_Surface * to);
+		void showAll();
 	};
 
 	SDL_Surface * leftCorner, * rightCorner;
@@ -108,8 +108,8 @@ public:
 	void keyPressed(const SDL_KeyboardEvent & key);
 	void activate();
 	void deactivate();
-	void showAll(SDL_Surface * to);
-	void show(SDL_Surface * to);
+	void showAll();
+	void show();
 
 	void teleportTo(int town, const CGHeroInstance * hero);
 };

+ 39 - 98
client/CVideoHandler.cpp

@@ -167,41 +167,16 @@ checkErrorAndClean:
 	throw std::runtime_error("BIK failed opening video!");
 }
 
-void CBIKHandler::show( int x, int y, SDL_Surface *dst, bool update )
+void CBIKHandler::show( int x, int y, bool update )
 {
 	const int w = hBink->width,
-		h = hBink->height,
-		Bpp = dst->format->BytesPerPixel;
-
-	int mode = -1;
-
-	//screen color depth might have changed... (eg. because F4)
-	if(bufferSize != w * h * Bpp)
-	{
-		freeBuffer();
-		allocBuffer(Bpp);
-	}
-
-	switch(Bpp)
-	{
-	case 2:
-		mode = 3; //565, mode 2 is 555 probably
-		break;
-	case 3:
-		mode = 0;
-		break;
-	case 4:
-		mode = 1;
-		break;
-	default:
-		return; //not supported screen depth
-	}
+			h = hBink->height;
 
 	binkDoFrame(hBink);
-	binkCopyToBuffer(hBink, buffer, w*Bpp, h, 0, 0, mode);
-	blitBuffer(buffer, x, y, w, h, dst);
-	if(update)
-		SDL_UpdateRect(dst, x, y, w, h);
+	binkCopyToBuffer(hBink, buffer, w*4, h, 0, 0, 1);
+	//blitBuffer(buffer, x, y, w, h, dst);
+	//if(update)
+	//	SDL_UpdateRect(dst, x, y, w, h);
 }
 
 bool CBIKHandler::nextFrame()
@@ -237,17 +212,17 @@ int CBIKHandler::frameCount() const
 	return hBink->frameCount;
 }
 
-void CBIKHandler::redraw( int x, int y, SDL_Surface *dst, bool update )
+void CBIKHandler::redraw( int x, int y, bool update)
 {
 	int w = hBink->width, h = hBink->height;
-	blitBuffer(buffer, x, y, w, h, dst);
-	if(update)
-		SDL_UpdateRect(dst, x, y, w, h);
+	//blitBuffer(buffer, x, y, w, h, dst);
+	//if(update)
+	//	SDL_UpdateRect(dst, x, y, w, h);
 }
 
 void CBIKHandler::allocBuffer(int Bpp)
 {
-	if(!Bpp) Bpp = screen->format->BytesPerPixel;
+//*	if(!Bpp) Bpp = screen->format->BytesPerPixel;
 
 	bufferSize = hBink->width * hBink->height * Bpp;
 	buffer = new char[bufferSize];
@@ -315,7 +290,7 @@ bool CSmackPlayer::open( std::string name )
 	return true;
 }
 
-void CSmackPlayer::show( int x, int y, SDL_Surface *dst, bool update)
+void CSmackPlayer::show( int x, int y, bool update)
 {
 	int w = data->width;
 	int stripe = (-w*2) & (~3);
@@ -323,7 +298,7 @@ void CSmackPlayer::show( int x, int y, SDL_Surface *dst, bool update)
 	//put frame to the buffer
 	ptrSmackToBuffer(data, 0, 0, stripe, w, buf, 0x80000000);
 	ptrSmackDoFrame(data);
-	redraw(x, y, dst, update);
+	redraw(x, y, update);
 }
 
 int CSmackPlayer::curFrame() const
@@ -336,63 +311,31 @@ int CSmackPlayer::frameCount() const
 	return data->frameCount;
 }
 
-void CSmackPlayer::redraw( int x, int y, SDL_Surface *dst, bool update )
+void CSmackPlayer::redraw( int x, int y, bool update )
 {
-	int w = std::min<int>(data->width, dst->w - x), h = std::min<int>(data->height, dst->h - y);
-	/* Lock the screen for direct access to the pixels */
-	if ( SDL_MUSTLOCK(dst) )
-	{
-		if ( SDL_LockSurface(dst) < 0 )
-		{
-			fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());
-			return;
-		}
-	}
+	//int w = std::min<int>(data->width, dst->w - x), h = std::min<int>(data->height, dst->h - y);
+	int w = data->width, h = data->height;
 
 	// draw the frame
 	Uint16* addr = (Uint16*) (buffer+w*(h-1)*2-2);
-	if(dst->format->BytesPerPixel >= 3)
+/*
+	for( int j=0; j<h-1; j++)	// why -1 ?
 	{
-		for( int j=0; j<h-1; j++)	// why -1 ?
+		for ( int i=w-1; i>=0; i--)
 		{
-			for ( int i=w-1; i>=0; i--)
-			{
-				Uint16 pixel = *addr;
+			Uint16 pixel = *addr;
 
-				Uint8 *p = (Uint8 *)dst->pixels + (j+y) * dst->pitch + (i + x) * dst->format->BytesPerPixel;
-				p[2] = ((pixel & 0x7c00) >> 10) * 8;
-				p[1] = ((pixel & 0x3e0) >> 5) * 8;
-				p[0] = ((pixel & 0x1F)) * 8;
+			Uint8 *p = (Uint8 *)dst->pixels + (j+y) * dst->pitch + (i + x) * dst->format->BytesPerPixel;
+			p[2] = ((pixel & 0x7c00) >> 10) * 8;
+			p[1] = ((pixel & 0x3e0) >> 5) * 8;
+			p[0] = ((pixel & 0x1F)) * 8;
 
-				addr--;
-			}
+			addr--;
 		}
 	}
-	else if(dst->format->BytesPerPixel == 2)
-	{
-		for( int j=0; j<h-1; j++)	// why -1 ?
-		{
-			for ( int i=w-1; i>=0; i--)
-			{
-				//convert rgb 555 to 565
-				Uint16 pixel = *addr;
-				Uint16 *p = (Uint16 *)((Uint8 *)dst->pixels + (j+y) * dst->pitch + (i + x) * dst->format->BytesPerPixel);
-				*p =	(pixel & 0x1F)
-					  +	((pixel & 0x3e0) << 1)
-					  +	((pixel & 0x7c00) << 1);
-
-				addr--;
-			}
-		}
-	}
-
-	if ( SDL_MUSTLOCK(dst) )
-	{
-		SDL_UnlockSurface(dst);
-	}
-
-	if(update)
-		SDL_UpdateRect(dst, x, y, w, h);
+*/
+	//if(update)
+	//	SDL_UpdateRect(dst, x, y, w, h);
 }
 
 CVideoPlayer::CVideoPlayer()
@@ -472,10 +415,10 @@ bool CVideoPlayer::nextFrame()
 		return false;
 }
 
-void CVideoPlayer::show(int x, int y, SDL_Surface *dst, bool update)
+void CVideoPlayer::show(int x, int y, bool update)
 {
 	if(current)
-		current->show(x, y, dst, update);
+		current->show(x, y, update);
 }
 
 bool CVideoPlayer::wait()
@@ -502,17 +445,17 @@ int CVideoPlayer::frameCount() const
 		return -1;
 }
 
-bool CVideoPlayer::openAndPlayVideo(std::string name, int x, int y, SDL_Surface *dst, bool stopOnKey)
+bool CVideoPlayer::openAndPlayVideo(std::string name, int x, int y, bool stopOnKey)
 {
 	if(!open(name))
 		return false;
 
-	bool ret = playVideo(x, y, dst, stopOnKey);
+	bool ret = playVideo(x, y, stopOnKey);
 	close();
 	return ret;
 }
 
-void CVideoPlayer::update( int x, int y, SDL_Surface *dst, bool forceRedraw, bool update )
+void CVideoPlayer::update( int x, int y, bool forceRedraw, bool update )
 {
 	if(!current)
 		return;
@@ -529,25 +472,23 @@ void CVideoPlayer::update( int x, int y, SDL_Surface *dst, bool forceRedraw, boo
 		first = false;
 	}
 
-
-
 	if(!w)
 	{
-		show(x,y,dst,update);
+		show(x, y, update);
 	}
 	else if (forceRedraw)
 	{
-		redraw(x, y, dst, update);
+		redraw(x, y, update);
 	}
 }
 
-void CVideoPlayer::redraw( int x, int y, SDL_Surface *dst, bool update )
+void CVideoPlayer::redraw( int x, int y, bool update)
 {
 	if(current)
-		current->redraw(x, y, dst, update);
+		current->redraw(x, y, update);
 }
 
-bool CVideoPlayer::playVideo(int x, int y, SDL_Surface *dst, bool stopOnKey)
+bool CVideoPlayer::playVideo(int x, int y, bool stopOnKey)
 {
 	if(!current)
 		return false;
@@ -560,7 +501,7 @@ bool CVideoPlayer::playVideo(int x, int y, SDL_Surface *dst, bool stopOnKey)
 
 		if(!wait())
 		{
-			show(x, y, dst);
+			show(x, y);
 			nextFrame();
 			frame++;
 		}

+ 15 - 15
client/CVideoHandler.h

@@ -9,8 +9,8 @@ public:
 	virtual bool open(std::string name)=0; //true - succes
 	virtual void close()=0;
 	virtual bool nextFrame()=0;
-	virtual void show(int x, int y, SDL_Surface *dst, bool update = true)=0;
-	virtual void redraw(int x, int y, SDL_Surface *dst, bool update = true)=0; //reblits buffer
+	virtual void show(int x, int y, bool update = true)=0;
+	virtual void redraw(int x, int y, bool update = true)=0; //reblits buffer
 	virtual bool wait()=0;
 	virtual int curFrame() const =0;
 	virtual int frameCount() const =0;
@@ -22,8 +22,8 @@ class IMainVideoPlayer : public IVideoPlayer
 public:
 	std::string fname;  //name of current video file (empty if idle)
 
-	virtual void update(int x, int y, SDL_Surface *dst, bool forceRedraw, bool update = true){}
-	virtual bool openAndPlayVideo(std::string name, int x, int y, SDL_Surface *dst, bool stopOnKey = false) 
+	virtual void update(int x, int y, bool forceRedraw, bool update = true){}
+	virtual bool openAndPlayVideo(std::string name, int x, int y, bool stopOnKey = false) 
 	{
 		return false;
 	}
@@ -34,8 +34,8 @@ class CEmptyVideoPlayer : public IMainVideoPlayer
 public:
 	virtual int curFrame() const {return -1;};
 	virtual int frameCount() const {return -1;};
-	virtual void redraw( int x, int y, SDL_Surface *dst, bool update = true ) {};
-	virtual void show( int x, int y, SDL_Surface *dst, bool update = true ) {};
+	virtual void redraw( int x, int y, bool update = true ) {};
+	virtual void show( int x, int y, bool update = true ) {};
 	virtual bool nextFrame() {return false;};
 	virtual void close() {};
 	virtual bool wait() {return false;};
@@ -119,8 +119,8 @@ public:
 	bool open(std::string name);
 	void close();
 	bool nextFrame();
-	void show(int x, int y, SDL_Surface *dst, bool update = true);
-	void redraw(int x, int y, SDL_Surface *dst, bool update = true); //reblits buffer
+	void show(int x, int y, bool update = true);
+	void redraw(int x, int y, bool update = true); //reblits buffer
 	bool wait();
 	int curFrame() const;
 	int frameCount() const;
@@ -175,8 +175,8 @@ public:
 	bool open(std::string name);
 	void close();
 	bool nextFrame();
-	void show(int x, int y, SDL_Surface *dst, bool update = true);
-	void redraw(int x, int y, SDL_Surface *dst, bool update = true); //reblits buffer
+	void show(int x, int y, bool update = true);
+	void redraw(int x, int y, bool update = true); //reblits buffer
 	bool wait();
 	int curFrame() const;
 	int frameCount() const;
@@ -202,15 +202,15 @@ public:
 	bool open(std::string name);
 	void close();
 	bool nextFrame(); //move animation to the next frame
-	void show(int x, int y, SDL_Surface *dst, bool update = true); //blit current frame
-	void redraw(int x, int y, SDL_Surface *dst, bool update = true); //reblits buffer
-	void update(int x, int y, SDL_Surface *dst, bool forceRedraw, bool update = true); //moves to next frame if appropriate, and blits it or blits only if redraw paremeter is set true
+	void show(int x, int y, bool update = true); //blit current frame
+	void redraw(int x, int y, bool update = true); //reblits buffer
+	void update(int x, int y, bool forceRedraw, bool update = true); //moves to next frame if appropriate, and blits it or blits only if redraw paremeter is set true
 	bool wait(); //true if we should wait before displaying next frame (for keeping FPS)
 	int curFrame() const; //current frame number <1, framecount>
 	int frameCount() const;
 
-	bool openAndPlayVideo(std::string name, int x, int y, SDL_Surface *dst, bool stopOnKey = false); //opens video, calls playVideo, closes video; returns playVideo result (if whole video has been played)
-	bool playVideo(int x, int y, SDL_Surface *dst, bool stopOnKey = false); //plays whole opened video; returns: true when whole video has been shown, false when it has been interrupted
+	bool openAndPlayVideo(std::string name, int x, int y, bool stopOnKey = false); //opens video, calls playVideo, closes video; returns playVideo result (if whole video has been played)
+	bool playVideo(int x, int y, bool stopOnKey = false); //plays whole opened video; returns: true when whole video has been shown, false when it has been interrupted
 };
 
 #else

+ 79 - 77
client/GUIClasses.cpp

@@ -701,9 +701,9 @@ void CInfoWindow::close()
 		LOCPLINT->showingDialog->setn(false);
 }
 
-void CInfoWindow::show(SDL_Surface * to)
+void CInfoWindow::show()
 {
-	CIntObject::show(to);
+	CIntObject::show();
 }
 
 CInfoWindow::~CInfoWindow()
@@ -715,10 +715,10 @@ CInfoWindow::~CInfoWindow()
 	}
 }
 
-void CInfoWindow::showAll(SDL_Surface * to)
+void CInfoWindow::showAll()
 {
-	CSimpleWindow::show(to);
-	CIntObject::showAll(to);
+	CSimpleWindow::show();
+	CIntObject::showAll();
 }
 
 void CInfoWindow::showYesNoDialog(const std::string & text, const std::vector<CComponent*> *components, const CFunctionList<void( ) > &onYes, const CFunctionList<void()> &onNo, bool DelComps, PlayerColor player)
@@ -1056,12 +1056,12 @@ void CSelectableComponent::select(bool on)
 	}
 }
 
-void CSelectableComponent::showAll(SDL_Surface * to)
+void CSelectableComponent::showAll()
 {
-	CComponent::showAll(to);
+	CComponent::showAll();
 	if(selected)
 	{
-		CSDL_Ext::drawBorder(to, Rect::around(image->pos), int3(239,215,123));
+//*		CSDL_Ext::drawBorder(to, Rect::around(image->pos), int3(239,215,123));
 	}
 }
 
@@ -1364,13 +1364,13 @@ void CRecruitmentWindow::CCreatureCard::clickRight(tribool down, bool previousSt
 		GH.pushInt(createCreWindow(creature->idNumber, CCreatureWindow::OTHER, 0));
 }
 
-void CRecruitmentWindow::CCreatureCard::showAll(SDL_Surface * to)
+void CRecruitmentWindow::CCreatureCard::showAll()
 {
-	CIntObject::showAll(to);
-	if (selected)
-		drawBorder(to, pos, int3(248, 0, 0));
-	else
-		drawBorder(to, pos, int3(232, 212, 120));
+	CIntObject::showAll();
+//*	if (selected)
+//*		drawBorder(to, pos, int3(248, 0, 0));
+//*	else
+//*		drawBorder(to, pos, int3(232, 212, 120));
 }
 
 CRecruitmentWindow::CCostBox::CCostBox(Rect position, std::string title)
@@ -1492,10 +1492,10 @@ void CRecruitmentWindow::buy()
 		close();
 }
 
-void CRecruitmentWindow::showAll(SDL_Surface * to)
+void CRecruitmentWindow::showAll()
 {
-	CWindowObject::showAll(to);
-
+	CWindowObject::showAll();
+/*
 	// recruit\total values
 	drawBorder(to, pos.x + 172, pos.y + 222, 67, 42, int3(239,215,123));
 	drawBorder(to, pos.x + 246, pos.y + 222, 67, 42, int3(239,215,123));
@@ -1508,6 +1508,7 @@ void CRecruitmentWindow::showAll(SDL_Surface * to)
 	drawBorder(to, pos.x + 133, pos.y + 312, 66, 34, int3(173,142,66));
 	drawBorder(to, pos.x + 211, pos.y + 312, 66, 34, int3(173,142,66));
 	drawBorder(to, pos.x + 289, pos.y + 312, 66, 34, int3(173,142,66));
+*/
 }
 
 CRecruitmentWindow::CRecruitmentWindow(const CGDwelling *Dwelling, int Level, const CArmedInstance *Dst, const boost::function<void(CreatureID,int)> &Recruit, int y_offset):
@@ -1521,7 +1522,7 @@ CRecruitmentWindow::CRecruitmentWindow(const CGDwelling *Dwelling, int Level, co
 	moveBy(Point(0, y_offset));
 
 	OBJ_CONSTRUCTION_CAPTURING_ALL;
-	new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+	new CGStatusBar(new CPicture(background->getImage(), Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 
 	slider = new CSlider(176,279,135,0,0,0,0,true);
 	slider->moved = boost::bind(&CRecruitmentWindow::sliderMoved,this, _1);
@@ -2028,7 +2029,7 @@ int CTradeWindow::CTradeableItem::getIndex()
 	}
 }
 
-void CTradeWindow::CTradeableItem::showAll(SDL_Surface * to)
+void CTradeWindow::CTradeableItem::showAll()
 {
 	Point posToBitmap;
 	Point posToSubCenter;
@@ -2062,10 +2063,10 @@ void CTradeWindow::CTradeableItem::showAll(SDL_Surface * to)
 	if (image)
 	{
 		image->moveTo(pos.topLeft() + posToBitmap);
-		CIntObject::showAll(to);
+		CIntObject::showAll();
 	}
 
-	printAtMiddleLoc(subtitle, posToSubCenter, FONT_SMALL, Colors::WHITE, to);
+//*	printAtMiddleLoc(subtitle, posToSubCenter, FONT_SMALL, Colors::WHITE, to);
 }
 
 void CTradeWindow::CTradeableItem::clickLeft(tribool down, bool previousState)
@@ -2119,7 +2120,7 @@ void CTradeWindow::CTradeableItem::clickLeft(tribool down, bool previousState)
 	}
 }
 
-void CTradeWindow::CTradeableItem::showAllAt(const Point &dstPos, const std::string &customSub, SDL_Surface * to)
+void CTradeWindow::CTradeableItem::showAllAt(const Point &dstPos, const std::string &customSub)
 {
 	Rect oldPos = pos;
 	std::string oldSub = subtitle;
@@ -2127,7 +2128,7 @@ void CTradeWindow::CTradeableItem::showAllAt(const Point &dstPos, const std::str
 
 	moveTo(dstPos);
 	subtitle = customSub;
-	showAll(to);
+	showAll();
 
 	downSelection = false;
 	moveTo(oldPos.topLeft());
@@ -2457,10 +2458,10 @@ void CTradeWindow::initSubs(bool Left)
 	}
 }
 
-void CTradeWindow::showAll(SDL_Surface * to)
+void CTradeWindow::showAll()
 {
-	CWindowObject::showAll(to);
-
+	CWindowObject::showAll();
+/*
 	if(hRight)
 		CSDL_Ext::drawBorder(to,hRight->pos.x-1,hRight->pos.y-1,hRight->pos.w+2,hRight->pos.h+2,int3(255,231,148));
 	if(hLeft && hLeft->type != ARTIFACT_INSTANCE)
@@ -2471,6 +2472,7 @@ void CTradeWindow::showAll(SDL_Surface * to)
 		hLeft->showAllAt(pos.topLeft() + selectionOffset(true), selectionSubtitle(true), to);
 		hRight->showAllAt(pos.topLeft() + selectionOffset(false), selectionSubtitle(false), to);
 	}
+*/
 }
 
 void CTradeWindow::removeItems(const std::set<CTradeableItem *> &toRemove)
@@ -2559,7 +2561,7 @@ CMarketplaceWindow::CMarketplaceWindow(const IMarket *Market, const CGHeroInstan
 	madeTransaction = false;
 	bool sliderNeeded = true;
 
-	new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+//*	new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 
 	std::string title;
 
@@ -3050,7 +3052,7 @@ CAltarWindow::CAltarWindow(const IMarket *Market, const CGHeroInstance *Hero /*=
 	//Total experience on the Altar
 	new CTextBox(CGI->generaltexth->allTexts[476], Rect(15, 495, 125, 40), 0, FONT_SMALL, CENTER, Colors::YELLOW);
 
-	new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+//*	new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 
 	ok = new CAdventureMapButton(CGI->generaltexth->zelp[568],boost::bind(&CGuiHandler::popIntTotally,&GH,this),516,520,"IOK6432.DEF",SDLK_RETURN);
 	ok->assignedKeys.insert(SDLK_ESCAPE);
@@ -3340,17 +3342,17 @@ void CAltarWindow::artifactPicked()
 	redraw();
 }
 
-void CAltarWindow::showAll(SDL_Surface * to)
+void CAltarWindow::showAll()
 {
-	CTradeWindow::showAll(to);
+	CTradeWindow::showAll();
 	if(mode == EMarketMode::ARTIFACT_EXP && arts && arts->commonInfo->src.art)
 	{
 		artIcon->setFrame(arts->commonInfo->src.art->artType->iconIndex);
-		artIcon->showAll(to);
+		artIcon->showAll();
 
 		int dmp, val;
 		market->getOffer(arts->commonInfo->src.art->artType->id, 0, dmp, val, EMarketMode::ARTIFACT_EXP);
-		printAtMiddleLoc(boost::lexical_cast<std::string>(val), 304, 498, FONT_SMALL, Colors::WHITE, to);
+//*		printAtMiddleLoc(boost::lexical_cast<std::string>(val), 304, 498, FONT_SMALL, Colors::WHITE, to);
 	}
 }
 
@@ -3667,7 +3669,7 @@ CTavernWindow::CTavernWindow(const CGObjectInstance *TavernObj):
 	new CLabel(320, 328, FONT_SMALL, CENTER, Colors::WHITE, "2500");
 	new CTextBox(LOCPLINT->cb->getTavernGossip(tavernObj), Rect(32, 190, 330, 68), 0, FONT_SMALL, CENTER, Colors::WHITE);
 
-	new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+//*	new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 	cancel = new CAdventureMapButton(CGI->generaltexth->tavernInfo[7],"", boost::bind(&CTavernWindow::close, this), 310, 428, "ICANCEL.DEF", SDLK_ESCAPE);
 	recruit = new CAdventureMapButton("", "", boost::bind(&CTavernWindow::recruitb, this), 272, 355, "TPTAV01.DEF", SDLK_RETURN);
 	thiefGuild = new CAdventureMapButton(CGI->generaltexth->tavernInfo[5],"", boost::bind(&CTavernWindow::thievesguildb, this), 22, 428, "TPTAV02.DEF", SDLK_t);
@@ -3717,9 +3719,9 @@ CTavernWindow::~CTavernWindow()
 
 void CTavernWindow::show(SDL_Surface * to)
 {
-	CWindowObject::show(to);
+//*	CWindowObject::show(to);
 
-	CCS->videoh->update(pos.x+70, pos.y+56, to, true, false);
+	CCS->videoh->update(pos.x+70, pos.y+56, true, false);
 	if(selected >= 0)
 	{
 		HeroPortrait *sel = selected ? h2 : h1;
@@ -3735,7 +3737,7 @@ void CTavernWindow::show(SDL_Surface * to)
 		}
 
 		printAtMiddleWBLoc(sel->descr, 146, 395, FONT_SMALL, 200, Colors::WHITE, to);
-		CSDL_Ext::drawBorder(to,sel->pos.x-2,sel->pos.y-2,sel->pos.w+4,sel->pos.h+4,int3(247,223,123));
+//*		CSDL_Ext::drawBorder(to,sel->pos.x-2,sel->pos.y-2,sel->pos.w+4,sel->pos.h+4,int3(247,223,123));
 	}
 }
 
@@ -4010,7 +4012,7 @@ CGarrisonWindow::CGarrisonWindow( const CArmedInstance *up, const CGHeroInstance
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL;
 
-	garr = new CGarrisonInt(92, 127, 4, Point(0,96), background->bg, Point(93,127), up, down, removableUnits);
+//*	garr = new CGarrisonInt(92, 127, 4, Point(0,96), background->bg, Point(93,127), up, down, removableUnits);
 	{
 		CAdventureMapButton *split = new CAdventureMapButton(CGI->generaltexth->tcommands[3],"",boost::bind(&CGarrisonInt::splitClick,garr),88,314,"IDV6432.DEF");
 		removeChild(split);
@@ -4332,11 +4334,11 @@ void CArtPlace::deselect ()
 	ourOwner->safeRedraw();
 }
 
-void CArtPlace::showAll(SDL_Surface * to)
+void CArtPlace::showAll()
 {
 	if (ourArt && !picked && ourArt == ourOwner->curHero->getArt(slotID, false)) //last condition is needed for disassembling -> artifact may be gone, but we don't know yet TODO: real, nice solution
 	{
-		CIntObject::showAll(to);
+		CIntObject::showAll();
 	}
 
 	if(marked && active)
@@ -4344,15 +4346,15 @@ void CArtPlace::showAll(SDL_Surface * to)
 		// Draw vertical bars.
 		for (int i = 0; i < pos.h; ++i)
 		{
-			CSDL_Ext::SDL_PutPixelWithoutRefresh(to, pos.x,             pos.y + i, 240, 220, 120);
-			CSDL_Ext::SDL_PutPixelWithoutRefresh(to, pos.x + pos.w - 1, pos.y + i, 240, 220, 120);
+//*			CSDL_Ext::SDL_PutPixelWithoutRefresh(to, pos.x,             pos.y + i, 240, 220, 120);
+//*			CSDL_Ext::SDL_PutPixelWithoutRefresh(to, pos.x + pos.w - 1, pos.y + i, 240, 220, 120);
 		}
 
 		// Draw horizontal bars.
 		for (int i = 0; i < pos.w; ++i)
 		{
-			CSDL_Ext::SDL_PutPixelWithoutRefresh(to, pos.x + i, pos.y,             240, 220, 120);
-			CSDL_Ext::SDL_PutPixelWithoutRefresh(to, pos.x + i, pos.y + pos.h - 1, 240, 220, 120);
+//*			CSDL_Ext::SDL_PutPixelWithoutRefresh(to, pos.x + i, pos.y,             240, 220, 120);
+//*			CSDL_Ext::SDL_PutPixelWithoutRefresh(to, pos.x + i, pos.y + pos.h - 1, 240, 220, 120);
 		}
 	}
 }
@@ -5162,10 +5164,10 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2)
 	questlogButton[1] = new CAdventureMapButton(CGI->generaltexth->heroscrn[0], "", boost::bind(&CExchangeWindow::questlog,this, 1), 740, 44, "hsbtns4.def");
 
 	Rect barRect(5, 578, 725, 18);
-	ourBar = new CGStatusBar(new CPicture(*background, barRect, 5, 578, false));
+//*	ourBar = new CGStatusBar(new CPicture(*background, barRect, 5, 578, false));
 
 	//garrison interface
-	garr = new CGarrisonInt(69, 131, 4, Point(418,0), *background, Point(69,131), heroInst[0],heroInst[1], true, true);
+//*	garr = new CGarrisonInt(69, 131, 4, Point(418,0), *background, Point(69,131), heroInst[0],heroInst[1], true, true);
 	garr->addSplitBtn(new CAdventureMapButton(CGI->generaltexth->tcommands[3], "", boost::bind(&CGarrisonInt::splitClick, garr),  10, 132, "TSBTNS.DEF"));
 	garr->addSplitBtn(new CAdventureMapButton(CGI->generaltexth->tcommands[3], "", boost::bind(&CGarrisonInt::splitClick, garr), 740, 132, "TSBTNS.DEF"));
 }
@@ -5213,7 +5215,7 @@ CShipyardWindow::CShipyardWindow(const std::vector<si32> &cost, int state, int b
 		}
 	}
 
-	statusBar = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+//*	statusBar = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 
 	title =     new CLabel(164, 27,  FONT_BIG,    CENTER, Colors::YELLOW, CGI->generaltexth->jktexts[13]);
 	costLabel = new CLabel(164, 220, FONT_MEDIUM, CENTER, Colors::WHITE,   CGI->generaltexth->jktexts[14]);
@@ -5256,20 +5258,20 @@ CPuzzleWindow::CPuzzleWindow(const int3 &GrailPos, double discoveredRatio):
 	}
 }
 
-void CPuzzleWindow::showAll(SDL_Surface * to)
+void CPuzzleWindow::showAll()
 {
 	int3 moveInt = int3(8, 9, 0);
 	Rect mapRect = genRect(544, 591, pos.x + 8, pos.y + 7);
-
+/*
 	CGI->mh->terrainRect
 		(grailPos - moveInt, adventureInt->anim,
 		 &LOCPLINT->cb->getVisibilityMap(), true, adventureInt->heroAnim,
 		 to, &mapRect, 0, 0, true, moveInt);
-
-	CWindowObject::showAll(to);
+*/
+	CWindowObject::showAll();
 }
 
-void CPuzzleWindow::show(SDL_Surface * to)
+void CPuzzleWindow::show()
 {
 	static int animSpeed = 2;
 
@@ -5287,7 +5289,7 @@ void CPuzzleWindow::show(SDL_Surface * to)
 			piece->setAlpha(currentAlpha);
 		currentAlpha -= animSpeed;
 	}
-	CWindowObject::show(to);
+	CWindowObject::show();
 }
 
 void CTransformerWindow::CItem::move()
@@ -5304,7 +5306,7 @@ void CTransformerWindow::CItem::clickLeft(tribool down, bool previousState)
 	if(previousState && (!down))
 	{
 		move();
-		parent->showAll(screen2);
+		parent->showAll();
 	}
 }
 
@@ -5340,7 +5342,7 @@ void CTransformerWindow::addAll()
 	for (int i=0; i<items.size(); i++)
 		if (items[i]->left)
 			items[i]->move();
-	showAll(screen2);
+	showAll();
 }
 
 void CTransformerWindow::updateGarrisons()
@@ -5369,7 +5371,7 @@ CTransformerWindow::CTransformerWindow(const CGHeroInstance * _hero, const CGTow
 	all    = new CAdventureMapButton(CGI->generaltexth->zelp[590],boost::bind(&CTransformerWindow::addAll,this),     146,416,"ALTARMY.DEF",SDLK_a);
 	convert= new CAdventureMapButton(CGI->generaltexth->zelp[591],boost::bind(&CTransformerWindow::makeDeal,this),   269,416,"ALTSACR.DEF",SDLK_RETURN);
 	cancel = new CAdventureMapButton(CGI->generaltexth->zelp[592],boost::bind(&CTransformerWindow::close, this),392,416,"ICANCEL.DEF",SDLK_ESCAPE);
-	bar    = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+//*	bar    = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 
 	new CLabel(153, 29,FONT_SMALL, CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[485]);//holding area
 	new CLabel(153+295, 29, FONT_SMALL, CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[486]);//transformer
@@ -5417,7 +5419,7 @@ int CUniversityWindow::CItem::state()
 	return 2;
 }
 
-void CUniversityWindow::CItem::showAll(SDL_Surface * to)
+void CUniversityWindow::CItem::showAll()
 {
 	CPicture * bar;
 	switch (state())
@@ -5433,12 +5435,12 @@ void CUniversityWindow::CItem::showAll(SDL_Surface * to)
 	}
 	assert(bar);
 
-	blitAtLoc(bar->bg, -28, -22, to);
-	blitAtLoc(bar->bg, -28,  48, to);
-	printAtMiddleLoc  (CGI->generaltexth->skillName[ID], 22, -13, FONT_SMALL, Colors::WHITE,to);//Name
-	printAtMiddleLoc  (CGI->generaltexth->levels[0], 22, 57, FONT_SMALL, Colors::WHITE,to);//Level(always basic)
+//*	blitAtLoc(bar->bg, -28, -22, to);
+//*	blitAtLoc(bar->bg, -28,  48, to);
+//*	printAtMiddleLoc  (CGI->generaltexth->skillName[ID], 22, -13, FONT_SMALL, Colors::WHITE,to);//Name
+//*	printAtMiddleLoc  (CGI->generaltexth->levels[0], 22, 57, FONT_SMALL, Colors::WHITE,to);//Level(always basic)
 
-	CAnimImage::showAll(to);
+	CAnimImage::showAll();
 }
 
 CUniversityWindow::CItem::CItem(CUniversityWindow * _parent, int _ID, int X, int Y):
@@ -5489,7 +5491,7 @@ CUniversityWindow::CUniversityWindow(const CGHeroInstance * _hero, const IMarket
 	cancel = new CAdventureMapButton(CGI->generaltexth->zelp[632],
 		boost::bind(&CUniversityWindow::close, this),200,313,"IOKAY.DEF",SDLK_RETURN);
 
-	bar = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+//*	bar = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 }
 
 CUnivConfirmWindow::CUnivConfirmWindow(CUniversityWindow * PARENT, int SKILL, bool available ):
@@ -5526,7 +5528,7 @@ CUnivConfirmWindow::CUnivConfirmWindow(CUniversityWindow * PARENT, int SKILL, bo
 
 	cancel = new CAdventureMapButton(CGI->generaltexth->zelp[631],boost::bind(&CUnivConfirmWindow::close, this),
 	         252,299,"ICANCEL.DEF",SDLK_ESCAPE);
-	bar = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+//*	bar = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 }
 
 void CUnivConfirmWindow::makeDeal(int skill)
@@ -5567,9 +5569,9 @@ CHillFortWindow::CHillFortWindow(const CGHeroInstance *visitor, const CGObjectIn
 	upgradeAll = new CAdventureMapButton(CGI->generaltexth->allTexts[432],"",boost::bind(&CHillFortWindow::makeDeal, this, SlotID(slotsCount)),
 	                                    30, 231, "", SDLK_0, &files);
 	quit = new CAdventureMapButton("","",boost::bind(&CHillFortWindow::close, this), 294, 275, "IOKAY.DEF", SDLK_RETURN);
-	bar = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+//*	bar = new CGStatusBar(new CPicture(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 
-	garr = new CGarrisonInt(108, 60, 18, Point(),background->bg,Point(108,60),hero,NULL);
+//*	garr = new CGarrisonInt(108, 60, 18, Point(),background->bg,Point(108,60),hero,NULL);
 	updateGarrisons();
 }
 
@@ -5632,9 +5634,9 @@ void CHillFortWindow::makeDeal(SlotID slot)
 	}
 }
 
-void CHillFortWindow::showAll (SDL_Surface *to)
+void CHillFortWindow::showAll()
 {
-	CWindowObject::showAll(to);
+	CWindowObject::showAll();
 
 	for ( int i=0; i<slotsCount; i++)
 	{
@@ -5648,15 +5650,15 @@ void CHillFortWindow::showAll (SDL_Surface *to)
 					int val = costs[i][j];
 					if(!val) continue;
 
-					blitAtLoc(resources->ourImages[j].bitmap, 104+76*i, curY, to);
-					printToLoc(boost::lexical_cast<std::string>(val), 168+76*i, curY+16, FONT_SMALL, Colors::WHITE, to);
+//*					blitAtLoc(resources->ourImages[j].bitmap, 104+76*i, curY, to);
+//*					printToLoc(boost::lexical_cast<std::string>(val), 168+76*i, curY+16, FONT_SMALL, Colors::WHITE, to);
 					curY += 20;
 				}
 			}
 			else//free upgrade - print gold image and "Free" text
 			{
-				blitAtLoc(resources->ourImages[6].bitmap, 104+76*i, 128, to);
-				printToLoc(CGI->generaltexth->allTexts[344], 168+76*i, 144, FONT_SMALL, Colors::WHITE, to);
+//*				blitAtLoc(resources->ourImages[6].bitmap, 104+76*i, 128, to);
+//*				printToLoc(CGI->generaltexth->allTexts[344], 168+76*i, 144, FONT_SMALL, Colors::WHITE, to);
 			}
 		}
 	}
@@ -5664,8 +5666,8 @@ void CHillFortWindow::showAll (SDL_Surface *to)
 	{
 		if (totalSumm[i])//this resource is used - display it
 		{
-			blitAtLoc(resources->ourImages[i].bitmap, 104+76*i, 237, to);
-			printToLoc(boost::lexical_cast<std::string>(totalSumm[i]), 166+76*i, 253, FONT_SMALL, Colors::WHITE, to);
+//*			blitAtLoc(resources->ourImages[i].bitmap, 104+76*i, 237, to);
+//*			printToLoc(boost::lexical_cast<std::string>(totalSumm[i]), 166+76*i, 253, FONT_SMALL, Colors::WHITE, to);
 		}
 	}
 }
@@ -6099,9 +6101,9 @@ CRClickPopup::~CRClickPopup()
 {
 }
 
-void CRClickPopupInt::show(SDL_Surface * to)
+void CRClickPopupInt::show()
 {
-	inner->show(to);
+	inner->show();
 }
 
 CRClickPopupInt::CRClickPopupInt( IShowActivatable *our, bool deleteInt )
@@ -6124,7 +6126,7 @@ CRClickPopupInt::~CRClickPopupInt()
 	CCS->curh->show();
 }
 
-void CRClickPopupInt::showAll(SDL_Surface * to)
+void CRClickPopupInt::showAll()
 {
-	inner->showAll(to);
+	inner->showAll();
 }

+ 19 - 19
client/GUIClasses.h

@@ -96,8 +96,8 @@ public:
 	void setDelComps(bool DelComps);
 	virtual void close();
 
-	void show(SDL_Surface * to);
-	void showAll(SDL_Surface * to);
+	void show();
+	void showAll();
 	void sliderMoved(int to);
 
 	CInfoWindow(std::string Text, PlayerColor player, const TCompsInfo &comps = TCompsInfo(), const TButtonsInfo &Buttons = TButtonsInfo(), bool delComps = true); //c-tor
@@ -145,8 +145,8 @@ public:
 	IShowActivatable *inner;
 	bool delInner;
 
-	void show(SDL_Surface * to);
-	void showAll(SDL_Surface * to);
+	void show();
+	void showAll();
 	CRClickPopupInt(IShowActivatable *our, bool deleteInt); //c-tor
 	virtual ~CRClickPopupInt(); //d-tor
 };
@@ -229,7 +229,7 @@ public:
 	bool selected; //if true, this component is selected
 	boost::function<void()> onSelect; //function called on selection change
 
-	void showAll(SDL_Surface * to);
+	void showAll();
 	void select(bool on);
 
 	void clickLeft(tribool down, bool previousState); //call-in
@@ -408,7 +408,7 @@ class CRecruitmentWindow : public CWindowObject
 
 		void clickLeft(tribool down, bool previousState);
 		void clickRight(tribool down, bool previousState);
-		void showAll(SDL_Surface *to);
+		void showAll();
 	public:
 		const CCreature * creature;
 		si32 amount;
@@ -451,7 +451,7 @@ class CRecruitmentWindow : public CWindowObject
 	void buy();
 	void sliderMoved(int to);
 
-	void showAll(SDL_Surface *to);
+	void showAll();
 public:
 	const CGDwelling * const dwelling;
 	CRecruitmentWindow(const CGDwelling *Dwelling, int Level, const CArmedInstance *Dst, const boost::function<void(CreatureID,int)> & Recruit, int y_offset = 0); //creatures - pairs<creature_ID,amount> //c-tor
@@ -609,11 +609,11 @@ public:
 		CFunctionList<void()> callback;
 		bool downSelection;
 
-		void showAllAt(const Point &dstPos, const std::string &customSub, SDL_Surface * to);
+		void showAllAt(const Point &dstPos, const std::string &customSub);
 
 		void clickRight(tribool down, bool previousState);
 		void hover (bool on);
-		void showAll(SDL_Surface * to);
+		void showAll();
 		void clickLeft(tribool down, bool previousState);
 		std::string getName(int number = -1) const;
 		CTradeableItem(Point pos, EType Type, int ID, bool Left, int Serial);
@@ -635,7 +635,7 @@ public:
 
 	CTradeWindow(std::string bgName, const IMarket *Market, const CGHeroInstance *Hero, EMarketMode::EMarketMode Mode); //c
 
-	void showAll(SDL_Surface * to);
+	void showAll();
 
 	void initSubs(bool Left);
 	void initTypes();
@@ -709,7 +709,7 @@ public:
 	void putOnAltar(int backpackIndex);
 	bool putOnAltar(CTradeableItem* altarSlot, const CArtifactInstance *art);
 	void makeDeal();
-	void showAll(SDL_Surface * to);
+	void showAll();
 
 	void blockTrade();
 	void sliderMoved(int to);
@@ -910,10 +910,10 @@ public:
 	CArtPlace(Point position, const CArtifactInstance * Art = NULL); //c-tor
 	void clickLeft(tribool down, bool previousState);
 	void clickRight(tribool down, bool previousState);
-	void select ();
-	void deselect ();
-	void showAll(SDL_Surface * to);
-	bool fitsHere (const CArtifactInstance * art) const; //returns true if given artifact can be placed here
+	void select();
+	void deselect();
+	void showAll();
+	bool fitsHere(const CArtifactInstance * art) const; //returns true if given artifact can be placed here
 
 	void setMeAsDest(bool backpackAsVoid = true);
 	void setArtifact(const CArtifactInstance *art);
@@ -1071,8 +1071,8 @@ private:
 	ui8 currentAlpha;
 
 public:
-	void showAll(SDL_Surface * to);
-	void show(SDL_Surface * to);
+	void showAll();
+	void show();
 
 	CPuzzleWindow(const int3 &grailPos, double discoveredRatio);
 };
@@ -1117,7 +1117,7 @@ class CUniversityWindow : public CWindowObject
 		int ID;//id of selected skill
 		CUniversityWindow * parent;
 
-		void showAll(SDL_Surface * to);
+		void showAll();
 		void clickLeft(tribool down, bool previousState);
 		void clickRight(tribool down, bool previousState);
 		void hover(bool on);
@@ -1171,7 +1171,7 @@ public:
 
 	CHillFortWindow(const CGHeroInstance *visitor, const CGObjectInstance *object); //c-tor
 
-	void showAll (SDL_Surface *to);
+	void showAll();
 	std::string getDefForSlot(SlotID slot);//return def name for this slot
 	std::string getTextForSlot(SlotID slot);//return hover text for this slot
 	void makeDeal(SlotID slot);//-1 for upgrading all creatures

+ 93 - 0
client/Gfx/Animations.cpp

@@ -0,0 +1,93 @@
+#include "StdInc.h"
+
+#include "Animations.h"
+#include "Images.h"
+#include "FilesHeaders.h"
+
+namespace Gfx
+{
+#define LE(x) SDL_SwapLE32(x)
+
+/*********** CAnimation ***********/
+
+CAnimation* CAnimation::makeFromDEF(const SH3DefFile& def, size_t fileSize)
+{
+	if (def.totalBlocks == 0 || def.width == 0 || def.height == 0) return nullptr;
+
+	if (def.fbEntrCount() == LE(1))
+	{
+		CImage* img = CImage::makeFromDEF(def, fileSize);
+
+		if (img == nullptr) return nullptr;
+		return new COneFrameAnimation(*img);
+	}
+
+	return new (LE(def.fbEntrCount())) CPalettedAnimation(def, fileSize);
+}
+
+
+CAnimation::~CAnimation() {}
+
+
+/*********** COneFrameAnimation ***********/
+
+COneFrameAnimation::COneFrameAnimation(CImage& img) :
+	CAnimation(1, img.getWidth(), img.getHeight()),
+	frame(img)
+{
+}
+
+
+COneFrameAnimation::~COneFrameAnimation()
+{
+	delete &frame;
+}
+
+
+CImage* COneFrameAnimation::getFrame(ui32 fnr)
+{
+	if (fnr == 0) return &frame;
+	return nullptr;
+}
+
+
+/*********** CPalettedAnimation ***********/
+
+CPalettedAnimation::CPalettedAnimation(const SH3DefFile& def, size_t fileSize) :
+
+	CAnimation(LE(def.fbEntrCount()), LE(def.width), LE(def.height)),
+	
+	palette(def.palette, def.type == LE(71) ? 1 : 10, true)
+		//type == 71 - Buttons/buildings don't have shadows\semi-transparency
+{
+	ua_ui32_ptr offsets = def.firstBlock.offsets();
+
+	for (ui32 j=0; j<framesCount; ++j)
+	{
+		CPalettedBitmap* fr = CImage::makeFromDEFSprite(def.getSprite(offsets[j]), palette);
+		if (fr == nullptr)
+		{
+			framesCount = j;
+			break;
+		}
+		frames[j] = fr;
+	}
+}
+
+
+CPalettedAnimation::~CPalettedAnimation()
+{
+	for (ui32 j=0; j<framesCount; ++j)
+	{
+		delete frames[j];
+	}
+}
+
+
+CImage* CPalettedAnimation::getFrame(ui32 fnr)
+{
+	if (fnr >= framesCount) return nullptr;
+	return frames[fnr];
+}
+
+}

+ 70 - 0
client/Gfx/Animations.h

@@ -0,0 +1,70 @@
+#pragma once
+
+#include "CPaletteRGBA.h"
+
+namespace Gfx
+{
+struct SH3DefFile;
+class CImage;
+
+
+class CAnimation
+{
+protected:
+	ui32 framesCount;
+	ui32 width;
+	ui32 height;
+
+	inline CAnimation(ui32 fc, ui32 w, ui32 h) : framesCount(fc), width(w), height(h) {};
+
+public:
+	static CAnimation* makeFromDEF(const SH3DefFile& def, size_t fileSize);
+
+	virtual ~CAnimation();
+	virtual CImage* getFrame(ui32 fnr) = 0;
+
+	inline ui32 getFramesCount() { return framesCount; };
+	inline ui32 getWidth() { return width; };
+	inline ui32 getHeight() { return height; };
+};
+
+
+class COneFrameAnimation : CAnimation
+{
+	friend class CAnimation;
+	CImage& frame;
+
+protected:
+	COneFrameAnimation(CImage& img);
+
+public:
+	virtual ~COneFrameAnimation();
+	virtual CImage* getFrame(ui32 fnr);
+};
+
+
+#pragma warning(disable : 4200)
+
+class CPalettedAnimation : CAnimation
+{
+	friend class CAnimation;
+	CPaletteRGBA palette;
+	CImage* frames[];
+
+protected:
+	inline void* operator new(size_t size, ui32 frCount) {
+		return ::operator new(size + frCount * sizeof(void*));
+	}
+	inline void operator delete(void* ptr, ui32 frCount) {
+		::operator delete(ptr);
+	}
+	CPalettedAnimation(const SH3DefFile& def, size_t fileSize);
+
+public:
+	virtual ~CPalettedAnimation();
+	virtual CImage* getFrame(ui32 fnr);
+};
+
+#pragma warning(default : 4200)
+
+}

+ 63 - 0
client/Gfx/CPaletteRGBA.cpp

@@ -0,0 +1,63 @@
+#include "StdInc.h"
+#include <SDL_opengl.h>
+#include "CPaletteRGBA.h"
+
+
+namespace Gfx
+{
+
+CPaletteRGBA::CPaletteRGBA(const ColorRGBA palBuff[]) : texHandle(0), shared(false)
+{
+	memcpy(buffer, palBuff, 256);
+}
+
+
+CPaletteRGBA::CPaletteRGBA(const ui8 palBuff[][3], int alphaMode, bool shr) : texHandle(0), shared(shr)
+{
+	static const ui8 defPalette[10][4] = {{0,0,0,0}, {0,0,0,32}, {0,0,0,64}, {0,0,0,128}, {0,0,0,128},
+		{255,255,255,0}, {255,255,255,0}, {255,255,255,0}, {0,0,0,192}, {0,0,0,192}};
+
+	if (alphaMode > 0)
+	{
+		if (alphaMode > 10) alphaMode = 10;
+		memcpy(buffer, defPalette, alphaMode*sizeof(ColorRGBA));
+	}
+
+	for (ui32 it = alphaMode; it<256; ++it)
+	{
+		memcpy(&buffer[it], palBuff[it], 3);
+		buffer[it].comp.A = 255;
+	}
+}
+
+
+CPaletteRGBA::~CPaletteRGBA()
+{
+	unloadFromVideoRAM();
+}
+
+
+void CPaletteRGBA::Unlink()
+{
+	if (!shared) delete this;
+}
+
+
+void CPaletteRGBA::loadToVideoRAM()
+{
+	if (texHandle > 0) return;
+	glGenTextures(1, &texHandle);
+	glBindTexture(GL_TEXTURE_1D, texHandle);
+	glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA8, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
+}
+
+
+void CPaletteRGBA::unloadFromVideoRAM()
+{
+	glDeleteTextures(1, &texHandle);
+	texHandle = 0;
+}
+
+
+}

+ 46 - 0
client/Gfx/CPaletteRGBA.h

@@ -0,0 +1,46 @@
+#pragma once
+
+namespace Gfx
+{
+
+#pragma pack(1)
+
+typedef ui8 ColorRGB[3]; // 24bit RGB color
+
+union ColorRGBA // 32bit RGBA color
+{
+	ui32 color32;
+	ui8 arr[4];
+	struct {
+		ui8 R,G,B,A;
+	} comp;
+
+	inline ColorRGBA() {};
+	inline ColorRGBA(ui32 c) : color32(c) {};
+};
+
+#pragma pack()
+
+
+class CPaletteRGBA
+{
+	friend class CPalettedAnimation;
+
+	ui32 texHandle; // OpenGL texture handle
+	bool shared;
+	ColorRGBA buffer[256];
+
+	~CPaletteRGBA();
+
+public:
+	CPaletteRGBA(const ColorRGBA palBuff[]); // 32bit RGBA source
+	CPaletteRGBA(const ColorRGB palBuff[], int alphaMode, bool shr=false); // 24-bit RGB source
+
+	void Unlink();
+
+	inline ui32 getTexHandle() { return texHandle; };
+	void loadToVideoRAM();
+	void unloadFromVideoRAM();
+};
+
+}

+ 81 - 0
client/Gfx/FilesHeaders.h

@@ -0,0 +1,81 @@
+#pragma once
+
+#include <SDL_endian.h>
+#include "CPaletteRGBA.h"
+
+
+namespace Gfx
+{
+#define RGB_PALETTE_SIZE 0x300
+#define H3PCX_HEADER_SIZE sizeof(SH3PcxFile)
+#define H3DEF_HEADER_SIZE sizeof(SH3DefFile)
+
+#define SELF_ADDR reinterpret_cast<const ui8*>(this)
+
+#pragma pack(1)
+#pragma warning(disable : 4200)
+
+struct SH3PcxFile
+{
+	ui32 size;
+	ui32 width;
+	ui32 height;
+	ui8 data[];
+
+	// palette = last 256*3 bytes of PCX
+	inline const ColorRGB* palette(size_t sizeOfPcx) const {
+		return (ColorRGB*) (SELF_ADDR + sizeOfPcx - RGB_PALETTE_SIZE);
+	}
+};
+
+
+struct SH3DefSprite
+{
+	ui32 size;
+	ui32 format;    /// format in which pixel data is stored
+	ui32 fullWidth; /// full width and height of frame, including borders
+	ui32 fullHeight;
+	ui32 width;     /// width and height of pixel data, borders excluded
+	ui32 height;
+	si32 leftMargin;
+	si32 topMargin;
+	ui8 data[];
+};
+
+
+struct SH3DefBlock {
+	ui32 id;
+	ui32 entriesCount;
+	ui32 unknown1;
+	ui32 unknown2;
+	char names[][13];	// [entriesCount][13] - array of frames names
+
+	inline const ua_ui32_ptr offsets() const {
+		return (ua_ui32_ptr)(names + SDL_SwapLE32(entriesCount));
+	}	// array of offsets of frames
+};
+
+
+struct SH3DefFile {
+	ui32 type;
+	ui32 width;
+	ui32 height;
+	ui32 totalBlocks;
+	ColorRGB palette[256];
+
+	// SDefHeader is followed by a series of SH3DefBlock
+	SH3DefBlock firstBlock;
+
+	// Number of entries (sprites) in first block
+	inline ui32 fbEntrCount() const { return firstBlock.entriesCount; };
+
+	inline SH3DefSprite& getSprite(ui32 offset) const {
+		return *(SH3DefSprite*) (SELF_ADDR + offset);
+	}
+};
+
+#pragma warning(default : 4200)
+#pragma pack()
+
+#undef SELF_ADDR
+}

+ 440 - 0
client/Gfx/Images.cpp

@@ -0,0 +1,440 @@
+#include "StdInc.h"
+#include <SDL_opengl.h>
+#include <SDL_endian.h>
+#include "Images.h"
+
+namespace Gfx
+{
+
+/*********** CImage ***********/
+
+CImage::~CImage()
+{
+	unloadFromVideoRAM();
+}
+
+
+void CImage::loadToVideoRAM()
+{
+	if (texHandle > 0) return;
+	glGenTextures(1, &texHandle);
+	glBindTexture(GL_TEXTURE_RECTANGLE, texHandle);
+	textureTransfer();
+}
+
+
+void CImage::unloadFromVideoRAM()
+{
+	glDeleteTextures(1, &texHandle);
+	texHandle = 0;
+}
+
+
+void CImage::bindTexture()
+{
+	if (texHandle > 0)
+	{
+		glBindTexture(GL_TEXTURE_RECTANGLE, texHandle);
+		return;
+	}
+	glGenTextures(1, &texHandle);
+	glBindTexture(GL_TEXTURE_RECTANGLE, texHandle);
+	textureTransfer();
+}
+
+
+
+/*********** CBitmap32::QuadInstance ***********/
+
+CBitmap32::QuadInstance::QuadInstance(Point p) : coords()
+{
+	for (int i=0; i<4; ++i) coords[i].vertex = p;
+}
+
+
+void CBitmap32::QuadInstance::setOffset(TransformFlags flags, si32 x, si32 y)
+{
+	if (flags & ROTATE_90_DEG)
+	{
+	}
+	else
+	{
+	}
+}
+
+
+void CBitmap32::QuadInstance::transform(TransformFlags flags, ui32 w0, ui32 h0, ui32 w, ui32 h)
+{
+	if (flags & MIRROR_HORIZ)
+	{
+		coords[0].vertex.x += w;
+		coords[3].vertex.x += w;
+	}
+	else
+	{
+		coords[1].vertex.x += w;
+		coords[2].vertex.x += w;
+	}
+
+	if (flags & MIRROR_VERTIC)
+	{
+		coords[0].vertex.y += h;
+		coords[1].vertex.y += h;
+	}
+	else
+	{
+		coords[2].vertex.y += h;
+		coords[3].vertex.y += h;
+	}
+
+	if (flags & ROTATE_90_DEG)
+	{
+		coords[0].texture.x = w0;
+		coords[1].texture.x = w0;
+		coords[1].texture.y = h0;
+		coords[2].texture.y = h0;
+	}
+	else
+	{
+		coords[1].texture.x = w0;
+		coords[2].texture.x = w0;
+		coords[2].texture.y = h0;
+		coords[3].texture.y = h0;
+	}
+}
+
+
+void CBitmap32::QuadInstance::putToGL() const
+{
+	glBegin(GL_QUADS);
+	for (int i=0; i<4; ++i)
+	{
+		const CoordBind& row = coords[i];
+		glTexCoord2i(row.texture.x, row.texture.y);
+		glVertex2i(row.vertex.x, row.vertex.y);
+	}
+	glEnd();
+}
+
+
+/*********** CBitmap32 ***********/
+
+CBitmap32::CBitmap32(ui32 w, ui32 h, const ColorRGB pixBuff[]) : CImage(w, h)
+{
+	const ui32 size = w * h;
+	buffer = new ColorRGBA[size];
+
+	for (ui32 it=0; it<size; ++it)
+	{
+		memcpy(&buffer[it], &pixBuff[it], 3);
+		buffer[it].comp.A = 255;
+	}
+}
+
+
+CBitmap32::~CBitmap32()
+{
+	delete buffer;
+}
+
+
+void CBitmap32::textureTransfer()
+{
+	glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
+}
+
+
+void CBitmap32::putAt(Point p)
+{
+	GL2D::useNoShader();
+	bindTexture();
+
+	glBegin(GL_QUADS);
+	glTexCoord2i(0, 0);
+	glVertex2i(p.x, p.y);
+	glTexCoord2i(width, 0);
+	glVertex2i(p.x + width, p.y);
+	glTexCoord2i(width, height);
+	glVertex2i(p.x + width, p.y + height);
+	glTexCoord2i(0, height);
+	glVertex2i(p.x, p.y + height);
+	glEnd();
+}
+
+
+void CBitmap32::putAt(Point p, TransformFlags flags)
+{
+	QuadInstance qi(p);
+	qi.transform(flags, width, height, width, height);
+
+	GL2D::useNoShader();
+	bindTexture();
+	qi.putToGL();
+}
+
+
+void CBitmap32::putAt(Point p, TransformFlags flags, float scale)
+{
+	QuadInstance qi(p);
+	qi.transform(flags, width, height, width*scale, height*scale);
+
+	GL2D::useNoShader();
+	bindTexture();
+	qi.putToGL();
+}
+
+
+void CBitmap32::putAt(Point p, TransformFlags flags, Rect clipRect)
+{
+	QuadInstance qi(p);
+	qi.setOffset(flags, clipRect.lt.x, clipRect.lt.y);
+	qi.transform(flags, clipRect.rb.x - p.x, clipRect.rb.y - p.y, clipRect.width(), clipRect.height());
+
+	GL2D::useNoShader();
+	bindTexture();
+	qi.putToGL();
+}
+
+
+void CBitmap32::putAt(Point p, TransformFlags flags, const ColorMatrix cm)
+{
+	QuadInstance qi(p);
+	qi.transform(flags, width, height, width, height);
+
+	GL2D::useColorizeShader(cm);
+	bindTexture();
+	qi.putToGL();
+}
+
+
+void CBitmap32::putWithPlrColor(Point p, ColorRGBA c)
+{
+	putAt(p);
+}
+
+
+void CBitmap32::putWithPlrColor(Point p, ColorRGBA c, float scale)
+{
+	putAt(p, NONE, scale);
+}
+
+
+/*********** CPalettedBitmap ***********/
+
+CPalettedBitmap::CPalettedBitmap(ui32 w, ui32 h, CPaletteRGBA& pal, const ui8 pixBuff[]) :
+	CImage(w, h),
+	palette(pal)
+{
+	const ui32 rowStride = (w + 3) & ~3;
+	const ui32 size = rowStride * h;
+	buffer = new ui8[size];
+
+	if (rowStride == w)
+	{
+		memcpy(buffer, pixBuff, size);
+		return;
+	}
+
+	for (ui32 y=0; y<h; ++y)
+	{
+		memset(&buffer[rowStride*(y+1)-4], 0, 4);
+		memcpy(&buffer[rowStride*y], &pixBuff[w*y], w);
+	}
+	width = rowStride;
+}
+
+
+CPalettedBitmap::CPalettedBitmap(ui32 w, ui32 h, CPaletteRGBA& pal, const ui8 pixBuff[], ui32 format) :
+	CImage(w, h),
+	palette(pal)
+{
+	const ui32 rowStride = (w + 3) & ~3;
+	buffer = new ui8[rowStride * h];
+
+	switch (format)
+	{
+	case 1:
+		{
+			const ua_ui32_ptr rowsOffsets = (ua_ui32_ptr)pixBuff;
+
+			for (ui32 y=0; y<h; ++y)
+			{
+				const ui8*	srcRowPtr = pixBuff + SDL_SwapLE32(rowsOffsets[y]);
+				ui8*		dstRowPtr = buffer + (y * rowStride);
+
+				ui32 rowLength = 0;
+				do {
+					ui8 segmentType = *(srcRowPtr++);
+					size_t segmentLength = *(srcRowPtr++) + 1;
+
+					if (segmentType == 0xFF)
+					{
+						memcpy(dstRowPtr, srcRowPtr, segmentLength);
+						srcRowPtr += segmentLength;
+					}
+					else
+					{
+						memset(dstRowPtr, segmentType, segmentLength);
+					}
+					dstRowPtr += segmentLength;
+					rowLength += segmentLength;
+				}
+				while (rowLength < w);
+			}
+			return;
+		}
+	default:
+		return;
+	}
+}
+
+
+CPalettedBitmap::~CPalettedBitmap()
+{
+	delete buffer;
+	palette.Unlink();
+}
+
+
+void CPalettedBitmap::textureTransfer()
+{
+	glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_R8UI, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, buffer);
+	palette.loadToVideoRAM();
+}
+
+
+void CPalettedBitmap::putAt(Point p)
+{
+	loadToVideoRAM();
+	GL2D::assignTexture(GL_TEXTURE1, GL_TEXTURE_1D, palette.getTexHandle());
+	GL2D::assignTexture(GL_TEXTURE0, GL_TEXTURE_RECTANGLE, texHandle);
+	GL2D::usePaletteBitmapShader(p.x, p.y);
+	glRecti(p.x, p.y, p.x + width, p.y + height);
+}
+
+
+void CPalettedBitmap::putAt(Point p, TransformFlags flags)
+{
+	putAt(p);
+}
+
+
+void CPalettedBitmap::putAt(Point p, TransformFlags flags, float scale)
+{
+	loadToVideoRAM();
+	GL2D::assignTexture(GL_TEXTURE1, GL_TEXTURE_1D, palette.getTexHandle());
+	GL2D::assignTexture(GL_TEXTURE0, GL_TEXTURE_RECTANGLE, texHandle);
+	GL2D::usePaletteBitmapShader(p.x, p.y);
+	glRecti(p.x, p.y, p.x + width*scale, p.y + height*scale);
+}
+
+
+void CPalettedBitmap::putAt(Point p, TransformFlags flags, Rect clipRect)
+{
+	putAt(p);
+}
+
+
+void CPalettedBitmap::putAt(Point p, TransformFlags flags, const ColorMatrix cm)
+{
+	loadToVideoRAM();
+	GL2D::assignTexture(GL_TEXTURE1, GL_TEXTURE_1D, palette.getTexHandle());
+	GL2D::assignTexture(GL_TEXTURE0, GL_TEXTURE_RECTANGLE, texHandle);
+	GL2D::usePaletteBitmapShader(p.x, p.y, cm);
+	glRecti(p.x, p.y, p.x + width, p.y + height);
+}
+
+
+void CPalettedBitmap::putWithPlrColor(Point p, ColorRGBA c)
+{
+	putAt(p);
+}
+
+
+void CPalettedBitmap::putWithPlrColor(Point p, ColorRGBA c, float scale)
+{
+	putAt(p, NONE, scale);
+}
+
+
+/*********** CPalBitmapWithMargin ***********/
+
+CPalBitmapWithMargin::CPalBitmapWithMargin(ui32 fw, ui32 fh, ui32 lm, ui32 tm, ui32 iw, ui32 ih,
+										   CPaletteRGBA& pal, const ui8 pixBuff[]) :
+	CPalettedBitmap(iw, ih, pal, pixBuff),
+	leftMargin(lm), topMargin(tm),
+	intWidth(iw), intHeight(ih)
+{
+	width = fw;
+	height = fh;
+}
+
+
+void CPalBitmapWithMargin::textureTransfer()
+{
+	glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_R8UI, intWidth, intHeight, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, buffer);
+	palette.loadToVideoRAM();
+}
+
+
+CPalBitmapWithMargin::CPalBitmapWithMargin(ui32 fw, ui32 fh, ui32 lm, ui32 tm, ui32 iw, ui32 ih,
+										   CPaletteRGBA& pal, const ui8 pixBuff[], ui32 format) :
+	CPalettedBitmap(iw, ih, pal, pixBuff, format),
+	leftMargin(lm), topMargin(tm),
+	intWidth(iw), intHeight(ih)
+{
+	width = fw;
+	height = fh;
+}
+
+
+void CPalBitmapWithMargin::putAt(Point p)
+{
+	loadToVideoRAM();
+	GL2D::assignTexture(GL_TEXTURE1, GL_TEXTURE_1D, palette.getTexHandle());
+	GL2D::assignTexture(GL_TEXTURE0, GL_TEXTURE_RECTANGLE, texHandle);
+	GL2D::usePaletteBitmapShader(p.x, p.y);
+	glRecti(p.x, p.y, p.x + intWidth, p.y + intHeight);
+}
+
+
+void CPalBitmapWithMargin::putAt(Point p, TransformFlags flags)
+{
+	putAt(p);
+}
+
+
+void CPalBitmapWithMargin::putAt(Point p, TransformFlags flags, float scale)
+{
+	putAt(p);
+}
+
+
+void CPalBitmapWithMargin::putAt(Point p, TransformFlags flags, Rect clipRect)
+{
+	putAt(p);
+}
+
+
+void CPalBitmapWithMargin::putAt(Point p, TransformFlags flags, const ColorMatrix cm)
+{
+	loadToVideoRAM();
+	GL2D::assignTexture(GL_TEXTURE1, GL_TEXTURE_1D, palette.getTexHandle());
+	GL2D::assignTexture(GL_TEXTURE0, GL_TEXTURE_RECTANGLE, texHandle);
+	GL2D::usePaletteBitmapShader(p.x, p.y, cm);
+	glRecti(p.x, p.y, p.x + width, p.y + height);
+}
+
+
+void CPalBitmapWithMargin::putWithPlrColor(Point p, ColorRGBA c)
+{
+	putAt(p);
+}
+
+
+void CPalBitmapWithMargin::putWithPlrColor(Point p, ColorRGBA c, float scale)
+{
+	putAt(p, NONE, scale);
+}
+
+}

+ 164 - 0
client/Gfx/Images.h

@@ -0,0 +1,164 @@
+#pragma once
+
+#include "CPaletteRGBA.h"
+#include "../UIFramework/GL2D.h"
+
+
+namespace Gfx
+{
+
+struct Point
+{
+	si32 x;
+	si32 y;
+
+	inline Point() {};
+	inline Point(si32 _x, si32 _y) : x(_x), y(_y) {};
+};
+
+struct Rect
+{
+	Point lt;
+	Point rb;
+
+	inline ui32 width() { return rb.x - lt.x; };
+	inline ui32 height() { return rb.y - lt.y; };
+};
+
+
+enum TransformFlags
+{
+	NONE = 0,
+	MIRROR_HORIZ = 1,
+	MIRROR_VERTIC = 2,
+	ROTATE_90_DEG = 4
+};
+
+/* Color transform matrix for: grayscale, clone, bloodlust, etc */
+typedef float ColorMatrix[4][4];
+
+
+class CImage
+{
+protected:
+	ui32 texHandle;
+	ui32 width;
+	ui32 height;
+
+	inline CImage(ui32 w, ui32 h) : texHandle(0), width(w), height(h) {};
+	virtual void textureTransfer() = 0;
+
+public:
+	static CImage* makeFromPCX(const struct SH3PcxFile& pcx, size_t fileSize);
+	static CImage* makeFromDEF(const struct SH3DefFile& def, size_t fileSize);
+	static class CPalettedBitmap* makeFromDEFSprite(
+						const struct SH3DefSprite& spr, CPaletteRGBA& pal);
+
+	virtual ~CImage();
+
+	inline ui32 getWidth() { return width; };
+	inline ui32 getHeight() { return height; };
+
+	void loadToVideoRAM();
+	void unloadFromVideoRAM();
+	void bindTexture();
+
+	virtual void putAt(Point p) = 0;
+	virtual void putAt(Point p, TransformFlags flags) = 0;
+	virtual void putAt(Point p, TransformFlags flags, float scale) = 0;
+	virtual void putAt(Point p, TransformFlags flags, Rect clipRect) = 0;
+	virtual void putAt(Point p, TransformFlags flags, const ColorMatrix cm) = 0;
+	virtual void putWithPlrColor(Point p, ColorRGBA c) = 0;
+	virtual void putWithPlrColor(Point p, ColorRGBA c, float scale) = 0;
+};
+
+
+class CBitmap32 : public CImage
+{
+	friend class CImage;
+	ColorRGBA* buffer;
+
+	struct CoordBind {
+		Point texture, vertex;
+		inline CoordBind() : texture(0, 0) {};
+	};
+
+	class QuadInstance {
+		CoordBind coords[4];
+	public:
+		QuadInstance(Point p);
+		QuadInstance(const CoordBind c[4]);
+		void setOffset(TransformFlags flags, si32 x, si32 y);
+		void transform(TransformFlags flags, ui32 w0, ui32 h0, ui32 w, ui32 h);
+		void putToGL() const;
+	};
+
+protected:
+	CBitmap32(ui32 w, ui32 h, const ColorRGB pixBuff[]); // 24bit RGB source
+	virtual void textureTransfer();
+
+public:
+	virtual ~CBitmap32();
+
+	virtual void putAt(Point p);
+	virtual void putAt(Point p, TransformFlags flags);
+	virtual void putAt(Point p, TransformFlags flags, float scale);
+	virtual void putAt(Point p, TransformFlags flags, Rect clipRect);
+	virtual void putAt(Point p, TransformFlags flags, const ColorMatrix cm);
+	virtual void putWithPlrColor(Point p, ColorRGBA c);
+	virtual void putWithPlrColor(Point p, ColorRGBA c, float scale);
+};
+
+
+class CPalettedBitmap : public CImage
+{
+	friend class CImage;
+
+protected:
+	CPaletteRGBA& palette;
+	ui8* buffer;
+
+	CPalettedBitmap(ui32 w, ui32 h, CPaletteRGBA& pal, const ui8 pixBuff[]);
+	CPalettedBitmap(ui32 w, ui32 h, CPaletteRGBA& pal, const ui8 pixBuff[], ui32 format);
+	virtual void textureTransfer();
+
+public:
+	virtual ~CPalettedBitmap();
+
+	virtual void putAt(Point p);
+	virtual void putAt(Point p, TransformFlags flags);
+	virtual void putAt(Point p, TransformFlags flags, float scale);
+	virtual void putAt(Point p, TransformFlags flags, Rect clipRect);
+	virtual void putAt(Point p, TransformFlags flags, const ColorMatrix cm);
+	virtual void putWithPlrColor(Point p, ColorRGBA c);
+	virtual void putWithPlrColor(Point p, ColorRGBA c, float scale);
+};
+
+
+class CPalBitmapWithMargin : public CPalettedBitmap
+{
+	friend class CImage;
+	ui32 leftMargin;
+	ui32 topMargin;
+	ui32 intWidth;
+	ui32 intHeight;
+
+protected:
+	CPalBitmapWithMargin(ui32 fw, ui32 fh, ui32 lm, ui32 tm, ui32 iw, ui32 ih,
+						 CPaletteRGBA& pal, const ui8 pixBuff[]);
+	CPalBitmapWithMargin(ui32 fw, ui32 fh, ui32 lm, ui32 tm, ui32 iw, ui32 ih,
+						 CPaletteRGBA& pal, const ui8 pixBuff[], ui32 format);
+	virtual void textureTransfer();
+
+public:
+	virtual void putAt(Point p);
+	virtual void putAt(Point p, TransformFlags flags);
+	virtual void putAt(Point p, TransformFlags flags, float scale);
+	virtual void putAt(Point p, TransformFlags flags, Rect clipRect);
+	virtual void putAt(Point p, TransformFlags flags, const ColorMatrix cm);
+	virtual void putWithPlrColor(Point p, ColorRGBA c);
+	virtual void putWithPlrColor(Point p, ColorRGBA c, float scale);
+};
+
+
+}

+ 82 - 0
client/Gfx/ImgMakers.cpp

@@ -0,0 +1,82 @@
+#include "StdInc.h"
+
+#include "Images.h"
+#include "FilesHeaders.h"
+
+
+namespace Gfx
+{
+#define LE(x) SDL_SwapLE32(x)
+
+/*********** H3 PCX image format ***********/
+
+CImage * CImage::makeFromPCX(const SH3PcxFile& pcx, size_t fileSize)
+{
+	ui32 imgSize = LE(pcx.size);
+	ui32 width = LE(pcx.width);
+	ui32 height = LE(pcx.height);
+
+	if (imgSize == width*height)
+	{
+		if (H3PCX_HEADER_SIZE + RGB_PALETTE_SIZE + imgSize > fileSize) return nullptr;
+
+		CPaletteRGBA* ppal = new CPaletteRGBA(pcx.palette(fileSize), 0);
+		return new CPalettedBitmap(width, height, *ppal, pcx.data);
+	}
+	if (imgSize == width*height*3)
+	{
+		if (H3PCX_HEADER_SIZE + imgSize > fileSize) return nullptr;
+
+		return new CBitmap32(width, height, (ColorRGB*)pcx.data);
+	}
+
+	return nullptr;
+}
+
+
+/*********** DEF animation frame ***********/
+
+CImage* CImage::makeFromDEF(const struct SH3DefFile& def, size_t fileSize)
+{
+	CPaletteRGBA* ppal = new CPaletteRGBA(def.palette, def.type == LE(71) ? 1 : 10);
+
+	CPalettedBitmap* img = makeFromDEFSprite(def.getSprite(def.firstBlock.offsets()[0]), *ppal);
+
+	if (img == nullptr) ppal->Unlink();
+
+	return img;
+}
+
+
+CPalettedBitmap* CImage::makeFromDEFSprite(const SH3DefSprite& spr, CPaletteRGBA& pal)
+{
+	ui32 format = LE(spr.format);
+	if (format > 3) return nullptr;
+
+	ui32 fullWidth = LE(spr.fullWidth);
+	ui32 fullHeight = LE(spr.fullHeight);
+	ui32 intWidth = LE(spr.width);
+	ui32 intHeight = LE(spr.height);
+	ui32 leftMargin = LE(spr.leftMargin);
+	ui32 topMargin = LE(spr.topMargin);
+
+	bool noMargins =  (leftMargin == 0 && topMargin == 0 && fullWidth == intWidth && fullHeight == intHeight);
+
+	if (format == 0)
+	{
+		if (noMargins)
+		{
+			return new CPalettedBitmap(fullWidth, fullHeight, pal, spr.data); 
+		}
+		return new CPalBitmapWithMargin(fullWidth, fullHeight, leftMargin, topMargin, intWidth, intHeight, pal, spr.data);
+	}
+
+	if (noMargins)
+	{
+		return new CPalettedBitmap(fullWidth, fullHeight, pal, spr.data, format); 
+	}
+	return new CPalBitmapWithMargin(fullWidth, fullHeight, leftMargin, topMargin, intWidth, intHeight, pal, spr.data, format);
+}
+
+
+}

+ 76 - 0
client/Gfx/Manager.cpp

@@ -0,0 +1,76 @@
+#include "StdInc.h"
+#include <map>
+
+#include "Manager.h"
+#include "Animations.h"
+#include "Images.h"
+#include "FilesHeaders.h"
+#include "../../lib/Filesystem/CResourceLoader.h"
+
+
+namespace Gfx
+{
+
+class Resources
+{
+	friend class CManager;
+	static std::map<std::string, PImage> images;
+	static std::map<std::string, PAnimation> anims;
+};
+
+std::map<std::string, PImage> Resources::images;
+std::map<std::string, PAnimation> Resources::anims;
+
+
+
+PImage CManager::getImage(const std::string& fname)
+{
+	PImage& img_ptr = Resources::images[fname];
+
+	if (img_ptr) return img_ptr;
+
+	ResourceID resImageId("DATA/" + fname, EResType::IMAGE);
+	auto stream = CResourceHandler::get()->load(resImageId);
+
+	auto streamSize = stream->getSize();
+	if (streamSize < H3PCX_HEADER_SIZE) return nullptr;
+	if (streamSize > 0x10000000) streamSize = 0x10000000;
+
+	std::unique_ptr<ui8[]> data(new ui8[(size_t)streamSize]);
+	auto readSize = stream->read(data.get(), streamSize);
+
+	assert(readSize == stream->getSize());
+
+	CImage* img_tmp = CImage::makeFromPCX(*(SH3PcxFile*)data.get(), (size_t)readSize);
+	if (img_tmp == nullptr) return nullptr;
+
+	return img_ptr = PImage(img_tmp);
+}
+
+
+PAnimation CManager::getAnimation(const std::string& fname)
+{
+	PAnimation& anim_ptr = Resources::anims[fname];
+
+	if (anim_ptr) return anim_ptr;
+
+	ResourceID resAnimId("SPRITES/" + fname, EResType::ANIMATION);
+	auto stream = CResourceHandler::get()->load(resAnimId);
+
+	auto streamSize = stream->getSize();
+	if (streamSize < H3DEF_HEADER_SIZE) return nullptr;
+	if (streamSize > 0x7FFFFFF0) streamSize = 0x7FFFFFF0;
+
+	std::unique_ptr<ui8[]> data(new ui8[(size_t)streamSize]);
+	auto readSize = stream->read(data.get(), streamSize);
+
+	assert(readSize == stream->getSize());
+
+	CAnimation* anim_tmp = CAnimation::makeFromDEF(*(SH3DefFile*)data.get(), (size_t)readSize);
+	if (anim_tmp == nullptr) return nullptr;
+
+	return anim_ptr = PAnimation(anim_tmp);
+}
+
+}
+

+ 21 - 0
client/Gfx/Manager.h

@@ -0,0 +1,21 @@
+#pragma once
+
+#include <memory>
+#include <string>
+
+namespace Gfx
+{
+class CImage;
+class CAnimation;
+
+typedef std::shared_ptr<CImage> PImage;
+typedef std::shared_ptr<CAnimation> PAnimation;
+
+class CManager
+{
+public:
+	static PImage getImage(const std::string& fname);
+	static PAnimation getAnimation(const std::string& fname);
+};
+
+}

+ 4 - 3
client/Graphics.cpp

@@ -193,7 +193,7 @@ CDefEssential * Graphics::loadHeroAnim( const std::string &name, const std::vect
 	}
 	for(size_t ff=0; ff<anim->ourImages.size(); ++ff)
 	{
-		CSDL_Ext::alphaTransform(anim->ourImages[ff].bitmap);
+		if (anim->ourImages[ff].bitmap != nullptr) CSDL_Ext::alphaTransform(anim->ourImages[ff].bitmap);
 	}
 	return anim;
 }
@@ -245,8 +245,9 @@ void Graphics::loadHeroFlags(std::pair<std::vector<CDefEssential *> Graphics::*,
 		}
 		for(size_t ff=0; ff<curImgs.size(); ++ff)
 		{
-			SDL_SetColorKey(curImgs[ff].bitmap, SDL_SRCCOLORKEY,
-				SDL_MapRGB(curImgs[ff].bitmap->format, 0, 255, 255)
+			if (curImgs[ff].bitmap != nullptr)
+				SDL_SetColorKey(curImgs[ff].bitmap, SDL_SRCCOLORKEY,
+					SDL_MapRGB(curImgs[ff].bitmap->format, 0, 255, 255)
 				);
 		}
 	}

+ 22 - 39
client/UIFramework/CCursorHandler.cpp

@@ -1,8 +1,10 @@
 #include "StdInc.h"
+#include <SDL.h>
 #include "CCursorHandler.h"
+#include "GL2D.h"
+#include "../Gfx/Animations.h"
+#include "../Gfx/Images.h"
 
-#include <SDL.h>
-#include "SDL_Extensions.h"
 #include "../CAnimation.h"
 #include "CGuiHandler.h"
 
@@ -16,24 +18,23 @@
  *
  */
 
-extern SDL_Surface * screen;
-
-void CCursorHandler::initCursor()
+CCursorHandler::CCursorHandler()
 {
 	xpos = ypos = 0;
 	type = ECursor::DEFAULT;
 	dndObject = nullptr;
 	currentCursor = nullptr;
 
-	help = CSDL_Ext::newSurface(40,40);
+//*	help = CSDL_Ext::newSurface(40,40);
 	SDL_ShowCursor(SDL_DISABLE);
 
 	changeGraphic(ECursor::ADVENTURE, 0);
 }
 
+
 void CCursorHandler::changeGraphic(ECursor::ECursorTypes type, int index)
 {
-	std::string cursorDefs[4] = { "CRADVNTR.DEF", "CRCOMBAT.DEF", "CRDEFLT.DEF", "CRSPELL.DEF" };
+	const std::string cursorDefs[4] = { "CRADVNTR", "CRCOMBAT", "CRDEFLT", "CRSPELL" };
 
 	if (type != this->type)
 	{
@@ -42,26 +43,20 @@ void CCursorHandler::changeGraphic(ECursor::ECursorTypes type, int index)
 		this->type = type;
 		this->frame = index;
 
-		delete currentCursor;
-		currentCursor = new CAnimImage(cursorDefs[int(type)], index);
-	}
-
-	if (frame != index)
-	{
-		frame = index;
-		currentCursor->setFrame(index);
+		currentCursor = Gfx::CManager::getAnimation(cursorDefs[type]);
 	}
+	frame = index;
 }
 
+
 void CCursorHandler::dragAndDropCursor(CAnimImage * object)
 {
-	if (dndObject)
-		delete dndObject;
+	if (dndObject) delete dndObject;
 
 	dndObject = object;
 }
 
-void CCursorHandler::cursorMove(const int & x, const int & y)
+void CCursorHandler::cursorMove(int x, int y)
 {
 	xpos = x;
 	ypos = y;
@@ -73,19 +68,14 @@ void CCursorHandler::drawWithScreenRestore()
 	int x = xpos, y = ypos;
 	shiftPos(x, y);
 
-	SDL_Rect temp_rect1 = genRect(40,40,x,y);
-	SDL_Rect temp_rect2 = genRect(40,40,0,0);
-	SDL_BlitSurface(screen, &temp_rect1, help, &temp_rect2);
-
 	if (dndObject)
 	{
 		dndObject->moveTo(Point(x - dndObject->pos.w/2, y - dndObject->pos.h/2));
-		dndObject->showAll(screen);
+		dndObject->showAll();
 	}
 	else
 	{
-		currentCursor->moveTo(Point(x,y));
-		currentCursor->showAll(screen);
+		currentCursor->getFrame(frame)->putAt(Gfx::Point(x, y));
 	}
 }
 
@@ -96,18 +86,14 @@ void CCursorHandler::drawRestored()
 
 	int x = xpos, y = ypos;
 	shiftPos(x, y);
-
-	SDL_Rect temp_rect = genRect(40, 40, x, y);
-	SDL_BlitSurface(help, NULL, screen, &temp_rect);
-	//blitAt(help,x,y);
 }
 
-void CCursorHandler::draw(SDL_Surface *to)
+void CCursorHandler::draw()
 {
-	currentCursor->moveTo(Point(xpos, ypos));
-	currentCursor->showAll(screen);
+	currentCursor->getFrame(frame)->putAt(Gfx::Point(xpos, ypos));
 }
 
+
 void CCursorHandler::shiftPos( int &x, int &y )
 {
 	if(( type == ECursor::COMBAT && frame != ECursor::COMBAT_POINTER) || type == ECursor::SPELLBOOK)
@@ -215,20 +201,17 @@ void CCursorHandler::shiftPos( int &x, int &y )
 	}
 }
 
+
 void CCursorHandler::centerCursor()
 {
-	this->xpos = (screen->w / 2.) - (currentCursor->pos.w / 2.);
-	this->ypos = (screen->h / 2.) - (currentCursor->pos.h / 2.);
-	SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
+	this->xpos = (GL2D::getScreenWidth()  - currentCursor->getWidth()) / 2;
+	this->ypos = (GL2D::getScreenHeight() - currentCursor->getHeight()) / 2;
+	SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);	
 	SDL_WarpMouse(this->xpos, this->ypos);
 	SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE);
 }
 
 CCursorHandler::~CCursorHandler()
 {
-	if(help)
-		SDL_FreeSurface(help);
-
-	delete currentCursor;
 	delete dndObject;
 }

+ 8 - 7
client/UIFramework/CCursorHandler.h

@@ -1,7 +1,8 @@
 #pragma once
 
+#include "../Gfx/Manager.h"
+
 class CAnimImage;
-struct SDL_Surface;
 
 /*
  * CCursorhandler.h, part of VCMI engine
@@ -27,9 +28,9 @@ namespace ECursor
 /// handles mouse cursor
 class CCursorHandler 
 {
-	SDL_Surface * help;
-	CAnimImage * currentCursor;
-	CAnimImage * dndObject; //if set, overrides currentCursor
+	Gfx::PImage help;
+	Gfx::PAnimation currentCursor;
+	CAnimImage* dndObject; // if set, overrides currentCursor
 	bool showing;
 
 public:
@@ -41,7 +42,7 @@ public:
 	size_t frame;
 
 	/// inits cursorHandler - run only once, it's not memleak-proof (rev 1333)
-	void initCursor();
+	CCursorHandler();
 
 	/// changes cursor graphic for type type (0 - adventure, 1 - combat, 2 - default, 3 - spellbook) and frame index (not used for type 3)
 	void changeGraphic(ECursor::ECursorTypes type, int index);
@@ -59,14 +60,14 @@ public:
 	/// Restore original image below cursor
 	void drawRestored();
 	/// Simple draw cursor
-	void draw(SDL_Surface *to);
+	void draw();
 
 	void shiftPos( int &x, int &y );
 	void hide() { showing=0; };
 	void show() { showing=1; };
 
 	/// change cursor's positions to (x, y)
-	void cursorMove(const int & x, const int & y);
+	void cursorMove(int x, int y);
 	/// Move cursor to screen center
 	void centerCursor();
 

+ 31 - 11
client/UIFramework/CGuiHandler.cpp

@@ -1,9 +1,11 @@
 #include "StdInc.h"
 #include "CGuiHandler.h"
+#include "GL2D.h"
 
 #include "SDL_Extensions.h"
 #include "CIntObject.h"
 #include "../CGameInfo.h"
+#include "../CPlayerInterface.h"
 #include "CCursorHandler.h"
 #include "../../lib/CThreadHelper.h"
 #include "../../lib/CConfigHandler.h"
@@ -141,13 +143,22 @@ IShowActivatable * CGuiHandler::topInt()
 		return listInt.front();
 }
 
+
 void CGuiHandler::totalRedraw()
 {
-	for(int i=0;i<objsToBlit.size();i++)
-		objsToBlit[i]->showAll(screen2);
-	blitAt(screen2,0,0,screen);
+	for (size_t i=0; i<objsToBlit.size(); ++i)
+		objsToBlit[i]->showAll();
+
+	if (settings["general"]["showfps"].Bool()) drawFPSCounter();
+
+	// draw the mouse cursor and update the screen
+	CCS->curh->drawWithScreenRestore();
+	CCS->curh->drawRestored();
+
+	SDL_GL_SwapBuffers();
 }
 
+
 void CGuiHandler::updateTime()
 {
 	int ms = mainFPSmng->getElapsedMilliseconds();
@@ -336,9 +347,9 @@ void CGuiHandler::handleMouseMotion(SDL_Event *sEvent)
 void CGuiHandler::simpleRedraw()
 {
 	//update only top interface and draw background
-	if(objsToBlit.size() > 1)
-		blitAt(screen2,0,0,screen); //blit background
-	objsToBlit.back()->show(screen); //blit active interface/window
+//*	if(objsToBlit.size() > 1)
+//*		blitAt(screen2,0,0,screen); //blit background
+	objsToBlit.back()->show(); //blit active interface/window
 }
 
 void CGuiHandler::handleMoveInterested( const SDL_MouseMotionEvent & motion )
@@ -375,14 +386,23 @@ void CGuiHandler::run()
 	inGuiThread.reset(new bool(true));
 	try
 	{
-		if(settings["video"]["fullscreen"].Bool())
+		GL2D::attachToCurrentThread();
+
+		if (settings["video"]["fullscreen"].Bool())
 			CCS->curh->centerCursor();
 
 		mainFPSmng->init(); // resets internal clock, needed for FPS manager
 		while(!terminate)
 		{
-			if(curInt)
-				curInt->update(); // calls a update and drawing process of the loaded game interface object at the moment
+			boost::unique_lock<boost::recursive_mutex> lock(*CPlayerInterface::pim); 
+
+			if (curInt) curInt->update();
+
+			// Handles mouse and key input
+			updateTime();
+			handleEvents();
+
+			totalRedraw(); 
 
 			mainFPSmng->framerateDelay(); // holds a constant FPS
 		}
@@ -500,7 +520,7 @@ void CGuiHandler::pushSDLEvent(int type, int usercode)
 CFramerateManager::CFramerateManager(int rate)
 {
 	this->rate = rate;
-	this->rateticks = (1000.0 / rate);
+	this->rateticks = (ui32)ceil(1000.0 / rate);
 	this->fps = 0;
 }
 
@@ -517,7 +537,7 @@ void CFramerateManager::framerateDelay()
 	// FPS is higher than it should be, then wait some time
 	if (timeElapsed < rateticks)
 	{
-		SDL_Delay(ceil(this->rateticks) - timeElapsed);
+		SDL_Delay(rateticks - timeElapsed);
 	}
 	currentTicks = SDL_GetTicks();
 

+ 1 - 1
client/UIFramework/CGuiHandler.h

@@ -24,7 +24,7 @@ class IShowable;
 class CFramerateManager
 {
 private:
-	double rateticks;
+	ui32 rateticks;
 	ui32 lastticks, timeElapsed;
 	int rate;
 

+ 9 - 10
client/UIFramework/CIntObject.cpp

@@ -1,4 +1,5 @@
 #include "StdInc.h"
+#include "GL2D.h"
 #include "CIntObject.h"
 #include "CGuiHandler.h"
 #include "SDL_Extensions.h"
@@ -43,21 +44,21 @@ void CIntObject::onTimer(int timePassed)
 	}
 }
 
-void CIntObject::show(SDL_Surface * to)
+void CIntObject::show()
 {
 	if(defActions & UPDATE)
 		for(size_t i = 0; i < children.size(); i++)
 			if(children[i]->recActions & UPDATE)
-				children[i]->show(to);
+				children[i]->show();
 }
 
-void CIntObject::showAll(SDL_Surface * to)
+void CIntObject::showAll()
 {
 	if(defActions & SHOWALL)
 	{
 		for(size_t i = 0; i < children.size(); i++)
 			if(children[i]->recActions & SHOWALL)
-				children[i]->showAll(to);
+				children[i]->showAll();
 
 	}
 }
@@ -208,8 +209,8 @@ void CIntObject::fitToScreen(int borderWidth, bool propagate)
 	Point newPos = pos.topLeft();
 	vstd::amax(newPos.x, borderWidth);
 	vstd::amax(newPos.y, borderWidth);
-	vstd::amin(newPos.x, screen->w - borderWidth - pos.w);
-	vstd::amin(newPos.y, screen->h - borderWidth - pos.h);
+	vstd::amin(newPos.x, GL2D::getScreenWidth() - borderWidth - pos.w);
+	vstd::amin(newPos.y, GL2D::getScreenHeight() - borderWidth - pos.h);
 	if (newPos != pos.topLeft())
 		moveTo(newPos, propagate);
 }
@@ -281,9 +282,7 @@ void CIntObject::redraw()
 		}
 		else
 		{
-			showAll(screenBuf);
-			if(screenBuf != screen)
-				showAll(screen);
+			showAll();
 		}
 	}
 }
@@ -292,7 +291,7 @@ const Rect & CIntObject::center( const Rect &r, bool propagate )
 {
 	pos.w = r.w;
 	pos.h = r.h;
-	return center(Point(screen->w/2, screen->h/2), propagate);
+	return center(Point(GL2D::getScreenWidth()/2, GL2D::getScreenHeight()/2), propagate);
 }
 
 const Rect & CIntObject::center( bool propagate )

+ 5 - 5
client/UIFramework/CIntObject.h

@@ -41,10 +41,10 @@ class IShowable
 {
 public:
 	virtual void redraw()=0;
-	virtual void show(SDL_Surface * to) = 0;
-	virtual void showAll(SDL_Surface * to)
+	virtual void show() = 0;
+	virtual void showAll()
 	{
-		show(to);
+		show();
 	}
 	virtual ~IShowable(){}; //d-tor
 };
@@ -156,9 +156,9 @@ public:
 	void deactivate();
 
 	//called each frame to update screen
-	void show(SDL_Surface * to);
+	void show();
 	//called on complete redraw only
-	void showAll(SDL_Surface * to);
+	void showAll();
 	//request complete redraw of this object
 	void redraw();
 

+ 97 - 88
client/UIFramework/CIntObjectClasses.cpp

@@ -1,5 +1,6 @@
 #include "StdInc.h"
 #include "CIntObjectClasses.h"
+#include "GL2D.h"
 
 #include "../CBitmapHandler.h"
 #include "SDL_Pixels.h"
@@ -18,29 +19,31 @@
 #include "../GUIClasses.h"
 #include "CGuiHandler.h"
 #include "../CAdvmapInterface.h"
+#include "../Gfx/Animations.h"
+#include "../Gfx/Images.h"
 
-CPicture::CPicture( SDL_Surface *BG, int x, int y, bool Free )
+CPicture::CPicture(Gfx::PImage BG, int x, int y, bool Free )
 {
 	init();
 	bg = BG;
 	freeSurf = Free;
 	pos.x += x;
 	pos.y += y;
-	pos.w = BG->w;
-	pos.h = BG->h;
+	pos.w = BG->getWidth();
+	pos.h = BG->getHeight();
 }
 
 CPicture::CPicture( const std::string &bmpname, int x, int y )
 {
 	init();
-	bg = BitmapHandler::loadBitmap(bmpname);
+	bg = Gfx::CManager::getImage(bmpname);
 	freeSurf = true;;
 	pos.x += x;
 	pos.y += y;
 	if(bg)
 	{
-		pos.w = bg->w;
-		pos.h = bg->h;
+		pos.w = bg->getWidth();
+		pos.h = bg->getHeight();
 	}
 	else
 	{
@@ -51,7 +54,7 @@ CPicture::CPicture( const std::string &bmpname, int x, int y )
 CPicture::CPicture(const Rect &r, const SDL_Color &color, bool screenFormat /*= false*/)
 {
 	init();
-	createSimpleRect(r, screenFormat, SDL_MapRGB(bg->format, color.r, color.g,color.b));
+	//createSimpleRect(r, screenFormat, SDL_MapRGB(bg->format, color.r, color.g,color.b));
 }
 
 CPicture::CPicture(const Rect &r, ui32 color, bool screenFormat /*= false*/)
@@ -60,7 +63,7 @@ CPicture::CPicture(const Rect &r, ui32 color, bool screenFormat /*= false*/)
 	createSimpleRect(r, screenFormat, color);
 }
 
-CPicture::CPicture(SDL_Surface *BG, const Rect &SrcRect, int x /*= 0*/, int y /*= 0*/, bool free /*= false*/)
+CPicture::CPicture(Gfx::PImage BG, const Rect &SrcRect, int x /*= 0*/, int y /*= 0*/, bool free /*= false*/)
 {
 	needRefresh = false;
 	srcRect = new Rect(SrcRect);
@@ -74,7 +77,7 @@ CPicture::CPicture(SDL_Surface *BG, const Rect &SrcRect, int x /*= 0*/, int y /*
 
 void CPicture::setSurface(SDL_Surface *to)
 {
-	bg = to;
+//*	bg = to;
 	if (srcRect)
 	{
 		pos.w = srcRect->w;
@@ -82,15 +85,13 @@ void CPicture::setSurface(SDL_Surface *to)
 	}
 	else
 	{
-		pos.w = bg->w;
-		pos.h = bg->h;
+		pos.w = bg->getWidth();
+		pos.h = bg->getHeight();
 	}
 }
 
 CPicture::~CPicture()
 {
-	if(freeSurf)
-		SDL_FreeSurface(bg);
 	delete srcRect;
 }
 
@@ -100,14 +101,15 @@ void CPicture::init()
 	srcRect = NULL;
 }
 
-void CPicture::show(SDL_Surface * to)
+void CPicture::show()
 {
-	if (needRefresh)
-		showAll(to);
+	if (bg) bg->putAt(Gfx::Point(pos.x, pos.y));
 }
 
-void CPicture::showAll(SDL_Surface * to)
+void CPicture::showAll()
 {
+	if (bg) bg->putAt(Gfx::Point(pos.x, pos.y));
+/*
 	if(bg)
 	{
 		if(srcRect)
@@ -122,30 +124,32 @@ void CPicture::showAll(SDL_Surface * to)
 		else
 			blitAt(bg, pos, to);
 	}
+*/
 }
 
 void CPicture::convertToScreenBPP()
 {
-	SDL_Surface *hlp = bg;
+/*	SDL_Surface *hlp = bg;
 	bg = SDL_ConvertSurface(hlp,screen->format,0);
 	SDL_SetColorKey(bg,SDL_SRCCOLORKEY,SDL_MapRGB(bg->format,0,255,255));
-	SDL_FreeSurface(hlp);
+	SDL_FreeSurface(hlp); */
 }
 
 void CPicture::setAlpha(int value)
 {
-	SDL_SetAlpha(bg, SDL_SRCALPHA, value);
+//*	SDL_SetAlpha(bg, SDL_SRCALPHA, value);
 }
 
 void CPicture::scaleTo(Point size)
 {
-	SDL_Surface * scaled = CSDL_Ext::scaleSurface(bg, size.x, size.y);
+/*	SDL_Surface * scaled = CSDL_Ext::scaleSurface(bg, size.x, size.y);
 
 	if(freeSurf)
 		SDL_FreeSurface(bg);
 
 	setSurface(scaled);
 	freeSurf = false;
+*/
 }
 
 void CPicture::createSimpleRect(const Rect &r, bool screenFormat, ui32 color)
@@ -153,12 +157,12 @@ void CPicture::createSimpleRect(const Rect &r, bool screenFormat, ui32 color)
 	pos += r;
 	pos.w = r.w;
 	pos.h = r.h;
-	if(screenFormat)
+/*	if(screenFormat)
 		bg = CSDL_Ext::newSurface(r.w, r.h);
 	else
 		bg = SDL_CreateRGBSurface(SDL_SWSURFACE, r.w, r.h, 8, 0, 0, 0, 0);
 
-	SDL_FillRect(bg, NULL, color);
+	SDL_FillRect(bg, NULL, color); */
 	freeSurf = true;
 }
 
@@ -172,8 +176,8 @@ void CPicture::colorizeAndConvert(PlayerColor player)
 void CPicture::colorize(PlayerColor player)
 {
 	assert(bg);
-	assert(bg->format->BitsPerPixel == 8);
-	graphics->blueToPlayersAdv(bg, player);
+//*	assert(bg->format->BitsPerPixel == 8);
+//*	graphics->blueToPlayersAdv(bg, player);
 }
 
 CFilledTexture::CFilledTexture(std::string imageName, Rect position):
@@ -189,10 +193,10 @@ CFilledTexture::~CFilledTexture()
 	SDL_FreeSurface(texture);
 }
 
-void CFilledTexture::showAll(SDL_Surface *to)
+void CFilledTexture::showAll()
 {
-	CSDL_Ext::CClipRectGuard guard(to, pos);
-	CSDL_Ext::fillTexture(to, texture);
+//*	CSDL_Ext::CClipRectGuard guard(to, pos);
+//*	CSDL_Ext::fillTexture(to, texture);
 }
 
 CButtonBase::CButtonBase()
@@ -223,8 +227,8 @@ void CButtonBase::update()
 	if (newPos < 0)
 		newPos = 0;
 
-	if (state == HIGHLIGHTED && image->size() < 4)
-		newPos = image->size()-1;
+	if (state == HIGHLIGHTED && image->getFramesCount() < 4)
+		newPos = image->getFramesCount()-1;
 
 	if (swappedImages)
 	{
@@ -232,8 +236,8 @@ void CButtonBase::update()
 		else if (newPos == 1) newPos = 0;
 	}
 
-	if (!keepFrame)
-		image->setFrame(newPos);
+//*	if (!keepFrame)
+//*		image->setFrame(newPos);
 
 	if (active)
 		redraw();
@@ -310,6 +314,7 @@ CAdventureMapButton::CAdventureMapButton( const std::pair<std::string, std::stri
 	pom[0] = help.first;
 	init(Callback, pom, help.second, playerColoredButton, defName, add, x, y, key);
 }
+
 void CAdventureMapButton::clickLeft(tribool down, bool previousState)
 {
 	if(isBlocked())
@@ -412,34 +417,36 @@ void CAdventureMapButton::setIndex(size_t index, bool playerColoredButton)
 	if (index == currentImage || index>=imageNames.size())
 		return;
 	currentImage = index;
-	setImage(new CAnimation(imageNames[index]), playerColoredButton);
+	setImage(Gfx::CManager::getAnimation(imageNames[index]));
 }
 
-void CAdventureMapButton::setImage(CAnimation* anim, bool playerColoredButton, int animFlags)
+void CAdventureMapButton::setImage(Gfx::PAnimation anim, bool playerColoredButton, int animFlags)
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL;
 
-	delete image;
-	image = new CAnimImage(anim, getState(), 0, 0, 0, animFlags);
-	if (playerColoredButton)
-		image->playerColored(LOCPLINT->playerID);
+	image = anim; //new CAnimImage(anim, getState(), 0, 0, 0, animFlags);
+//*	if (playerColoredButton)
+//*		image->playerColored(LOCPLINT->playerID);
+
+	pos.w = image->getWidth();
+	pos.h = image->getHeight();
 
-	pos.w = image->pos.w;
-	pos.h = image->pos.h;
 }
 
 void CAdventureMapButton::setPlayerColor(PlayerColor player)
 {
-	if (image)
-		image->playerColored(player);
+//	if (image)
+//		image->playerColored(player);
 }
 
-void CAdventureMapButton::showAll(SDL_Surface * to)
+void CAdventureMapButton::showAll()
 {
-	CIntObject::showAll(to);
+	image->getFrame(0)->putAt(Gfx::Point(pos.x, pos.y));
+
+	CIntObject::showAll();
 
-	if (borderEnabled && borderColor.unused == 0)
-		CSDL_Ext::drawBorder(to, pos.x-1, pos.y-1, pos.w+2, pos.h+2, int3(borderColor.r, borderColor.g, borderColor.b));
+//*	if (borderEnabled && borderColor.unused == 0)
+//*		CSDL_Ext::drawBorder(to, pos.x-1, pos.y-1, pos.w+2, pos.h+2, int3(borderColor.r, borderColor.g, borderColor.b));
 }
 
 void CHighlightableButton::select(bool on)
@@ -571,28 +578,28 @@ void CHighlightableButtonsGroup::selectionChanged(int to)
 		parent->redraw();
 }
 
-void CHighlightableButtonsGroup::show(SDL_Surface * to)
+void CHighlightableButtonsGroup::show()
 {
 	if (musicLike)
 	{
 		for(size_t i=0;i<buttons.size(); ++i)
 			if(buttons[i]->isHighlighted())
-				buttons[i]->show(to);
+				buttons[i]->show();
 	}
 	else
-		CIntObject::show(to);
+		CIntObject::show();
 }
 
-void CHighlightableButtonsGroup::showAll(SDL_Surface * to)
+void CHighlightableButtonsGroup::showAll()
 {
 	if (musicLike)
 	{
 		for(size_t i=0;i<buttons.size(); ++i)
 			if(buttons[i]->isHighlighted())
-				buttons[i]->showAll(to);
+				buttons[i]->showAll();
 	}
 	else
-		CIntObject::showAll(to);
+		CIntObject::showAll();
 }
 
 void CHighlightableButtonsGroup::block( ui8 on )
@@ -770,11 +777,11 @@ CSlider::CSlider(int x, int y, int totalw, boost::function<void(int)> Moved, int
 
 	if(style == 0)
 	{
-		std::string name = horizontal?"IGPCRDIV.DEF":"OVBUTN2.DEF";
+		std::string name = horizontal ? "IGPCRDIV":"OVBUTN2";
 		//NOTE: this images do not have "blocked" frames. They should be implemented somehow (e.g. palette transform or something...)
 
 		//use source def to create custom animations. Format "name.def:123" will load this frame from def file
-		CAnimation *animLeft = new CAnimation();
+/*		CAnimation *animLeft = new CAnimation();
 		animLeft->setCustom(name + ":0", 0);
 		animLeft->setCustom(name + ":1", 1);
 		left->setImage(animLeft);
@@ -787,12 +794,13 @@ CSlider::CSlider(int x, int y, int totalw, boost::function<void(int)> Moved, int
 		CAnimation *animSlider = new CAnimation();
 		animSlider->setCustom(name + ":4", 0);
 		slider->setImage(animSlider);
+*/
 	}
 	else
 	{
-		left->setImage(new CAnimation(horizontal ? "SCNRBLF.DEF" : "SCNRBUP.DEF"));
-		right->setImage(new CAnimation(horizontal ? "SCNRBRT.DEF" : "SCNRBDN.DEF"));
-		slider->setImage(new CAnimation("SCNRBSL.DEF"));
+		left->setImage(Gfx::CManager::getAnimation(horizontal ? "SCNRBLF" : "SCNRBUP"));
+		right->setImage(Gfx::CManager::getAnimation(horizontal ? "SCNRBRT" : "SCNRBDN"));
+		slider->setImage(Gfx::CManager::getAnimation("SCNRBSL"));
 	}
 	slider->actOnDown = true;
 	slider->soundDisabled = true;
@@ -817,10 +825,10 @@ void CSlider::setAmount( int to )
 	vstd::amax(positions, 0);
 }
 
-void CSlider::showAll(SDL_Surface * to)
+void CSlider::showAll()
 {
-	CSDL_Ext::fillRect(to, &pos, 0);
-	CIntObject::showAll(to);
+//*	CSDL_Ext::fillRect(to, &pos, 0);
+	CIntObject::showAll();
 }
 
 void CSlider::wheelScrolled(bool down, bool in)
@@ -1085,11 +1093,12 @@ const std::list<CIntObject *> &CListBox::getItems()
 	return items;
 }
 
-void CSimpleWindow::show(SDL_Surface * to)
+void CSimpleWindow::show()
 {
-	if(bitmap)
-		blitAt(bitmap,pos.x,pos.y,to);
+//*	if(bitmap)
+//*		blitAt(bitmap,pos.x,pos.y,to);
 }
+
 CSimpleWindow::~CSimpleWindow()
 {
 	if (bitmap)
@@ -1150,16 +1159,16 @@ void LRClickableAreaWText::init()
 	addUsedEvents(LCLICK | RCLICK | HOVER);
 }
 
-void CLabel::showAll(SDL_Surface * to)
+void CLabel::showAll()
 {
-	CIntObject::showAll(to);
+	CIntObject::showAll();
 
 	std::string toPrint = visibleText();
 	if(!toPrint.length())
 		return;
 
 	//blitLine(to, pos.topLeft()/2 + pos.bottomRight()/2, toPrint);
-    blitLine(to, pos.topLeft() + textOffset, toPrint);
+//*    blitLine(to, pos.topLeft() + textOffset, toPrint);
 
 }
 
@@ -1260,9 +1269,9 @@ CTextContainer::CTextContainer(EAlignment alignment, EFonts font, SDL_Color colo
 	color(color)
 {}
 
-void CBoundedLabel::showAll(SDL_Surface * to)
+void CBoundedLabel::showAll()
 {
-	CIntObject::showAll(to);
+	CIntObject::showAll();
 
 	const IFont * f = graphics->fonts[font];
 	int lineHeight =  f->getLineHeight();
@@ -1285,7 +1294,7 @@ void CBoundedLabel::showAll(SDL_Surface * to)
 			x += pos.w - f->getStringWidth(line.c_str()) / 2;
 		}
 
-		blitLine(to, Point(x, base_y + i * dy), line);
+//*		blitLine(to, Point(x, base_y + i * dy), line);
 	}
 }
 
@@ -1352,9 +1361,9 @@ void CTextBox::recalculateLines(const std::string &Txt)
 		vstd::amax(maxW, f->getStringWidth(line));
 }
 
-void CTextBox::showAll(SDL_Surface * to)
+void CTextBox::showAll()
 {
-	CIntObject::showAll(to);
+	CIntObject::showAll();
 
 	const IFont * f = graphics->fonts[font];
 	int dy = f->getLineHeight(); //line height
@@ -1374,7 +1383,7 @@ void CTextBox::showAll(SDL_Surface * to)
 		int width = pos.w + (slider ? (slider->pos.w) : 0);
 		int x = pos.x + int(alignment) * width / 2;
 
-		blitLine(to, Point(x, base_y + i * dy), line);
+//*		blitLine(to, Point(x, base_y + i * dy), line);
 	}
 
 }
@@ -1444,9 +1453,9 @@ CGStatusBar::~CGStatusBar()
 	GH.statusbar = oldStatusBar;
 }
 
-void CGStatusBar::show(SDL_Surface * to)
+void CGStatusBar::show()
 {
-    showAll(to);
+    showAll();
 }
 
 void CGStatusBar::init()
@@ -1511,10 +1520,10 @@ CTextInput::CTextInput(const Rect &Pos, SDL_Surface *srf)
 	OBJ_CONSTRUCTION;
 	bg = new CPicture(Pos, 0, true);
 	Rect hlp = Pos;
-	if(srf)
+/*	if(srf)
 		CSDL_Ext::blitSurface(srf, &hlp, *bg, NULL);
 	else
-		SDL_FillRect(*bg, NULL, 0);
+		SDL_FillRect(*bg, NULL, 0); */
 	pos.w = bg->pos.w;
 	pos.h = bg->pos.h;
 	bg->pos = pos;
@@ -1847,26 +1856,26 @@ void CWindowObject::setShadow(bool on)
 			fullsize = Point(pos.w, pos.h);
 
 		//create base 8x8 piece of shadow
-		SDL_Surface * shadowCorner = CSDL_Ext::copySurface(shadowCornerTempl);
-		SDL_Surface * shadowBottom = CSDL_Ext::scaleSurfaceFast(shadowBottomTempl, fullsize.x - size, size);
-		SDL_Surface * shadowRight  = CSDL_Ext::scaleSurfaceFast(shadowRightTempl,  size, fullsize.y - size);
+//*		SDL_Surface * shadowCorner = CSDL_Ext::copySurface(shadowCornerTempl);
+//*		SDL_Surface * shadowBottom = CSDL_Ext::scaleSurfaceFast(shadowBottomTempl, fullsize.x - size, size);
+//*		SDL_Surface * shadowRight  = CSDL_Ext::scaleSurfaceFast(shadowRightTempl,  size, fullsize.y - size);
 
-		blitAlphaCol(shadowBottom, 0);
-		blitAlphaRow(shadowRight, 0);
+//*		blitAlphaCol(shadowBottom, 0);
+//*		blitAlphaRow(shadowRight, 0);
 
 		//generate "shadow" object with these 3 pieces in it
 		shadow = new CIntObject;
-		shadow->addChild(new CPicture(shadowCorner, shadowPos.x, shadowPos.y));
-		shadow->addChild(new CPicture(shadowRight,  shadowPos.x, shadowStart.y));
-		shadow->addChild(new CPicture(shadowBottom, shadowStart.x, shadowPos.y));
+//*		shadow->addChild(new CPicture(shadowCorner, shadowPos.x, shadowPos.y));
+//*		shadow->addChild(new CPicture(shadowRight,  shadowPos.x, shadowStart.y));
+//*		shadow->addChild(new CPicture(shadowBottom, shadowStart.x, shadowPos.y));
 	}
 }
 
-void CWindowObject::showAll(SDL_Surface *to)
+void CWindowObject::showAll()
 {
-	CIntObject::showAll(to);
-	if ((options & BORDERED) && (pos.h != to->h || pos.w != to->w))
-		CMessage::drawBorder(LOCPLINT ? LOCPLINT->playerID : PlayerColor(1), to, pos.w+28, pos.h+29, pos.x-14, pos.y-15);
+	CIntObject::showAll();
+	if ((options & BORDERED) && (pos.w != GL2D::getScreenWidth() || pos.h != GL2D::getScreenHeight()))
+		CMessage::drawBorder(LOCPLINT ? LOCPLINT->playerID : PlayerColor(1), nullptr, pos.w+28, pos.h+29, pos.x-14, pos.y-15);
 }
 
 void CWindowObject::close()

+ 21 - 22
client/UIFramework/CIntObjectClasses.h

@@ -3,6 +3,7 @@
 #include "CIntObject.h"
 #include "SDL_Extensions.h"
 #include "../FunctionList.h"
+#include "../Gfx/Manager.h"
 
 struct SDL_Surface;
 struct Rect;
@@ -26,7 +27,7 @@ class CSimpleWindow : public CIntObject
 {
 public:
 	SDL_Surface * bitmap; //background
-	virtual void show(SDL_Surface * to);
+	virtual void show();
 	CSimpleWindow():bitmap(NULL){}; //c-tor
 	virtual ~CSimpleWindow(); //d-tor
 };
@@ -35,22 +36,20 @@ public:
 class CPicture : public CIntObject
 {
 	void setSurface(SDL_Surface *to);
+	Gfx::PImage bg;
+
 public: 
-	SDL_Surface * bg;
 	Rect * srcRect; //if NULL then whole surface will be used
 	bool freeSurf; //whether surface will be freed upon CPicture destruction
 	bool needRefresh;//Surface needs to be displayed each frame
 
-	operator SDL_Surface*()
-	{
-		return bg;
-	}
+	inline Gfx::PImage getImage() { return bg; };
 
 	CPicture(const Rect & r, const SDL_Color & color, bool screenFormat = false); //rect filled with given color
 	CPicture(const Rect & r, ui32 color, bool screenFormat = false); //rect filled with given color
-	CPicture(SDL_Surface * BG, int x = 0, int y=0, bool Free = true); //wrap existing SDL_Surface
+	CPicture(Gfx::PImage BG, int x = 0, int y=0, bool Free = true); //wrap existing SDL_Surface
 	CPicture(const std::string &bmpname, int x=0, int y=0);
-	CPicture(SDL_Surface *BG, const Rect &SrcRext, int x = 0, int y = 0, bool free = false); //wrap subrect of given surface
+	CPicture(Gfx::PImage BG, const Rect &SrcRext, int x = 0, int y = 0, bool free = false); //wrap subrect of given surface
 	~CPicture();
 	void init();
 
@@ -60,8 +59,8 @@ public:
 
 	void scaleTo(Point size);
 	void createSimpleRect(const Rect &r, bool screenFormat, ui32 color);
-	void show(SDL_Surface * to);
-	void showAll(SDL_Surface * to);
+	void show();
+	void showAll();
 	void convertToScreenBPP();
 	void colorizeAndConvert(PlayerColor player);
 	void colorize(PlayerColor player);
@@ -75,7 +74,7 @@ class CFilledTexture : CIntObject
 public:
 	CFilledTexture(std::string imageName, Rect position);
 	~CFilledTexture();
-	void showAll(SDL_Surface *to);
+	void showAll();
 };
 
 namespace config{struct ButtonInfo;}
@@ -111,7 +110,7 @@ public:
 	bool isBlocked();
 	bool isHighlighted();
 
-	CAnimImage * image; //image for this button
+	Gfx::PAnimation image; //image for this button
 	CLabel * text;//text overlay
 
 	CButtonBase(); //c-tor
@@ -146,9 +145,9 @@ public:
 	void init(const CFunctionList<void()> &Callback, const std::map<int,std::string> &Name, const std::string &HelpBox, bool playerColoredButton, const std::string &defName, std::vector<std::string> * add, int x, int y, int key );
 
 	void setIndex(size_t index, bool playerColoredButton=false);
-	void setImage(CAnimation* anim, bool playerColoredButton=false, int animFlags=0);
+	void setImage(Gfx::PAnimation anim, bool playerColoredButton=false, int animFlags=0);
 	void setPlayerColor(PlayerColor player);
-	void showAll(SDL_Surface * to);
+	void showAll();
 };
 
 /// A button which can be selected/deselected
@@ -182,8 +181,8 @@ public:
 	~CHighlightableButtonsGroup();
 	void select(int id, bool mode); //mode==0: id is serial; mode==1: id is unique button id
 	void selectionChanged(int to);
-	void show(SDL_Surface * to);
-	void showAll(SDL_Surface * to);
+	void show();
+	void showAll();
 	void block(ui8 on);
 };
 
@@ -214,7 +213,7 @@ public:
 	void wheelScrolled(bool down, bool in);
 	void clickLeft(tribool down, bool previousState);
 	void mouseMoved (const SDL_MouseMotionEvent & sEvent);
-	void showAll(SDL_Surface * to);
+	void showAll();
 
 	CSlider(int x, int y, int totalw, boost::function<void(int)> Moved, int Capacity, int Amount, 
 		int Value=0, bool Horizontal=true, int style = 0); //style 0 - brown, 1 - blue
@@ -340,7 +339,7 @@ public:
 	bool ignoreLeadingWhitespace; 
 
 	virtual void setTxt(const std::string &Txt);
-	void showAll(SDL_Surface * to); //shows statusbar (with current text)
+	void showAll(); //shows statusbar (with current text)
     CLabel(int x=0, int y=0, EFonts Font = FONT_SMALL, EAlignment Align = TOPLEFT, const SDL_Color &Color = Colors::WHITE, const std::string &Text =  "");
 };
 
@@ -358,7 +357,7 @@ public:
 	void setTxt(const std::string &Txt);
 	void setBounds(int limitW, int limitH);
 	virtual void recalculateLines(const std::string &Txt);
-	void showAll(SDL_Surface * to);
+	void showAll();
 };
 
 //Small helper class to manage group of similar labels 
@@ -385,7 +384,7 @@ public:
 
     //CTextBox( std::string Text, const Point &Pos, int w, int h, EFonts Font = FONT_SMALL, EAlignment Align = TOPLEFT, const SDL_Color &Color = Colors::WHITE);
     CTextBox(std::string Text, const Rect &rect, int SliderStyle, EFonts Font = FONT_SMALL, EAlignment Align = TOPLEFT, const SDL_Color &Color = Colors::WHITE);
-	void showAll(SDL_Surface * to); //shows statusbar (with current text)
+	void showAll(); //shows statusbar (with current text)
 	void recalculateLines(const std::string &Txt);
 
 	void sliderMoved(int to);
@@ -403,7 +402,7 @@ public:
 	void print(const std::string & Text); //prints text and refreshes statusbar
 	void clear();//clears statusbar and refreshes
 	std::string getCurrent(); //returns currently displayed text
-	void show(SDL_Surface * to); //shows statusbar (with current text)
+	void show(); //shows statusbar (with current text)
 
     //CGStatusBar(int x, int y, EFonts Font = FONT_SMALL, EAlignment Align = CENTER, const SDL_Color &Color = Colors::WHITE, const std::string &Text =  "");
     CGStatusBar(CPicture *BG, EFonts Font = FONT_SMALL, EAlignment Align = CENTER, const SDL_Color &Color = Colors::WHITE); //given CPicture will be captured by created sbar and it's pos will be used as pos for sbar
@@ -504,7 +503,7 @@ protected:
 	//Used only if RCLICK_POPUP was set
 	void clickRight(tribool down, bool previousState);
 	//To display border
-	void showAll(SDL_Surface *to);
+	void showAll();
 	//change or set background image
 	void setBackground(std::string filename);
 	void updateShadow();

+ 242 - 0
client/UIFramework/GL2D.cpp

@@ -0,0 +1,242 @@
+#include "StdInc.h"
+#include <SDL.h>
+#include <SDL_video.h>
+#include "SDL_syswm.h"
+#include <SDL_opengl.h>
+#include "GL2D.h"
+
+
+namespace GL2D
+{
+
+// Variables initialized by initVideo, updated by setScreenRes:
+static SDL_SysWMinfo wmInfo;
+ui32 screenWidth = 0, screenHeight = 0; // Screen/Window size
+
+// OpenGL 1.3 functions pointers
+PFNGLACTIVETEXTUREPROC	glActiveTexture;
+// OpenGL 2.0 functions pointers
+PFNGLCREATEPROGRAMPROC	glCreateProgram;
+PFNGLCREATESHADERPROC	glCreateShader;
+PFNGLSHADERSOURCEPROC	glShaderSource;
+PFNGLCOMPILESHADERPROC	glCompileShader;
+PFNGLATTACHSHADERPROC	glAttachShader;
+PFNGLLINKPROGRAMPROC	glLinkProgram;
+PFNGLUSEPROGRAMPROC 	glUseProgram;
+PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
+PFNGLUNIFORM1IPROC		glUniform1i;
+PFNGLUNIFORM2IPROC		glUniform2i;
+
+PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
+PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;
+
+
+// Shaders' sources
+static const char frag_palette_bitmap[] = (
+"uniform usampler2DRect bitmap;"
+"uniform sampler1D palette;"
+"uniform ivec2 coordOffs;"
+"layout (origin_upper_left) in vec4 gl_FragCoord;"
+
+"void main(){"
+	"gl_FragColor = texelFetch(palette, int(texelFetch(bitmap, ivec2(gl_FragCoord.xy) - coordOffs).r), 0);"
+"}"
+);
+
+
+// Programs' handlers
+static GLuint currentProgram = 0;
+static GLuint colorizeProgram = 0;
+static GLuint paletteBitmapProgram = 0;
+
+// Uniforms handlers
+static GLint coord_uniform = -1;
+
+
+// Print out the information log for a shader object 
+void printInfoLog(PFNGLGETPROGRAMINFOLOGPROC logFunc, GLuint object)
+{
+	if (logFunc != nullptr)
+	{
+		GLsizei infoLogLength = 0;
+		GLchar infoLog[1024];
+		logFunc(object, sizeof(infoLog)-1, &infoLogLength, infoLog);
+
+		if (infoLogLength > 0) tlog1 << infoLog;
+	}
+}
+
+
+GLuint makeShaderProgram(const char * frg_src)
+{
+	// Creating a fragment shader object
+	GLuint shader_object = glCreateShader(GL_FRAGMENT_SHADER);
+	glShaderSource(shader_object, 1, &frg_src, nullptr); // assigning the shader source
+	// Compiling the shader
+	glCompileShader(shader_object);
+	printInfoLog(glGetShaderInfoLog, shader_object);
+
+	// Creating a program object
+	GLuint program_object  = glCreateProgram();
+	// Attaching the shader into program
+	glAttachShader(program_object, shader_object); 
+
+	// Link the shaders into a complete GLSL program.
+	glLinkProgram(program_object);
+	printInfoLog(glGetProgramInfoLog, program_object);
+
+	return program_object;
+}
+
+
+void initVideo(ui32 w, ui32 h, bool fullscreen)
+{
+	SDL_VERSION(&wmInfo.version);
+
+	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+
+	if (!setScreenRes(w, h, fullscreen))
+	{
+		throw std::runtime_error("Video mode setting failed\n");
+	}
+	glClearColor(0, 0, 0, 0);	// Black Background
+	glClear(GL_COLOR_BUFFER_BIT);
+	SDL_GL_SwapBuffers();
+
+	// Dynamic-linked OpenGL 1.3 and 2.0 functions - required to 2D rendeing
+	if (	(glActiveTexture = (PFNGLACTIVETEXTUREPROC) SDL_GL_GetProcAddress("glActiveTexture")) == nullptr
+		||	(glCreateProgram = (PFNGLCREATEPROGRAMPROC) SDL_GL_GetProcAddress("glCreateProgram")) == nullptr
+		||	(glCreateShader = (PFNGLCREATESHADERPROC) SDL_GL_GetProcAddress("glCreateShader")) == nullptr
+		||	(glShaderSource = (PFNGLSHADERSOURCEPROC) SDL_GL_GetProcAddress("glShaderSource")) == nullptr
+		||	(glCompileShader = (PFNGLCOMPILESHADERPROC) SDL_GL_GetProcAddress("glCompileShader")) == nullptr
+		||	(glAttachShader = (PFNGLATTACHSHADERPROC) SDL_GL_GetProcAddress("glAttachShader")) == nullptr
+		||	(glLinkProgram = (PFNGLLINKPROGRAMPROC) SDL_GL_GetProcAddress("glLinkProgram")) == nullptr
+		||	(glUseProgram = (PFNGLUSEPROGRAMPROC) SDL_GL_GetProcAddress("glUseProgram")) == nullptr
+		||	(glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) SDL_GL_GetProcAddress("glGetUniformLocation")) == nullptr
+		||	(glUniform1i = (PFNGLUNIFORM1IPROC) SDL_GL_GetProcAddress("glUniform1i")) == nullptr
+		||	(glUniform2i = (PFNGLUNIFORM2IPROC) SDL_GL_GetProcAddress("glUniform2i")) == nullptr
+		)
+	{
+		tlog1 << "Error: OpenGL2 Extenstions are not available\n";
+		tlog1 << "SDL says: " << SDL_GetError() << std::endl;
+		throw std::runtime_error("OpenGL2 Extenstions are not available\n");
+	}
+	glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) SDL_GL_GetProcAddress("glGetProgramInfoLog"); // not required
+	glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) SDL_GL_GetProcAddress("glGetShaderInfoLog"); // not required
+
+	glDisable(GL_DEPTH_TEST);
+	glDisable(GL_LIGHTING);
+	glDisable(GL_DITHER);
+	glDisable(GL_TEXTURE_2D);
+	glEnable(GL_TEXTURE_RECTANGLE);
+	glEnable(GL_BLEND);
+	glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+
+	paletteBitmapProgram = makeShaderProgram(frag_palette_bitmap);
+	GLint bitmap_uniform = glGetUniformLocation(paletteBitmapProgram, "bitmap");
+	GLint palette_uniform = glGetUniformLocation(paletteBitmapProgram, "palette");
+	coord_uniform = glGetUniformLocation(paletteBitmapProgram, "coordOffs");
+
+	glUseProgram(currentProgram = paletteBitmapProgram);
+	glUniform1i(bitmap_uniform, 0);
+	glUniform1i(palette_uniform, 1);
+
+#ifdef _WIN32
+	wglMakeCurrent(NULL, NULL);
+#endif
+}
+
+
+void attachToCurrentThread()
+{
+#ifdef _WIN32
+	HDC hdc = GetDC(wmInfo.window);
+	wglMakeCurrent(hdc, wmInfo.hglrc);
+#endif
+}
+
+
+bool setScreenRes(ui32 w, ui32 h, bool fullscreen)
+{
+	// Try to use the best screen depth for the display
+	int suggestedBpp = SDL_VideoModeOK(w, h, 32, SDL_OPENGL | SDL_ANYFORMAT | (fullscreen?SDL_FULLSCREEN:0));
+	if(suggestedBpp == 0)
+	{
+		tlog1 << "Error: SDL says that " << w << "x" << h << " resolution is not available!\n";
+		return false;
+	}
+	
+	if(suggestedBpp != 32)
+	{
+		tlog2 << "Note: SDL suggests to use " << suggestedBpp << " bpp instead of 32 bpp\n";
+	}
+
+	if(SDL_SetVideoMode(w, h, suggestedBpp, SDL_OPENGL | SDL_ANYFORMAT | (fullscreen?SDL_FULLSCREEN:0)) == NULL)
+	{
+		tlog1 << "Error: Video mode setting failed (" << w << "x" << h << "x" << suggestedBpp << "bpp)\n";
+		return false;
+	}
+
+	screenWidth = w; screenHeight = h;
+
+	int getwm = SDL_GetWMInfo(&wmInfo);
+	if(getwm != 1)
+	{
+		tlog2 << "Something went wrong, getwm=" << getwm << std::endl;
+		tlog2 << "SDL says: " << SDL_GetError() << std::endl;
+		return false;
+	}
+
+	glViewport(0, 0, w, h);
+	glMatrixMode(GL_PROJECTION);     // Select The Projection Matrix
+	glLoadIdentity();                // Reset The Projection Matrix
+	glOrtho(0, w, h, 0, 0, 1);
+	glMatrixMode(GL_MODELVIEW);      // Select The Modelview Matrix
+	glLoadIdentity();                // Reset The Modelview Matrix
+	glTranslatef(0.375, 0.375, 0);   // Displacement trick for exact pixelization
+	
+	return true;
+}
+
+
+void assignTexture(ui32 slot, ui32 type, ui32 handle)
+{
+	glActiveTexture(slot);
+	glBindTexture(type, handle);
+}
+
+
+void useNoShader()
+{
+	if (currentProgram != 0) {
+		glUseProgram(currentProgram = 0);
+	}
+}
+
+
+void useColorizeShader(const float cm[4][4])
+{
+	if (currentProgram != colorizeProgram) {
+		glUseProgram(currentProgram = colorizeProgram);
+	}
+}
+
+
+void usePaletteBitmapShader(si32 x, si32 y)
+{
+	if (currentProgram != paletteBitmapProgram) {
+		glUseProgram(currentProgram = paletteBitmapProgram);
+	}
+	glUniform2i(coord_uniform, x, y);
+}
+
+
+void usePaletteBitmapShader(si32 x, si32 y, const float cm[4][4])
+{
+	if (currentProgram != paletteBitmapProgram) {
+		glUseProgram(currentProgram = paletteBitmapProgram);
+	}
+	glUniform2i(coord_uniform, x, y);
+}
+
+}

+ 17 - 0
client/UIFramework/GL2D.h

@@ -0,0 +1,17 @@
+#pragma once
+
+namespace GL2D
+{
+	void initVideo(ui32 w, ui32 h, bool fullscreen);
+	void attachToCurrentThread();
+	bool setScreenRes(ui32 w, ui32 h, bool fullscreen);
+
+	inline ui32 getScreenWidth() { extern ui32 screenWidth; return screenWidth; };
+	inline ui32 getScreenHeight() { extern ui32 screenHeight; return screenHeight; };
+
+	void assignTexture(ui32 slot, ui32 type, ui32 handle);
+	void useNoShader();
+	void useColorizeShader(const float cm[4][4]);
+	void usePaletteBitmapShader(si32 x, si32 y);
+	void usePaletteBitmapShader(si32 x, si32 y, const float cm[4][4]);
+}

+ 5 - 3
client/UIFramework/SDL_Extensions.cpp

@@ -51,9 +51,9 @@ bool isItIn(const SDL_Rect * rect, int x, int y)
 
 void blitAt(SDL_Surface * src, int x, int y, SDL_Surface * dst)
 {
-	if(!dst) dst = screen;
-	SDL_Rect pom = genRect(src->h,src->w,x,y);
-	CSDL_Ext::blitSurface(src,NULL,dst,&pom);
+	//if(!dst) dst = screen;
+	//SDL_Rect pom = genRect(src->h,src->w,x,y);
+	//CSDL_Ext::blitSurface(src,NULL,dst,&pom);
 }
 
 void blitAt(SDL_Surface * src, const SDL_Rect & pos, SDL_Surface * dst)
@@ -81,6 +81,8 @@ void updateRect (SDL_Rect * rect, SDL_Surface * scr)
 SDL_Surface * CSDL_Ext::rotate01(SDL_Surface * toRot)
 {
 	SDL_Surface * ret = SDL_ConvertSurface(toRot, toRot->format, toRot->flags);
+	if (ret == nullptr) return nullptr;
+
 	const int bpl = ret->pitch;
 	const int bpp = ret->format->BytesPerPixel;
 

+ 15 - 3
client/VCMI_client.vcxproj

@@ -33,12 +33,12 @@
     <ConfigurationType>Application</ConfigurationType>
     <CharacterSet>Unicode</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
-    <PlatformToolset>v110_xp</PlatformToolset>
+    <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v110</PlatformToolset>
+    <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
@@ -103,7 +103,7 @@
       <PrecompiledHeaderFile>StdInc.h</PrecompiledHeaderFile>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>SDL.lib;zlib.lib;SDL_image.lib;SDL_ttf.lib;SDL_mixer.lib;VCMI_lib.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>SDL.lib;zlib.lib;opengl32.lib;SDL_image.lib;SDL_ttf.lib;SDL_mixer.lib;VCMI_lib.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <ShowProgress>NotSet</ShowProgress>
       <OptimizeReferences>false</OptimizeReferences>
       <Profile>true</Profile>
@@ -184,6 +184,11 @@
     <ClCompile Include="CQuestLog.cpp" />
     <ClCompile Include="CSpellWindow.cpp" />
     <ClCompile Include="CVideoHandler.cpp" />
+    <ClCompile Include="Gfx\Animations.cpp" />
+    <ClCompile Include="Gfx\CPaletteRGBA.cpp" />
+    <ClCompile Include="Gfx\Images.cpp" />
+    <ClCompile Include="Gfx\ImgMakers.cpp" />
+    <ClCompile Include="Gfx\Manager.cpp" />
     <ClCompile Include="Graphics.cpp" />
     <ClCompile Include="GUIClasses.cpp" />
     <ClCompile Include="mapHandler.cpp" />
@@ -201,6 +206,7 @@
     <ClCompile Include="UIFramework\CIntObjectClasses.cpp" />
     <ClCompile Include="UIFramework\Fonts.cpp" />
     <ClCompile Include="UIFramework\Geometries.cpp" />
+    <ClCompile Include="UIFramework\GL2D.cpp" />
     <ClCompile Include="UIFramework\SDL_Extensions.cpp" />
   </ItemGroup>
   <ItemGroup>
@@ -231,6 +237,11 @@
     <ClInclude Include="CVideoHandler.h" />
     <ClInclude Include="FontBase.h" />
     <ClInclude Include="FunctionList.h" />
+    <ClInclude Include="Gfx\Animations.h" />
+    <ClInclude Include="Gfx\CPaletteRGBA.h" />
+    <ClInclude Include="Gfx\Images.h" />
+    <ClInclude Include="Gfx\FilesHeaders.h" />
+    <ClInclude Include="Gfx\Manager.h" />
     <ClInclude Include="Graphics.h" />
     <ClInclude Include="GUIClasses.h" />
     <ClInclude Include="mapHandler.h" />
@@ -242,6 +253,7 @@
     <ClInclude Include="UIFramework\CIntObjectClasses.h" />
     <ClInclude Include="UIFramework\Fonts.h" />
     <ClInclude Include="UIFramework\Geometries.h" />
+    <ClInclude Include="UIFramework\GL2D.h" />
     <ClInclude Include="UIFramework\SDL_Extensions.h" />
     <ClInclude Include="UIFramework\SDL_Pixels.h" />
   </ItemGroup>

+ 59 - 5
client/VCMI_client.vcxproj.filters

@@ -30,13 +30,37 @@
     <ClCompile Include="NetPacksClient.cpp" />
     <ClCompile Include="StdInc.cpp" />
     <ClCompile Include="UIFramework\CCursorHandler.cpp" />
-    <ClCompile Include="UIFramework\CGuiHandler.cpp" />
-    <ClCompile Include="UIFramework\CIntObject.cpp" />
-    <ClCompile Include="UIFramework\CIntObjectClasses.cpp" />
     <ClCompile Include="UIFramework\Geometries.cpp" />
     <ClCompile Include="UIFramework\SDL_Extensions.cpp" />
     <ClCompile Include="CQuestLog.cpp" />
     <ClCompile Include="UIFramework\Fonts.cpp" />
+    <ClCompile Include="Gfx\Animations.cpp">
+      <Filter>Gfx</Filter>
+    </ClCompile>
+    <ClCompile Include="Gfx\Images.cpp">
+      <Filter>Gfx</Filter>
+    </ClCompile>
+    <ClCompile Include="Gfx\ImgMakers.cpp">
+      <Filter>Gfx</Filter>
+    </ClCompile>
+    <ClCompile Include="Gfx\CPaletteRGBA.cpp">
+      <Filter>Gfx</Filter>
+    </ClCompile>
+    <ClCompile Include="Gfx\Manager.cpp">
+      <Filter>Gfx</Filter>
+    </ClCompile>
+    <ClCompile Include="UIFramework\CIntObjectClasses.cpp">
+      <Filter>UIFramework</Filter>
+    </ClCompile>
+    <ClCompile Include="UIFramework\CIntObject.cpp">
+      <Filter>UIFramework</Filter>
+    </ClCompile>
+    <ClCompile Include="UIFramework\GL2D.cpp">
+      <Filter>UIFramework</Filter>
+    </ClCompile>
+    <ClCompile Include="UIFramework\CGuiHandler.cpp">
+      <Filter>UIFramework</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\Global.h" />
@@ -70,8 +94,6 @@
     <ClInclude Include="resource.h" />
     <ClInclude Include="StdInc.h" />
     <ClInclude Include="UIFramework\CCursorHandler.h" />
-    <ClInclude Include="UIFramework\CGuiHandler.h" />
-    <ClInclude Include="UIFramework\CIntObject.h" />
     <ClInclude Include="UIFramework\CIntObjectClasses.h" />
     <ClInclude Include="UIFramework\Geometries.h" />
     <ClInclude Include="UIFramework\SDL_Extensions.h" />
@@ -82,6 +104,30 @@
     </ClCompile>
     <ClInclude Include="mapHandler.h" />
     <ClInclude Include="UIFramework\Fonts.h" />
+    <ClInclude Include="Gfx\Animations.h">
+      <Filter>Gfx</Filter>
+    </ClInclude>
+    <ClInclude Include="Gfx\Images.h">
+      <Filter>Gfx</Filter>
+    </ClInclude>
+    <ClInclude Include="Gfx\FilesHeaders.h">
+      <Filter>Gfx</Filter>
+    </ClInclude>
+    <ClInclude Include="Gfx\CPaletteRGBA.h">
+      <Filter>Gfx</Filter>
+    </ClInclude>
+    <ClInclude Include="Gfx\Manager.h">
+      <Filter>Gfx</Filter>
+    </ClInclude>
+    <ClInclude Include="UIFramework\CIntObject.h">
+      <Filter>UIFramework</Filter>
+    </ClInclude>
+    <ClInclude Include="UIFramework\GL2D.h">
+      <Filter>UIFramework</Filter>
+    </ClInclude>
+    <ClInclude Include="UIFramework\CGuiHandler.h">
+      <Filter>UIFramework</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="VCMI_client.rc" />
@@ -93,4 +139,12 @@
     <None Include="..\ChangeLog" />
     <None Include="vcmi.ico" />
   </ItemGroup>
+  <ItemGroup>
+    <Filter Include="Gfx">
+      <UniqueIdentifier>{215917eb-e8a3-400a-8e1a-d027a532bf3d}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="UIFramework">
+      <UniqueIdentifier>{1ffcd26b-1f6e-4274-8245-3572b26afed5}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
 </Project>

+ 3 - 14
lib/Filesystem/CResourceLoader.cpp

@@ -90,7 +90,7 @@ std::unique_ptr<CInputStream> CResourceLoader::load(const ResourceID & resourceI
 	const ResourceLocator & locator = resource->second.back();
 
 	// load the resource and return it
-	return locator.getLoader()->load(locator.getResourceName());
+	return locator.load();
 }
 
 std::pair<std::unique_ptr<ui8[]>, ui64> CResourceLoader::loadData(const ResourceID & resourceIdent) const
@@ -201,20 +201,9 @@ CResourceLoader * CResourceHandler::get()
 //	CResourceLoaderFactory::resourceLoader = resourceLoader;
 //}
 
-ResourceLocator::ResourceLocator(ISimpleResourceLoader * loader, const std::string & resourceName)
-			: loader(loader), resourceName(resourceName)
+std::unique_ptr<CInputStream> ResourceLocator::load() const
 {
-
-}
-
-ISimpleResourceLoader * ResourceLocator::getLoader() const
-{
-	return loader;
-}
-
-std::string ResourceLocator::getResourceName() const
-{
-	return resourceName;
+	return loader->load(resourceName);
 }
 
 EResType::Type EResTypeHelper::getTypeFromExtension(std::string extension)

+ 13 - 3
lib/Filesystem/CResourceLoader.h

@@ -409,21 +409,31 @@ public:
 	 * @param archive A pointer to the resource archive object.
 	 * @param resourceName Unique resource name in the space of the given resource archive.
 	 */
-	ResourceLocator(ISimpleResourceLoader * loader, const std::string & resourceName);
+	inline ResourceLocator(ISimpleResourceLoader * ldr, const std::string & resName)
+		: loader(ldr), resourceName(resName) {};
 
 	/**
 	 * Gets a pointer to the resource loader object.
 	 *
 	 * @return a pointer to the resource loader object
 	 */
-	ISimpleResourceLoader * getLoader() const;
+	inline ISimpleResourceLoader * getLoader() const { return loader; };
 
 	/**
 	 * Gets the resource name.
 	 *
 	 * @return the resource name.
 	 */
-	std::string getResourceName() const;
+	inline std::string getResourceName() const { return resourceName; };
+
+	/**
+	 * Loads the resource.
+	 *
+	 * @return a pointer to the input stream, not null
+	 *
+	 * @throws std::runtime_error if the resource doesn't exists
+	 */
+	std::unique_ptr<CInputStream> load() const;
 
 private:
 	/**

+ 1 - 1
lib/VCMI_lib.vcxproj

@@ -33,7 +33,7 @@
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <CharacterSet>Unicode</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
-    <PlatformToolset>v110_xp</PlatformToolset>
+    <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>