diff --git a/lime/_backend/native/NativeRenderer.hx b/lime/_backend/native/NativeRenderer.hx index 751fe8398..a07f5d7a7 100644 --- a/lime/_backend/native/NativeRenderer.hx +++ b/lime/_backend/native/NativeRenderer.hx @@ -14,7 +14,6 @@ import lime.graphics.Renderer; @:build(lime.system.CFFI.build()) #end -@:access(lime._backend.native.NativeWindow) @:access(lime.graphics.cairo.Cairo) @:access(lime.ui.Window) @@ -46,10 +45,7 @@ class NativeRenderer { #if !macro handle = lime_renderer_create (parent.window.backend.handle); - #if (mac || ios) - parent.window.__width = NativeWindow.lime_window_get_width (parent.window.backend.handle); - parent.window.__height = NativeWindow.lime_window_get_height (parent.window.backend.handle); - #end + parent.window.__scale = lime_renderer_get_scale (handle); #if lime_console @@ -163,6 +159,7 @@ class NativeRenderer { @:cffi private static function lime_renderer_create (window:Dynamic):Dynamic; @:cffi private static function lime_renderer_flip (handle:Dynamic):Void; @:cffi private static function lime_renderer_get_context (handle:Dynamic):Float; + @:cffi private static function lime_renderer_get_scale (handle:Dynamic):Float; @:cffi private static function lime_renderer_get_type (handle:Dynamic):Dynamic; @:cffi private static function lime_renderer_lock (handle:Dynamic):Dynamic; @:cffi private static function lime_renderer_make_current (handle:Dynamic):Void; diff --git a/lime/ui/Window.hx b/lime/ui/Window.hx index f20f3e579..fa1527021 100644 --- a/lime/ui/Window.hx +++ b/lime/ui/Window.hx @@ -49,6 +49,7 @@ class Window { public var onTextEdit = new EventInt->Int->Void> (); public var onTextInput = new EventVoid> (); public var renderer:Renderer; + public var scale (get, null):Float; public var stage:Stage; public var title (get, set):String; public var width (get, set):Int; @@ -59,6 +60,7 @@ class Window { @:noCompletion private var __fullscreen:Bool; @:noCompletion private var __height:Int; @:noCompletion private var __minimized:Bool; + @:noCompletion private var __scale:Float; @:noCompletion private var __title:String; @:noCompletion private var __width:Int; @:noCompletion private var __x:Int; @@ -72,6 +74,7 @@ class Window { __width = 0; __height = 0; __fullscreen = false; + __scale = 1; __x = 0; __y = 0; __title = ""; @@ -367,6 +370,13 @@ class Window { } + @:noCompletion private inline function get_scale ():Float { + + return __scale; + + } + + @:noCompletion private inline function get_title ():String { return __title; diff --git a/project/include/graphics/Renderer.h b/project/include/graphics/Renderer.h index b87009f0c..daaeb4895 100644 --- a/project/include/graphics/Renderer.h +++ b/project/include/graphics/Renderer.h @@ -16,6 +16,7 @@ namespace lime { virtual void Flip () = 0; virtual void* GetContext () = 0; + virtual double GetScale () = 0; virtual value Lock () = 0; virtual void MakeCurrent () = 0; virtual const char* Type () = 0; diff --git a/project/src/ExternalInterface.cpp b/project/src/ExternalInterface.cpp index 6b496bee8..470f2ca91 100644 --- a/project/src/ExternalInterface.cpp +++ b/project/src/ExternalInterface.cpp @@ -991,6 +991,14 @@ namespace lime { } + double lime_renderer_get_scale (value renderer) { + + Renderer* targetRenderer = (Renderer*)val_data (renderer); + return targetRenderer->GetScale (); + + } + + value lime_renderer_get_type (value renderer) { Renderer* targetRenderer = (Renderer*)val_data (renderer); @@ -1367,6 +1375,7 @@ namespace lime { DEFINE_PRIME1 (lime_renderer_create); DEFINE_PRIME1v (lime_renderer_flip); DEFINE_PRIME1 (lime_renderer_get_context); + DEFINE_PRIME1 (lime_renderer_get_scale); DEFINE_PRIME1 (lime_renderer_get_type); DEFINE_PRIME1 (lime_renderer_lock); DEFINE_PRIME1v (lime_renderer_make_current); diff --git a/project/src/backend/sdl/SDLApplication.cpp b/project/src/backend/sdl/SDLApplication.cpp index 3dd5548c8..3e3a89a60 100644 --- a/project/src/backend/sdl/SDLApplication.cpp +++ b/project/src/backend/sdl/SDLApplication.cpp @@ -536,9 +536,8 @@ namespace lime { case SDL_WINDOWEVENT_SIZE_CHANGED: windowEvent.type = WINDOW_RESIZE; - SDL_GL_GetDrawableSize (SDL_GetWindowFromID (event->window.windowID), &windowEvent.width, &windowEvent.height); - //windowEvent.width = event->window.data1; - //windowEvent.height = event->window.data2; + windowEvent.width = event->window.data1; + windowEvent.height = event->window.data2; break; case SDL_WINDOWEVENT_RESTORED: windowEvent.type = WINDOW_RESTORE; break; diff --git a/project/src/backend/sdl/SDLRenderer.cpp b/project/src/backend/sdl/SDLRenderer.cpp index 13b44c00d..c9cc9239b 100644 --- a/project/src/backend/sdl/SDLRenderer.cpp +++ b/project/src/backend/sdl/SDLRenderer.cpp @@ -85,6 +85,24 @@ namespace lime { } + double SDLRenderer::GetScale () { + + int outputWidth; + int outputHeight; + + SDL_GetRendererOutputSize (sdlRenderer, &outputWidth, &outputHeight); + + int width; + int height; + + SDL_GetWindowSize (sdlWindow, &width, &height); + + double scale = outputWidth / width; + return scale; + + } + + value SDLRenderer::Lock () { int width; diff --git a/project/src/backend/sdl/SDLRenderer.h b/project/src/backend/sdl/SDLRenderer.h index ae530517a..6b35ae222 100644 --- a/project/src/backend/sdl/SDLRenderer.h +++ b/project/src/backend/sdl/SDLRenderer.h @@ -18,6 +18,7 @@ namespace lime { virtual void Flip (); virtual void* GetContext (); + virtual double GetScale (); virtual value Lock (); virtual void MakeCurrent (); virtual const char* Type (); diff --git a/project/src/backend/sdl/SDLWindow.cpp b/project/src/backend/sdl/SDLWindow.cpp index b527b88be..857781341 100644 --- a/project/src/backend/sdl/SDLWindow.cpp +++ b/project/src/backend/sdl/SDLWindow.cpp @@ -173,19 +173,7 @@ namespace lime { int width; int height; - SDL_GL_GetDrawableSize (sdlWindow, &width, &height); - - SDL_Renderer* sdlRenderer = SDL_GetRenderer (sdlWindow); - - if (sdlRenderer) { - - SDL_GetRendererOutputSize (sdlRenderer, &width, &height); - - } else { - - SDL_GetWindowSize (sdlWindow, &width, &height); - - } + SDL_GetWindowSize (sdlWindow, &width, &height); return height; @@ -204,17 +192,7 @@ namespace lime { int width; int height; - SDL_Renderer* sdlRenderer = SDL_GetRenderer (sdlWindow); - - if (sdlRenderer) { - - SDL_GetRendererOutputSize (sdlRenderer, &width, &height); - - } else { - - SDL_GetWindowSize (sdlWindow, &width, &height); - - } + SDL_GetWindowSize (sdlWindow, &width, &height); return width;