mirror of
https://github.com/vcmi/vcmi.git
synced 2025-02-09 13:14:02 +02:00
Implemented scaling of hardware cursor
This commit is contained in:
parent
42adc9d394
commit
58d13fdce5
@ -250,8 +250,8 @@ void CGuiHandler::setStatusbar(std::shared_ptr<IStatusBar> newStatusBar)
|
|||||||
void CGuiHandler::onScreenResize(bool resolutionChanged)
|
void CGuiHandler::onScreenResize(bool resolutionChanged)
|
||||||
{
|
{
|
||||||
if(resolutionChanged)
|
if(resolutionChanged)
|
||||||
{
|
|
||||||
screenHandler().onScreenResize();
|
screenHandler().onScreenResize();
|
||||||
}
|
|
||||||
windows().onScreenResize();
|
windows().onScreenResize();
|
||||||
|
CCS->curh->onScreenResize();
|
||||||
}
|
}
|
||||||
|
@ -312,3 +312,8 @@ void CursorHandler::changeCursor(Cursor::ShowType newShowType)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CursorHandler::onScreenResize()
|
||||||
|
{
|
||||||
|
cursor->setImage(getCurrentImage(), getPivotOffset());
|
||||||
|
}
|
||||||
|
@ -182,6 +182,7 @@ public:
|
|||||||
|
|
||||||
void hide();
|
void hide();
|
||||||
void show();
|
void show();
|
||||||
|
void onScreenResize();
|
||||||
|
|
||||||
/// change cursor's positions to (x, y)
|
/// change cursor's positions to (x, y)
|
||||||
void cursorMove(const int & x, const int & y);
|
void cursorMove(const int & x, const int & y);
|
||||||
|
@ -11,11 +11,14 @@
|
|||||||
#include "StdInc.h"
|
#include "StdInc.h"
|
||||||
#include "CursorHardware.h"
|
#include "CursorHardware.h"
|
||||||
|
|
||||||
|
#include "SDL_Extensions.h"
|
||||||
|
|
||||||
#include "../gui/CGuiHandler.h"
|
#include "../gui/CGuiHandler.h"
|
||||||
#include "../render/IScreenHandler.h"
|
#include "../render/IScreenHandler.h"
|
||||||
#include "../render/Colors.h"
|
#include "../render/Colors.h"
|
||||||
#include "../render/IImage.h"
|
#include "../render/IImage.h"
|
||||||
#include "SDL_Extensions.h"
|
|
||||||
|
#include "../../lib/CConfigHandler.h"
|
||||||
|
|
||||||
#include <SDL_render.h>
|
#include <SDL_render.h>
|
||||||
#include <SDL_events.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)
|
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));
|
CSDL_Ext::fillSurface(cursorSurface, CSDL_Ext::toSDL(Colors::TRANSPARENCY));
|
||||||
|
|
||||||
image->draw(cursorSurface, Point(0,0));
|
image->draw(cursorSurface, Point(0,0));
|
||||||
|
auto cursorSurfaceScaled = CSDL_Ext::scaleSurface(cursorSurface, cursorDimensionsScaled.x, cursorDimensionsScaled.y );
|
||||||
|
|
||||||
auto oldCursor = cursor;
|
auto oldCursor = cursor;
|
||||||
cursor = SDL_CreateColorCursor(cursorSurface, pivotOffset.x, pivotOffset.y);
|
cursor = SDL_CreateColorCursor(cursorSurfaceScaled, pivotOffsetScaled.x, pivotOffsetScaled.y);
|
||||||
|
|
||||||
if (!cursor)
|
if (!cursor)
|
||||||
logGlobal->error("Failed to set cursor! SDL says %s", SDL_GetError());
|
logGlobal->error("Failed to set cursor! SDL says %s", SDL_GetError());
|
||||||
|
|
||||||
SDL_FreeSurface(cursorSurface);
|
SDL_FreeSurface(cursorSurface);
|
||||||
|
SDL_FreeSurface(cursorSurfaceScaled);
|
||||||
|
|
||||||
GH.dispatchMainThread([this, oldCursor](){
|
GH.dispatchMainThread([this, oldCursor](){
|
||||||
SDL_SetCursor(cursor);
|
SDL_SetCursor(cursor);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user