Explorar o código

Added IWindowHandler interface for OS screen/window utilities

Ivan Savenko %!s(int64=2) %!d(string=hai) anos
pai
achega
b4e7093c01

+ 1 - 1
client/CMT.cpp

@@ -24,7 +24,7 @@
 #include "gui/NotificationHandler.h"
 #include "ClientCommandManager.h"
 #include "windows/CMessage.h"
-#include "renderSDL/WindowHandler.h"
+#include "render/IWindowHandler.h"
 
 #include "../lib/filesystem/Filesystem.h"
 #include "../lib/CConsoleHandler.h"

+ 1 - 0
client/CMakeLists.txt

@@ -203,6 +203,7 @@ set(client_HEADERS
 	render/IFont.h
 	render/IImage.h
 	render/IImageLoader.h
+	render/IWindowHandler.h
 
 	renderSDL/CBitmapFont.h
 	renderSDL/CBitmapHanFont.h

+ 1 - 1
client/gui/CGuiHandler.cpp

@@ -807,7 +807,7 @@ void CGuiHandler::pushUserEvent(EUserEvent usercode, void * userdata)
 	SDL_PushEvent(&event);
 }
 
-WindowHandler & CGuiHandler::windowHandler()
+IWindowHandler & CGuiHandler::windowHandler()
 {
 	return *windowHandlerInstance;
 }

+ 3 - 3
client/gui/CGuiHandler.h

@@ -29,7 +29,7 @@ class CIntObject;
 class IUpdateable;
 class IShowActivatable;
 class IShowable;
-class WindowHandler;
+class IWindowHandler;
 
 // TODO: event handling need refactoring
 enum class EUserEvent
@@ -96,7 +96,7 @@ private:
 	CIntObjectList doubleClickInterested;
 	CIntObjectList textInterested;
 
-	std::unique_ptr<WindowHandler> windowHandlerInstance;
+	std::unique_ptr<IWindowHandler> windowHandlerInstance;
 
 	void handleMouseButtonClick(CIntObjectList & interestedObjs, MouseButton btn, bool isPressed);
 	void processLists(const ui16 activityFlag, std::function<void (std::list<CIntObject*> *)> cb);
@@ -137,7 +137,7 @@ public:
 	/// moves mouse pointer into specified position inside vcmi window
 	void moveCursorToPosition(const Point & position);
 
-	WindowHandler & windowHandler();
+	IWindowHandler & windowHandler();
 
 	IUpdateable *curInt;
 

+ 33 - 0
client/render/IWindowHandler.h

@@ -0,0 +1,33 @@
+/*
+ * IWindowHandler.h, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+
+#pragma once
+
+VCMI_LIB_NAMESPACE_BEGIN
+class Point;
+VCMI_LIB_NAMESPACE_END
+
+class IWindowHandler
+{
+public:
+	virtual ~IWindowHandler() = default;
+
+	/// Updates window state after fullscreen state has been changed in settings
+	virtual void onFullscreenChanged() = 0;
+
+	/// De-initializes window state
+	virtual void close() = 0;
+
+	/// Fills screen with black color, erasing any existing content
+	virtual void clearScreen() = 0;
+
+	/// Returns list of resolutions supported by current screen
+	virtual std::vector<Point> getSupportedResolutions() const = 0;
+};

+ 0 - 37
client/renderSDL/SDL_Extensions.cpp

@@ -861,43 +861,6 @@ void CSDL_Ext::getClipRect(SDL_Surface * src, Rect & other)
 	other = CSDL_Ext::fromSDL(rect);
 }
 
-bool CSDL_Ext::isResolutionSupported(const std::vector<Point> & resolutions, const Point toTest )
-{
-#if defined(VCMI_MOBILE)
-	// ios can use any resolution
-	// presumably, same goes for Android
-	return true;
-#else
-	// in fullscreen only resolutions supported by monitor can be used
-	return vstd::contains(resolutions, toTest);
-#endif
-}
-
-std::vector<Point> CSDL_Ext::getSupportedResolutions()
-{
-	int displayID = SDL_GetWindowDisplayIndex(mainWindow);
-	return getSupportedResolutions(displayID);
-}
-
-std::vector<Point> CSDL_Ext::getSupportedResolutions( int displayIndex)
-{
-	std::vector<Point> result;
-
-	int modesCount = SDL_GetNumDisplayModes(displayIndex);
-
-	for (int i =0; i < modesCount; ++i)
-	{
-		SDL_DisplayMode mode;
-		if (SDL_GetDisplayMode(displayIndex, i, &mode) != 0)
-			continue;
-
-		Point resolution(mode.w, mode.h);
-
-		result.push_back(resolution);
-	}
-	return result;
-}
-
 template SDL_Surface * CSDL_Ext::createSurfaceWithBpp<2>(int, int);
 template SDL_Surface * CSDL_Ext::createSurfaceWithBpp<3>(int, int);
 template SDL_Surface * CSDL_Ext::createSurfaceWithBpp<4>(int, int);

+ 0 - 5
client/renderSDL/SDL_Extensions.h

@@ -105,11 +105,6 @@ using TColorPutterAlpha = void (*)(uint8_t *&, const uint8_t &, const uint8_t &,
 	void convertToGrayscaleBpp(SDL_Surface * surf, const Rect & rect);
 	void convertToGrayscale(SDL_Surface * surf, const Rect & rect);
 
-	bool isResolutionSupported(const std::vector<Point> & resolutions, const Point toTest);
-
-	std::vector<Point> getSupportedResolutions();
-	std::vector<Point> getSupportedResolutions(int displayIndex);
-
 	void setColorKey(SDL_Surface * surface, SDL_Color color);
 
 	///set key-color to 0,255,255

+ 27 - 0
client/renderSDL/WindowHandler.cpp

@@ -424,3 +424,30 @@ void WindowHandler::clearScreen()
 	SDL_RenderClear(mainRenderer);
 	SDL_RenderPresent(mainRenderer);
 }
+
+std::vector<Point> WindowHandler::getSupportedResolutions() const
+{
+	int displayID = SDL_GetWindowDisplayIndex(mainWindow);
+	return getSupportedResolutions(displayID);
+}
+
+std::vector<Point> WindowHandler::getSupportedResolutions( int displayIndex) const
+{
+	//TODO: check this method on iOS / Android
+
+	std::vector<Point> result;
+
+	int modesCount = SDL_GetNumDisplayModes(displayIndex);
+
+	for (int i =0; i < modesCount; ++i)
+	{
+		SDL_DisplayMode mode;
+		if (SDL_GetDisplayMode(displayIndex, i, &mode) != 0)
+			continue;
+
+		Point resolution(mode.w, mode.h);
+
+		result.push_back(resolution);
+	}
+	return result;
+}

+ 8 - 4
client/renderSDL/WindowHandler.h

@@ -16,6 +16,7 @@ struct SDL_Renderer;
 struct SDL_Surface;
 
 #include "../../lib/Point.h"
+#include "../render/IWindowHandler.h"
 
 enum class EWindowMode
 {
@@ -29,7 +30,7 @@ enum class EWindowMode
 };
 
 /// This class is responsible for management of game window and its main rendering surface
-class WindowHandler
+class WindowHandler : public IWindowHandler
 {
 	/// Dimensions of target surfaces/textures, this value is what game logic views as screen size
 	Point getPreferredLogicalResolution() const;
@@ -67,11 +68,14 @@ public:
 	WindowHandler();
 
 	/// Updates and potentially recreates target screen to match selected fullscreen status
-	void onFullscreenChanged();
+	void onFullscreenChanged() final;
 
 	/// De-initializes and destroys screen, window and SDL state
-	void close();
+	void close() final;
 
 	/// Fills screen with black color, erasing any existing content
-	void clearScreen();
+	void clearScreen() final;
+
+	std::vector<Point> getSupportedResolutions() const final;
+	std::vector<Point> getSupportedResolutions(int displayIndex) const;
 };