From 3b1783a48d6d68e55a6c0836f33990acb2dc8da6 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Tue, 16 Apr 2019 19:27:30 +0300 Subject: [PATCH] Fix couple problems in Tetris sample. --- .../src/tetrisMain/kotlin/SDL_Visualizer.kt | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/samples/tetris/src/tetrisMain/kotlin/SDL_Visualizer.kt b/samples/tetris/src/tetrisMain/kotlin/SDL_Visualizer.kt index e3a1458fd22..8d582b531b3 100644 --- a/samples/tetris/src/tetrisMain/kotlin/SDL_Visualizer.kt +++ b/samples/tetris/src/tetrisMain/kotlin/SDL_Visualizer.kt @@ -31,7 +31,7 @@ class SDL_Visualizer(val width: Int, val height: Int): GameFieldVisualizer, User private val NEXT_LABEL_WIDTH = 85 private val TETRISES_LABEL_WIDTH = 162 - private val ratio: Float + private var ratio: Float private fun stretch(value: Int) = (value.toFloat() * ratio + 0.5).toInt() @@ -114,8 +114,8 @@ class SDL_Visualizer(val width: Int, val height: Int): GameFieldVisualizer, User private var displayHeight: Int = 0 private val fieldWidth: Int private val fieldHeight: Int - private val windowX: Int - private val windowY: Int + private var windowX: Int + private var windowY: Int private val window: CPointer private val renderer: CPointer private val texture: CPointer @@ -124,8 +124,7 @@ class SDL_Visualizer(val width: Int, val height: Int): GameFieldVisualizer, User init { if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { - println("SDL_Init Error: ${get_SDL_Error()}") - throw Error() + throw Error("SDL_Init Error: ${get_SDL_Error()}") } platform = SDL_GetPlatform()!!.toKString() @@ -160,7 +159,8 @@ class SDL_Visualizer(val width: Int, val height: Int): GameFieldVisualizer, User windowY = (displayHeight - windowHeight) / 2 ratio = 1.0f } - val window = SDL_CreateWindow("Tetris", windowX, windowY, windowWidth, windowHeight, SDL_WINDOW_SHOWN) + val window = SDL_CreateWindow("Tetris", windowX, windowY, windowWidth, windowHeight, + SDL_WINDOW_SHOWN or SDL_WINDOW_ALLOW_HIGHDPI) if (window == null) { println("SDL_CreateWindow Error: ${get_SDL_Error()}") SDL_Quit() @@ -177,11 +177,29 @@ class SDL_Visualizer(val width: Int, val height: Int): GameFieldVisualizer, User } this.renderer = renderer - // Workaround for Mojave SDL bug, see https://bugzilla.libsdl.org/show_bug.cgi?id=4272 - SDL_PumpEvents() - SDL_SetWindowSize(window, windowWidth, windowHeight) + memScoped { + val realWidth = alloc() + val realHeight = alloc() + SDL_GetRendererOutputSize(renderer, realWidth.ptr, realHeight.ptr) + if (platform != "iOS" && windowHeight != realHeight.value) { + println("DPI differs ${realWidth.value} x ${realHeight.value} vs $windowWidth x $windowHeight") + ratio = realHeight.value.toFloat() / windowHeight + } + } - texture = loadImage(window, renderer, "tetris_all.bmp") + texture = loadImage(window, renderer, findFile("tetris_all.bmp")) + } + + private fun findFile(name: String): String { + memScoped { + val dirs = listOf(".", SDL_GetBasePath()?.toKString() ?: "/") + val statBuffer = alloc() + dirs.forEach { + val candidate = "$it/$name" + if (stat(candidate, statBuffer.ptr) == 0) return candidate + } + throw Error("name not found") + } } private fun loadImage(win: CPointer, ren: CPointer, imagePath: String): CPointer {