|
@@ -11,11 +11,14 @@
|
|
|
#include "StdInc.h"
|
|
|
#include "CursorHardware.h"
|
|
|
|
|
|
+#include "SDL_Extensions.h"
|
|
|
+
|
|
|
#include "../gui/CGuiHandler.h"
|
|
|
#include "../render/IScreenHandler.h"
|
|
|
#include "../render/Colors.h"
|
|
|
#include "../render/IImage.h"
|
|
|
-#include "SDL_Extensions.h"
|
|
|
+
|
|
|
+#include "../../lib/CConfigHandler.h"
|
|
|
|
|
|
#include <SDL_render.h>
|
|
|
#include <SDL_events.h>
|
|
@@ -45,19 +48,26 @@ void CursorHardware::setVisible(bool on)
|
|
|
|
|
|
void CursorHardware::setImage(std::shared_ptr<IImage> image, const Point & pivotOffset)
|
|
|
{
|
|
|
- auto cursorSurface = CSDL_Ext::newSurface(image->dimensions() * GH.screenHandler().getScalingFactor());
|
|
|
+ int cursorScalingPercent = settings["video"]["resolution"]["scaling"].Integer();
|
|
|
+ Point cursorDimensions = image->dimensions() * GH.screenHandler().getScalingFactor();
|
|
|
+ Point cursorDimensionsScaled = image->dimensions() * cursorScalingPercent / 100;
|
|
|
+ Point pivotOffsetScaled = pivotOffset * cursorScalingPercent / 100 / GH.screenHandler().getScalingFactor();
|
|
|
+
|
|
|
+ auto cursorSurface = CSDL_Ext::newSurface(cursorDimensions);
|
|
|
|
|
|
CSDL_Ext::fillSurface(cursorSurface, CSDL_Ext::toSDL(Colors::TRANSPARENCY));
|
|
|
|
|
|
image->draw(cursorSurface, Point(0,0));
|
|
|
+ auto cursorSurfaceScaled = CSDL_Ext::scaleSurface(cursorSurface, cursorDimensionsScaled.x, cursorDimensionsScaled.y );
|
|
|
|
|
|
auto oldCursor = cursor;
|
|
|
- cursor = SDL_CreateColorCursor(cursorSurface, pivotOffset.x, pivotOffset.y);
|
|
|
+ cursor = SDL_CreateColorCursor(cursorSurfaceScaled, pivotOffsetScaled.x, pivotOffsetScaled.y);
|
|
|
|
|
|
if (!cursor)
|
|
|
logGlobal->error("Failed to set cursor! SDL says %s", SDL_GetError());
|
|
|
|
|
|
SDL_FreeSurface(cursorSurface);
|
|
|
+ SDL_FreeSurface(cursorSurfaceScaled);
|
|
|
|
|
|
GH.dispatchMainThread([this, oldCursor](){
|
|
|
SDL_SetCursor(cursor);
|