[Scummvm-git-logs] scummvm master -> 177d709909808313eee720ce76465cf99f909c5e

antoniou79 antoniou at cti.gr
Fri Nov 1 12:39:49 CET 2019


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
177d709909 OPENGL: Implement high DPI support on Android (#1895)


Commit: 177d709909808313eee720ce76465cf99f909c5e
    https://github.com/scummvm/scummvm/commit/177d709909808313eee720ce76465cf99f909c5e
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2019-11-01T13:39:46+02:00

Commit Message:
OPENGL: Implement high DPI support on Android (#1895)

* OPENGL: Implement high DPI support on Android

* PSP2: Fix build

Changed paths:
    backends/graphics/opengl/opengl-graphics.cpp
    backends/graphics/opengl/opengl-graphics.h
    backends/graphics/openglsdl/openglsdl-graphics.cpp
    backends/graphics/openglsdl/openglsdl-graphics.h
    backends/graphics/psp2sdl/psp2sdl-graphics.cpp
    backends/graphics/sdl/sdl-graphics.cpp
    backends/graphics/sdl/sdl-graphics.h
    backends/graphics/surfacesdl/surfacesdl-graphics.cpp
    backends/graphics/surfacesdl/surfacesdl-graphics.h
    backends/graphics/windowed.h
    backends/platform/android/graphics.cpp


diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp
index 06a0109..9d11925 100644
--- a/backends/graphics/opengl/opengl-graphics.cpp
+++ b/backends/graphics/opengl/opengl-graphics.cpp
@@ -909,7 +909,7 @@ void OpenGLGraphicsManager::grabPalette(byte *colors, uint start, uint num) cons
 	memcpy(colors, _gamePalette + start * 3, num * 3);
 }
 
-void OpenGLGraphicsManager::handleResizeImpl(const int width, const int height) {
+void OpenGLGraphicsManager::handleResizeImpl(const int width, const int height, const int xdpi, const int ydpi) {
 	// Setup backbuffer size.
 	_backBuffer.setDimensions(width, height);
 
@@ -942,6 +942,10 @@ void OpenGLGraphicsManager::handleResizeImpl(const int width, const int height)
 	overlayWidth = MAX<uint>(overlayWidth, 256);
 	overlayHeight = MAX<uint>(overlayHeight, 200);
 
+	// HACK: Reduce the size of the overlay on high DPI screens.
+	overlayWidth = fracToInt(overlayWidth * (intToFrac(90) / xdpi));
+	overlayHeight = fracToInt(overlayHeight * (intToFrac(90) / ydpi));
+
 	if (!_overlay || _overlay->getFormat() != _defaultFormatAlpha) {
 		delete _overlay;
 		_overlay = nullptr;
@@ -1008,7 +1012,7 @@ void OpenGLGraphicsManager::notifyContextCreate(const Graphics::PixelFormat &def
 
 	// Refresh the output screen dimensions if some are set up.
 	if (_windowWidth != 0 && _windowHeight != 0) {
-		handleResize(_windowWidth, _windowHeight);
+		handleResize(_windowWidth, _windowHeight, _xdpi, _ydpi);
 	}
 
 	// TODO: Should we try to convert textures into one of those formats if
@@ -1275,6 +1279,16 @@ void OpenGLGraphicsManager::recalculateCursorScaling() {
 
 		_cursorHotspotYScaled = fracToInt(_cursorHotspotYScaled * screenScaleFactorY);
 		_cursorHeightScaled   = fracToInt(_cursorHeightScaled   * screenScaleFactorY);
+	} else {
+		const frac_t screenScaleFactorX = intToFrac(90) / _xdpi;
+		const frac_t screenScaleFactorY = intToFrac(90) / _ydpi;
+
+		// FIXME: Replace this with integer maths
+		_cursorHotspotXScaled /= fracToDouble(screenScaleFactorX);
+		_cursorWidthScaled    /= fracToDouble(screenScaleFactorX);
+
+		_cursorHotspotYScaled /= fracToDouble(screenScaleFactorY);
+		_cursorHeightScaled   /= fracToDouble(screenScaleFactorY);
 	}
 }
 
diff --git a/backends/graphics/opengl/opengl-graphics.h b/backends/graphics/opengl/opengl-graphics.h
index f88315b..322f1d8 100644
--- a/backends/graphics/opengl/opengl-graphics.h
+++ b/backends/graphics/opengl/opengl-graphics.h
@@ -309,7 +309,7 @@ protected:
 
 	virtual bool gameNeedsAspectRatioCorrection() const override;
 	virtual void recalculateDisplayAreas() override;
-	virtual void handleResizeImpl(const int width, const int height) override;
+	virtual void handleResizeImpl(const int width, const int height, const int xdpi, const int ydpi) override;
 
 	/**
 	 * The default pixel format of the backend.
diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp
index 2d2a1ba..d959e02 100644
--- a/backends/graphics/openglsdl/openglsdl-graphics.cpp
+++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp
@@ -305,7 +305,8 @@ void OpenGLSdlGraphicsManager::notifyResize(const int width, const int height) {
 	getWindowSizeFromSdl(&currentWidth, &currentHeight);
 	if (width != currentWidth || height != currentHeight)
 		return;
-	handleResize(width, height);
+	// TODO: Implement high DPI support
+	handleResize(width, height, 90, 90);
 #else
 	if (!_ignoreResizeEvents && _hwScreen && !(_hwScreen->flags & SDL_FULLSCREEN)) {
 		// We save that we handled a resize event here. We need to know this
@@ -357,9 +358,9 @@ void *OpenGLSdlGraphicsManager::getProcAddress(const char *name) const {
 	return SDL_GL_GetProcAddress(name);
 }
 
-void OpenGLSdlGraphicsManager::handleResizeImpl(const int width, const int height) {
-	OpenGLGraphicsManager::handleResizeImpl(width, height);
-	SdlGraphicsManager::handleResizeImpl(width, height);
+void OpenGLSdlGraphicsManager::handleResizeImpl(const int width, const int height, const int xdpi, const int ydpi) {
+	OpenGLGraphicsManager::handleResizeImpl(width, height, xdpi, ydpi);
+	SdlGraphicsManager::handleResizeImpl(width, height, xdpi, ydpi);
 }
 
 bool OpenGLSdlGraphicsManager::saveScreenshot(const Common::String &filename) const {
@@ -463,7 +464,8 @@ bool OpenGLSdlGraphicsManager::setupMode(uint width, uint height) {
 	notifyContextCreate(rgba8888, rgba8888);
 	int actualWidth, actualHeight;
 	getWindowSizeFromSdl(&actualWidth, &actualHeight);
-	handleResize(actualWidth, actualHeight);
+	// TODO: Implement high DPI support
+	handleResize(actualWidth, actualHeight, 90, 90);
 	return true;
 #else
 	// WORKAROUND: Working around infamous SDL bugs when switching
@@ -510,7 +512,7 @@ bool OpenGLSdlGraphicsManager::setupMode(uint width, uint height) {
 
 	if (_hwScreen) {
 		notifyContextCreate(rgba8888, rgba8888);
-		handleResize(_hwScreen->w, _hwScreen->h);
+		handleResize(_hwScreen->w, _hwScreen->h, 90, 90);
 	}
 
 	// Ignore resize events (from SDL) for a few frames, if this isn't
diff --git a/backends/graphics/openglsdl/openglsdl-graphics.h b/backends/graphics/openglsdl/openglsdl-graphics.h
index 2729a52..929adc9 100644
--- a/backends/graphics/openglsdl/openglsdl-graphics.h
+++ b/backends/graphics/openglsdl/openglsdl-graphics.h
@@ -60,7 +60,7 @@ protected:
 
 	virtual void *getProcAddress(const char *name) const override;
 
-	virtual void handleResizeImpl(const int width, const int height) override;
+	virtual void handleResizeImpl(const int width, const int height, const int xdpi, const int ydpi) override;
 
 	virtual bool saveScreenshot(const Common::String &filename) const override;
 
diff --git a/backends/graphics/psp2sdl/psp2sdl-graphics.cpp b/backends/graphics/psp2sdl/psp2sdl-graphics.cpp
index f6333e2..2d26727 100644
--- a/backends/graphics/psp2sdl/psp2sdl-graphics.cpp
+++ b/backends/graphics/psp2sdl/psp2sdl-graphics.cpp
@@ -94,7 +94,7 @@ PSP2SdlGraphicsManager::PSP2SdlGraphicsManager(SdlEventSource *sdlEventSource, S
 	_shaders[0] = NULL;
 
 	/* Vita display size is always 960x544 (that's just the hardware) */
-	handleResize(960, 544);
+	handleResize(960, 544, 90, 90);
 }
 
 PSP2SdlGraphicsManager::~PSP2SdlGraphicsManager() {
diff --git a/backends/graphics/sdl/sdl-graphics.cpp b/backends/graphics/sdl/sdl-graphics.cpp
index 453c60c..0d310a417 100644
--- a/backends/graphics/sdl/sdl-graphics.cpp
+++ b/backends/graphics/sdl/sdl-graphics.cpp
@@ -230,7 +230,7 @@ void SdlGraphicsManager::setSystemMousePosition(const int x, const int y) {
 	}
 }
 
-void SdlGraphicsManager::handleResizeImpl(const int width, const int height) {
+void SdlGraphicsManager::handleResizeImpl(const int width, const int height, const int xdpi, const int ydpi) {
 	_eventSource->resetKeyboardEmulation(width - 1, height - 1);
 	_forceRedraw = true;
 }
diff --git a/backends/graphics/sdl/sdl-graphics.h b/backends/graphics/sdl/sdl-graphics.h
index 77c8d5d..d67557b 100644
--- a/backends/graphics/sdl/sdl-graphics.h
+++ b/backends/graphics/sdl/sdl-graphics.h
@@ -163,7 +163,7 @@ protected:
 
 	virtual void setSystemMousePosition(const int x, const int y) override;
 
-	virtual void handleResizeImpl(const int width, const int height) override;
+	virtual void handleResizeImpl(const int width, const int height, const int xdpi, const int ydpi) override;
 
 #if SDL_VERSION_ATLEAST(2, 0, 0)
 public:
diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
index 052ae37..3b2e3ea 100644
--- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
+++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
@@ -1021,7 +1021,7 @@ bool SurfaceSdlGraphicsManager::loadGFXMode() {
 	}
 
 #if !SDL_VERSION_ATLEAST(2, 0, 0)
-	handleResize(_videoMode.hardwareWidth, _videoMode.hardwareHeight);
+	handleResize(_videoMode.hardwareWidth, _videoMode.hardwareHeight, 90, 90);
 #endif
 
 	//
@@ -2507,8 +2507,8 @@ void SurfaceSdlGraphicsManager::drawOSD() {
 
 #endif
 
-void SurfaceSdlGraphicsManager::handleResizeImpl(const int width, const int height) {
-	SdlGraphicsManager::handleResizeImpl(width, height);
+void SurfaceSdlGraphicsManager::handleResizeImpl(const int width, const int height, const int xdpi, const int ydpi) {
+	SdlGraphicsManager::handleResizeImpl(width, height, xdpi, ydpi);
 	recalculateDisplayAreas();
 }
 
@@ -2715,7 +2715,7 @@ void SurfaceSdlGraphicsManager::notifyVideoExpose() {
 
 void SurfaceSdlGraphicsManager::notifyResize(const int width, const int height) {
 #if SDL_VERSION_ATLEAST(2, 0, 0)
-	handleResize(width, height);
+	handleResize(width, height, _xdpi, _ydpi);
 #endif
 }
 
@@ -2762,8 +2762,9 @@ SDL_Surface *SurfaceSdlGraphicsManager::SDL_SetVideoMode(int width, int height,
 		return nullptr;
 	}
 
+	// TODO: Implement high DPI support
 	getWindowSizeFromSdl(&_windowWidth, &_windowHeight);
-	handleResize(_windowWidth, _windowHeight);
+	handleResize(_windowWidth, _windowHeight, 90, 90);
 
 	SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, _videoMode.filtering ? "linear" : "nearest");
 
diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.h b/backends/graphics/surfacesdl/surfacesdl-graphics.h
index f5edd16..a51aa22 100644
--- a/backends/graphics/surfacesdl/surfacesdl-graphics.h
+++ b/backends/graphics/surfacesdl/surfacesdl-graphics.h
@@ -185,7 +185,7 @@ protected:
 		return _videoMode.scaleFactor;
 	}
 
-	virtual void handleResizeImpl(const int width, const int height) override;
+	virtual void handleResizeImpl(const int width, const int height, const int xdpi, const int ydpi) override;
 
 	virtual int getGraphicsModeScale(int mode) const override;
 	virtual ScalerProc *getGraphicsScalerProc(int mode) const;
diff --git a/backends/graphics/windowed.h b/backends/graphics/windowed.h
index 74933a1..549739d 100644
--- a/backends/graphics/windowed.h
+++ b/backends/graphics/windowed.h
@@ -49,6 +49,8 @@ public:
 		_cursorVisible(false),
 		_cursorX(0),
 		_cursorY(0),
+		_xdpi(90),
+		_ydpi(90),
 		_cursorNeedsRedraw(false),
 		_cursorLastInActiveArea(true) {}
 
@@ -93,7 +95,7 @@ protected:
 	 * Backend-specific implementation for updating internal surfaces that need
 	 * to reflect the new window size.
 	 */
-	virtual void handleResizeImpl(const int width, const int height) = 0;
+	virtual void handleResizeImpl(const int width, const int height, const int xdpi, const int ydpi) = 0;
 
 	/**
 	 * Converts the given point from the active virtual screen's coordinate
@@ -172,10 +174,12 @@ protected:
 	 * @param width The new width of the window, excluding window decoration.
 	 * @param height The new height of the window, excluding window decoration.
 	 */
-	void handleResize(const int width, const int height) {
+	void handleResize(const int width, const int height, const int xdpi, const int ydpi) {
 		_windowWidth = width;
 		_windowHeight = height;
-		handleResizeImpl(width, height);
+		_xdpi = xdpi;
+		_ydpi = ydpi;
+		handleResizeImpl(width, height, xdpi, ydpi);
 	}
 
 	/**
@@ -276,6 +280,11 @@ protected:
 	int _windowHeight;
 
 	/**
+	 * The DPI of the window.
+	 */
+	int _xdpi, _ydpi;
+
+	/**
 	 * Whether the overlay (i.e. launcher, including the out-of-game launcher)
 	 * is visible or not.
 	 */
diff --git a/backends/platform/android/graphics.cpp b/backends/platform/android/graphics.cpp
index c22e9bf..c359fcf 100644
--- a/backends/platform/android/graphics.cpp
+++ b/backends/platform/android/graphics.cpp
@@ -72,7 +72,9 @@ void AndroidGraphicsManager::initSurface() {
 	// mode we setup.
 	notifyContextCreate(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0));
 
-	handleResize(JNI::egl_surface_width, JNI::egl_surface_height);
+	float dpi[2];
+	JNI::getDPI(dpi);
+	handleResize(JNI::egl_surface_width, JNI::egl_surface_height, dpi[0], dpi[1]);
 }
 
 void AndroidGraphicsManager::deinitSurface() {





More information about the Scummvm-git-logs mailing list