mirror of https://github.com/stella-emu/stella.git
Native retina support.
This commit is contained in:
parent
c38febc2c1
commit
7b291db0d5
|
@ -28,6 +28,71 @@
|
||||||
"__cxx_version": "cpp",
|
"__cxx_version": "cpp",
|
||||||
"string": "cpp",
|
"string": "cpp",
|
||||||
"type_traits": "cpp",
|
"type_traits": "cpp",
|
||||||
"ostream": "cpp"
|
"ostream": "cpp",
|
||||||
|
"__bit_reference": "cpp",
|
||||||
|
"__config": "cpp",
|
||||||
|
"__debug": "cpp",
|
||||||
|
"__errc": "cpp",
|
||||||
|
"__hash_table": "cpp",
|
||||||
|
"__locale": "cpp",
|
||||||
|
"__mutex_base": "cpp",
|
||||||
|
"__node_handle": "cpp",
|
||||||
|
"__nullptr": "cpp",
|
||||||
|
"__split_buffer": "cpp",
|
||||||
|
"__string": "cpp",
|
||||||
|
"__threading_support": "cpp",
|
||||||
|
"__tree": "cpp",
|
||||||
|
"__tuple": "cpp",
|
||||||
|
"algorithm": "cpp",
|
||||||
|
"atomic": "cpp",
|
||||||
|
"bit": "cpp",
|
||||||
|
"bitset": "cpp",
|
||||||
|
"cctype": "cpp",
|
||||||
|
"chrono": "cpp",
|
||||||
|
"clocale": "cpp",
|
||||||
|
"cmath": "cpp",
|
||||||
|
"codecvt": "cpp",
|
||||||
|
"complex": "cpp",
|
||||||
|
"condition_variable": "cpp",
|
||||||
|
"cstdarg": "cpp",
|
||||||
|
"cstddef": "cpp",
|
||||||
|
"cstdint": "cpp",
|
||||||
|
"cstdio": "cpp",
|
||||||
|
"cstdlib": "cpp",
|
||||||
|
"cstring": "cpp",
|
||||||
|
"ctime": "cpp",
|
||||||
|
"cwchar": "cpp",
|
||||||
|
"cwctype": "cpp",
|
||||||
|
"deque": "cpp",
|
||||||
|
"exception": "cpp",
|
||||||
|
"fstream": "cpp",
|
||||||
|
"initializer_list": "cpp",
|
||||||
|
"ios": "cpp",
|
||||||
|
"iosfwd": "cpp",
|
||||||
|
"iostream": "cpp",
|
||||||
|
"iterator": "cpp",
|
||||||
|
"limits": "cpp",
|
||||||
|
"list": "cpp",
|
||||||
|
"map": "cpp",
|
||||||
|
"mutex": "cpp",
|
||||||
|
"new": "cpp",
|
||||||
|
"numeric": "cpp",
|
||||||
|
"optional": "cpp",
|
||||||
|
"queue": "cpp",
|
||||||
|
"random": "cpp",
|
||||||
|
"ratio": "cpp",
|
||||||
|
"set": "cpp",
|
||||||
|
"sstream": "cpp",
|
||||||
|
"stack": "cpp",
|
||||||
|
"stdexcept": "cpp",
|
||||||
|
"streambuf": "cpp",
|
||||||
|
"string_view": "cpp",
|
||||||
|
"system_error": "cpp",
|
||||||
|
"typeinfo": "cpp",
|
||||||
|
"unordered_map": "cpp",
|
||||||
|
"vector": "cpp",
|
||||||
|
"memory_resource": "cpp",
|
||||||
|
"cfenv": "cpp",
|
||||||
|
"cinttypes": "cpp"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,9 @@ FrameBufferSDL2::FrameBufferSDL2(OSystem& osystem)
|
||||||
myWindow(nullptr),
|
myWindow(nullptr),
|
||||||
myRenderer(nullptr),
|
myRenderer(nullptr),
|
||||||
myCenter(false),
|
myCenter(false),
|
||||||
myRenderTargetSupport(false)
|
myRenderTargetSupport(false),
|
||||||
|
myScaleX(1),
|
||||||
|
myScaleY(1)
|
||||||
{
|
{
|
||||||
ASSERT_MAIN_THREAD;
|
ASSERT_MAIN_THREAD;
|
||||||
|
|
||||||
|
@ -263,6 +265,7 @@ bool FrameBufferSDL2::setVideoMode(const string& title, const VideoMode& mode)
|
||||||
posY = BSPF::clamp(posY, y0 + 50, y1 - 50);
|
posY = BSPF::clamp(posY, y0 + 50, y1 - 50);
|
||||||
}
|
}
|
||||||
uInt32 flags = mode.fsIndex != -1 ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0;
|
uInt32 flags = mode.fsIndex != -1 ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0;
|
||||||
|
flags |= SDL_WINDOW_ALLOW_HIGHDPI;
|
||||||
|
|
||||||
// macOS seems to have issues with destroying the window, and wants to
|
// macOS seems to have issues with destroying the window, and wants to
|
||||||
// keep the same handle
|
// keep the same handle
|
||||||
|
@ -321,7 +324,9 @@ bool FrameBufferSDL2::setVideoMode(const string& title, const VideoMode& mode)
|
||||||
SDL_SetHint(SDL_HINT_RENDER_DRIVER, video.c_str());
|
SDL_SetHint(SDL_HINT_RENDER_DRIVER, video.c_str());
|
||||||
|
|
||||||
myRenderer = SDL_CreateRenderer(myWindow, -1, renderFlags);
|
myRenderer = SDL_CreateRenderer(myWindow, -1, renderFlags);
|
||||||
|
|
||||||
detectFeatures();
|
detectFeatures();
|
||||||
|
calculateScaleFactors();
|
||||||
|
|
||||||
if(myRenderer == nullptr)
|
if(myRenderer == nullptr)
|
||||||
{
|
{
|
||||||
|
@ -513,3 +518,30 @@ bool FrameBufferSDL2::hasRenderTargetSupport() const
|
||||||
{
|
{
|
||||||
return myRenderTargetSupport;
|
return myRenderTargetSupport;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void FrameBufferSDL2::calculateScaleFactors()
|
||||||
|
{
|
||||||
|
if (myRenderer == nullptr) {
|
||||||
|
myScaleX = myScaleY = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int windowW, windowH, renderW, renderH;
|
||||||
|
|
||||||
|
SDL_GetWindowSize(myWindow, &windowW, &windowH);
|
||||||
|
SDL_GetRendererOutputSize(myRenderer, &renderW, &renderH);
|
||||||
|
|
||||||
|
myScaleX = renderW / windowW;
|
||||||
|
myScaleY = renderH / windowH;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
uInt8 FrameBufferSDL2::scaleX() const {
|
||||||
|
return myScaleX;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
uInt8 FrameBufferSDL2::scaleY() const {
|
||||||
|
return myScaleY;
|
||||||
|
}
|
||||||
|
|
|
@ -134,6 +134,16 @@ class FrameBufferSDL2 : public FrameBuffer
|
||||||
*/
|
*/
|
||||||
bool hasRenderTargetSupport() const;
|
bool hasRenderTargetSupport() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Retina scale factor, x direction;
|
||||||
|
*/
|
||||||
|
uInt8 scaleX() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Retina scale Factor, y direction;
|
||||||
|
*/
|
||||||
|
uInt8 scaleY() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// The following are derived from protected methods in FrameBuffer.hxx
|
// The following are derived from protected methods in FrameBuffer.hxx
|
||||||
|
@ -208,6 +218,8 @@ class FrameBufferSDL2 : public FrameBuffer
|
||||||
*/
|
*/
|
||||||
bool detectRenderTargetSupport();
|
bool detectRenderTargetSupport();
|
||||||
|
|
||||||
|
void calculateScaleFactors();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// The SDL video buffer
|
// The SDL video buffer
|
||||||
SDL_Window* myWindow;
|
SDL_Window* myWindow;
|
||||||
|
@ -222,8 +234,12 @@ class FrameBufferSDL2 : public FrameBuffer
|
||||||
// last position of windowed window
|
// last position of windowed window
|
||||||
Common::Point myWindowedPos;
|
Common::Point myWindowedPos;
|
||||||
|
|
||||||
|
// Does the renderer support render targets?
|
||||||
bool myRenderTargetSupport;
|
bool myRenderTargetSupport;
|
||||||
|
|
||||||
|
// Retina scale factors
|
||||||
|
uInt32 myScaleX, myScaleY;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
FrameBufferSDL2() = delete;
|
FrameBufferSDL2() = delete;
|
||||||
|
|
|
@ -57,6 +57,11 @@ void BilinearBlitter::reinitialize(
|
||||||
mySrcRect = srcRect;
|
mySrcRect = srcRect;
|
||||||
myDstRect = destRect;
|
myDstRect = destRect;
|
||||||
myAttributes = attributes;
|
myAttributes = attributes;
|
||||||
|
|
||||||
|
myDstRect.x *= myFB.scaleX();
|
||||||
|
myDstRect.y *= myFB.scaleY();
|
||||||
|
myDstRect.w *= myFB.scaleX();
|
||||||
|
myDstRect.h *= myFB.scaleY();
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -65,6 +65,11 @@ void QisBlitter::reinitialize(
|
||||||
mySrcRect = srcRect;
|
mySrcRect = srcRect;
|
||||||
myDstRect = destRect;
|
myDstRect = destRect;
|
||||||
myAttributes = attributes;
|
myAttributes = attributes;
|
||||||
|
|
||||||
|
myDstRect.x *= myFB.scaleX();
|
||||||
|
myDstRect.y *= myFB.scaleY();
|
||||||
|
myDstRect.w *= myFB.scaleX();
|
||||||
|
myDstRect.h *= myFB.scaleY();
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
Loading…
Reference in New Issue