mirror of https://github.com/bsnes-emu/bsnes.git
Update to v104r14 release.
byuu says: Changelog: - Emulator::Interface::videoResolution() -\> VideoResolution renamed to videoInformation() -\> VideoInformation - added double VideoInformation::refreshRate - higan: added `binary := (application|library)` — set this to `library` to produce a dynamic link library - higan: removed `-march=native` for macOS application builds; and for all library builds - higan: removed `console` build flag; uncomment `link += -mwindows` instead - nall/GNUmakefile: `macosx` platform renamed `macos` - still need to do this for nall/intrinsics.hpp - Game Gear: return region=NTSC as the only option, so that the system frequency is always set correctly - hiro/cocoa: fixed typo [Sintendo] - hiro/Windows: removed GetDpiForMonitor, as it's Windows 8+ only; DPI is no longer per-monitor aware - icarus: core Icarus class now has virtual functions for directory::create, <file::exists>, <file::copy>, <file::write> - icarus: Sufami Turbo can import save RAM files now - icarus: setting `ICARUS_LIBRARY` define will compile icarus without main(), GUI components - ruby/video/Direct3D: choose the current monitor instead of top-left monitor for fullscreen exclusive [Cydrak] - ruby/video/Direct3D: do not set `WS_EX_TOPMOST` on fullscreen exclusive window [Cydrak] - this isn't necessary for exclusive mode, and it just makes getting out of the application more difficult
This commit is contained in:
parent
c63e6f2953
commit
fbc58c70ae
|
@ -1,28 +1,38 @@
|
||||||
build := optimize
|
build := optimize
|
||||||
include ../nall/GNUmakefile
|
include ../nall/GNUmakefile
|
||||||
|
|
||||||
|
binary := application
|
||||||
target := tomoko
|
target := tomoko
|
||||||
objects := libco emulator audio video resource
|
objects := libco emulator audio video resource
|
||||||
# console := true
|
|
||||||
|
|
||||||
flags += -I. -I..
|
flags += -I. -I..
|
||||||
|
|
||||||
ifeq ($(platform),windows)
|
ifeq ($(platform),windows)
|
||||||
ifeq ($(console),true)
|
link += -mwindows
|
||||||
link += -mconsole
|
ifeq ($(binary),application)
|
||||||
else
|
link += -mthreads -lpthread -luuid -lkernel32 -luser32 -lgdi32 -lcomctl32 -lcomdlg32 -lshell32
|
||||||
link += -mwindows
|
link += -Wl,-enable-auto-import
|
||||||
|
link += -Wl,-enable-runtime-pseudo-reloc
|
||||||
|
else ifeq ($(binary),library)
|
||||||
|
link += -shared
|
||||||
|
endif
|
||||||
|
else ifeq ($(platform),macos)
|
||||||
|
ifeq ($(binary),application)
|
||||||
|
else ifeq ($(binary),library)
|
||||||
|
flags += -fPIC
|
||||||
|
link += -dynamiclib
|
||||||
endif
|
endif
|
||||||
link += -mthreads -lpthread -luuid -lkernel32 -luser32 -lgdi32 -lcomctl32 -lcomdlg32 -lshell32
|
|
||||||
link += -Wl,-enable-auto-import
|
|
||||||
link += -Wl,-enable-runtime-pseudo-reloc
|
|
||||||
else ifeq ($(platform),macosx)
|
|
||||||
flags += -march=native
|
|
||||||
else ifneq ($(filter $(platform),linux bsd),)
|
else ifneq ($(filter $(platform),linux bsd),)
|
||||||
flags += -march=native -fopenmp
|
flags += -fopenmp
|
||||||
link += -fopenmp
|
link += -fopenmp
|
||||||
link += -Wl,-export-dynamic
|
ifeq ($(binary),application)
|
||||||
link += -lX11 -lXext
|
flags += -march=native
|
||||||
|
link += -Wl,-export-dynamic
|
||||||
|
link += -lX11 -lXext
|
||||||
|
else ifeq ($(binary),library)
|
||||||
|
flags += -fPIC
|
||||||
|
link += -shared
|
||||||
|
endif
|
||||||
else
|
else
|
||||||
$(error "unsupported platform")
|
$(error "unsupported platform")
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -12,7 +12,7 @@ using namespace nall;
|
||||||
|
|
||||||
namespace Emulator {
|
namespace Emulator {
|
||||||
static const string Name = "higan";
|
static const string Name = "higan";
|
||||||
static const string Version = "104.13";
|
static const string Version = "104.14";
|
||||||
static const string Author = "byuu";
|
static const string Author = "byuu";
|
||||||
static const string License = "GPLv3";
|
static const string License = "GPLv3";
|
||||||
static const string Website = "https://byuu.org/";
|
static const string Website = "https://byuu.org/";
|
||||||
|
|
|
@ -37,15 +37,15 @@ struct Interface {
|
||||||
virtual auto manifest() -> string = 0;
|
virtual auto manifest() -> string = 0;
|
||||||
virtual auto title() -> string = 0;
|
virtual auto title() -> string = 0;
|
||||||
|
|
||||||
//video information
|
struct VideoInformation {
|
||||||
struct VideoResolution {
|
uint width = 0;
|
||||||
uint width;
|
uint height = 0;
|
||||||
uint height;
|
uint internalWidth = 0;
|
||||||
uint internalWidth;
|
uint internalHeight = 0;
|
||||||
uint internalHeight;
|
double aspectCorrection = 0;
|
||||||
double aspectCorrection;
|
double refreshRate = 0;
|
||||||
};
|
};
|
||||||
virtual auto videoResolution() -> VideoResolution = 0;
|
virtual auto videoInformation() -> VideoInformation = 0;
|
||||||
virtual auto videoColors() -> uint32 = 0;
|
virtual auto videoColors() -> uint32 = 0;
|
||||||
virtual auto videoColor(uint32 color) -> uint64 = 0;
|
virtual auto videoColor(uint32 color) -> uint64 = 0;
|
||||||
|
|
||||||
|
|
|
@ -44,8 +44,15 @@ auto Interface::title() -> string {
|
||||||
return cartridge.title();
|
return cartridge.title();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoResolution() -> VideoResolution {
|
auto Interface::videoInformation() -> VideoInformation {
|
||||||
return {256, 240, 256, 240, 8.0 / 7.0};
|
VideoInformation vi;
|
||||||
|
vi.width = 256;
|
||||||
|
vi.height = 240;
|
||||||
|
vi.internalWidth = 256;
|
||||||
|
vi.internalHeight = 240;
|
||||||
|
vi.aspectCorrection = 8.0 / 7.0;
|
||||||
|
vi.refreshRate = system.frequency() / (ppu.vlines() * ppu.rate() * 341.0);
|
||||||
|
return vi;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoColors() -> uint32 {
|
auto Interface::videoColors() -> uint32 {
|
||||||
|
|
|
@ -26,7 +26,7 @@ struct Interface : Emulator::Interface {
|
||||||
auto manifest() -> string override;
|
auto manifest() -> string override;
|
||||||
auto title() -> string override;
|
auto title() -> string override;
|
||||||
|
|
||||||
auto videoResolution() -> VideoResolution override;
|
auto videoInformation() -> VideoInformation override;
|
||||||
auto videoColors() -> uint32 override;
|
auto videoColors() -> uint32 override;
|
||||||
auto videoColor(uint32 color) -> uint64 override;
|
auto videoColor(uint32 color) -> uint64 override;
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,15 @@ auto Interface::title() -> string {
|
||||||
return cartridge.title();
|
return cartridge.title();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoResolution() -> VideoResolution {
|
auto Interface::videoInformation() -> VideoInformation {
|
||||||
return {160, 144, 160, 144, 1.0};
|
VideoInformation vi;
|
||||||
|
vi.width = 160;
|
||||||
|
vi.height = 144;
|
||||||
|
vi.internalWidth = 160;
|
||||||
|
vi.internalHeight = 144;
|
||||||
|
vi.aspectCorrection = 1.0;
|
||||||
|
vi.refreshRate = (4.0 * 1024.0 * 1024.0) / (154.0 * 456.0);
|
||||||
|
return vi;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::loaded() -> bool {
|
auto Interface::loaded() -> bool {
|
||||||
|
|
|
@ -23,7 +23,7 @@ struct Interface : Emulator::Interface {
|
||||||
auto manifest() -> string override;
|
auto manifest() -> string override;
|
||||||
auto title() -> string override;
|
auto title() -> string override;
|
||||||
|
|
||||||
auto videoResolution() -> VideoResolution override;
|
auto videoInformation() -> VideoInformation override;
|
||||||
|
|
||||||
auto loaded() -> bool override;
|
auto loaded() -> bool override;
|
||||||
auto sha256() -> string override;
|
auto sha256() -> string override;
|
||||||
|
|
|
@ -39,12 +39,19 @@ auto Interface::title() -> string {
|
||||||
return cartridge.title();
|
return cartridge.title();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoResolution() -> VideoResolution {
|
auto Interface::videoInformation() -> VideoInformation {
|
||||||
if(!settings.rotateLeft) {
|
VideoInformation vi;
|
||||||
return {240, 160, 240, 160, 1.0};
|
vi.width = 240;
|
||||||
} else {
|
vi.height = 160;
|
||||||
return {160, 240, 160, 240, 1.0};
|
vi.internalWidth = 240;
|
||||||
|
vi.internalHeight = 160;
|
||||||
|
vi.aspectCorrection = 1.0;
|
||||||
|
vi.refreshRate = system.frequency() / (228.0 * 1232.0);
|
||||||
|
if(settings.rotateLeft) {
|
||||||
|
swap(vi.width, vi.height);
|
||||||
|
swap(vi.internalWidth, vi.internalHeight);
|
||||||
}
|
}
|
||||||
|
return vi;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoColors() -> uint32 {
|
auto Interface::videoColors() -> uint32 {
|
||||||
|
|
|
@ -23,7 +23,7 @@ struct Interface : Emulator::Interface {
|
||||||
auto manifest() -> string override;
|
auto manifest() -> string override;
|
||||||
auto title() -> string override;
|
auto title() -> string override;
|
||||||
|
|
||||||
auto videoResolution() -> VideoResolution override;
|
auto videoInformation() -> VideoInformation override;
|
||||||
auto videoColors() -> uint32 override;
|
auto videoColors() -> uint32 override;
|
||||||
auto videoColor(uint32 color) -> uint64 override;
|
auto videoColor(uint32 color) -> uint64 override;
|
||||||
|
|
||||||
|
|
|
@ -64,8 +64,15 @@ auto Interface::title() -> string {
|
||||||
return cartridge.title();
|
return cartridge.title();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoResolution() -> VideoResolution {
|
auto Interface::videoInformation() -> VideoInformation {
|
||||||
return {320, 240, 1280, 480, 1.0};
|
VideoInformation vi;
|
||||||
|
vi.width = 320;
|
||||||
|
vi.height = 240;
|
||||||
|
vi.internalWidth = 1280;
|
||||||
|
vi.internalHeight = 480;
|
||||||
|
vi.aspectCorrection = 1.0;
|
||||||
|
vi.refreshRate = (system.frequency() / 2.0) / (vdp.frameHeight() * 1710.0);
|
||||||
|
return vi;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoColors() -> uint32 {
|
auto Interface::videoColors() -> uint32 {
|
||||||
|
|
|
@ -27,7 +27,7 @@ struct Interface : Emulator::Interface {
|
||||||
auto manifest() -> string override;
|
auto manifest() -> string override;
|
||||||
auto title() -> string override;
|
auto title() -> string override;
|
||||||
|
|
||||||
auto videoResolution() -> VideoResolution override;
|
auto videoInformation() -> VideoInformation override;
|
||||||
auto videoColors() -> uint32 override;
|
auto videoColors() -> uint32 override;
|
||||||
auto videoColor(uint32 color) -> uint64 override;
|
auto videoColor(uint32 color) -> uint64 override;
|
||||||
|
|
||||||
|
|
|
@ -262,6 +262,8 @@ private:
|
||||||
|
|
||||||
uint32 buffer[1280 * 512];
|
uint32 buffer[1280 * 512];
|
||||||
uint32* output = nullptr;
|
uint32* output = nullptr;
|
||||||
|
|
||||||
|
friend class Interface;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern VDP vdp;
|
extern VDP vdp;
|
||||||
|
|
|
@ -17,7 +17,7 @@ auto Cartridge::load() -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Model::GameGear()) {
|
if(Model::GameGear()) {
|
||||||
if(auto loaded = platform->load(ID::GameGear, "Game Gear", "gg")) {
|
if(auto loaded = platform->load(ID::GameGear, "Game Gear", "gg", {"NTSC"})) {
|
||||||
information.pathID = loaded.pathID();
|
information.pathID = loaded.pathID();
|
||||||
} else return false;
|
} else return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,8 +21,15 @@ GameGearInterface::GameGearInterface() {
|
||||||
ports.append(move(hardware));
|
ports.append(move(hardware));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto GameGearInterface::videoResolution() -> VideoResolution {
|
auto GameGearInterface::videoInformation() -> VideoInformation {
|
||||||
return {160, 144, 160, 144, 1.0};
|
VideoInformation vi;
|
||||||
|
vi.width = 160;
|
||||||
|
vi.height = 144;
|
||||||
|
vi.internalWidth = 160;
|
||||||
|
vi.internalHeight = 144;
|
||||||
|
vi.aspectCorrection = 1.0;
|
||||||
|
vi.refreshRate = (system.colorburst() * 15.0 / 5.0) / (262.0 * 684.0);
|
||||||
|
return vi;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto GameGearInterface::videoColors() -> uint32 {
|
auto GameGearInterface::videoColors() -> uint32 {
|
||||||
|
|
|
@ -50,7 +50,7 @@ struct MasterSystemInterface : Interface {
|
||||||
|
|
||||||
MasterSystemInterface();
|
MasterSystemInterface();
|
||||||
|
|
||||||
auto videoResolution() -> VideoResolution override;
|
auto videoInformation() -> VideoInformation override;
|
||||||
auto videoColors() -> uint32 override;
|
auto videoColors() -> uint32 override;
|
||||||
auto videoColor(uint32 color) -> uint64 override;
|
auto videoColor(uint32 color) -> uint64 override;
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ struct GameGearInterface : Interface {
|
||||||
|
|
||||||
GameGearInterface();
|
GameGearInterface();
|
||||||
|
|
||||||
auto videoResolution() -> VideoResolution override;
|
auto videoInformation() -> VideoInformation override;
|
||||||
auto videoColors() -> uint32 override;
|
auto videoColors() -> uint32 override;
|
||||||
auto videoColor(uint32 color) -> uint64 override;
|
auto videoColor(uint32 color) -> uint64 override;
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,16 @@ MasterSystemInterface::MasterSystemInterface() {
|
||||||
ports.append(move(hardware));
|
ports.append(move(hardware));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto MasterSystemInterface::videoResolution() -> VideoResolution {
|
auto MasterSystemInterface::videoInformation() -> VideoInformation {
|
||||||
return {256, 240, 256, 240, 8.0 / 7.0};
|
VideoInformation vi;
|
||||||
|
vi.width = 256;
|
||||||
|
vi.height = 240;
|
||||||
|
vi.internalWidth = 256;
|
||||||
|
vi.internalHeight = 240;
|
||||||
|
vi.aspectCorrection = 8.0 / 7.0;
|
||||||
|
if(Region::NTSC()) vi.refreshRate = (system.colorburst() * 15.0 / 5.0) / (262.0 * 684.0);
|
||||||
|
if(Region::PAL()) vi.refreshRate = (system.colorburst() * 15.0 / 5.0) / (312.0 * 684.0);
|
||||||
|
return vi;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto MasterSystemInterface::videoColors() -> uint32 {
|
auto MasterSystemInterface::videoColors() -> uint32 {
|
||||||
|
|
|
@ -39,8 +39,15 @@ auto Interface::title() -> string {
|
||||||
return cartridge.title();
|
return cartridge.title();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoResolution() -> VideoResolution {
|
auto Interface::videoInformation() -> VideoInformation {
|
||||||
return {280, 240, 1120, 240, 8.0 / 7.0};
|
VideoInformation vi;
|
||||||
|
vi.width = 280;
|
||||||
|
vi.height = 240;
|
||||||
|
vi.internalWidth = 1120;
|
||||||
|
vi.internalHeight = 240;
|
||||||
|
vi.aspectCorrection = 8.0 / 7.0;
|
||||||
|
vi.refreshRate = (system.colorburst() * 6.0) / (262.0 * 1365.0);
|
||||||
|
return vi;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoColors() -> uint32 {
|
auto Interface::videoColors() -> uint32 {
|
||||||
|
|
|
@ -23,7 +23,7 @@ struct Interface : Emulator::Interface {
|
||||||
auto manifest() -> string override;
|
auto manifest() -> string override;
|
||||||
auto title() -> string override;
|
auto title() -> string override;
|
||||||
|
|
||||||
auto videoResolution() -> VideoResolution override;
|
auto videoInformation() -> VideoInformation override;
|
||||||
auto videoColors() -> uint32 override;
|
auto videoColors() -> uint32 override;
|
||||||
auto videoColor(uint32 color) -> uint64 override;
|
auto videoColor(uint32 color) -> uint64 override;
|
||||||
|
|
||||||
|
|
|
@ -118,8 +118,16 @@ auto Interface::title() -> string {
|
||||||
return cartridge.title();
|
return cartridge.title();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoResolution() -> VideoResolution {
|
auto Interface::videoInformation() -> VideoInformation {
|
||||||
return {256, 240, 512, 480, 8.0 / 7.0};
|
VideoInformation vi;
|
||||||
|
vi.width = 256;
|
||||||
|
vi.height = 240;
|
||||||
|
vi.internalWidth = 512;
|
||||||
|
vi.internalHeight = 480;
|
||||||
|
vi.aspectCorrection = 8.0 / 7.0;
|
||||||
|
if(Region::NTSC()) vi.refreshRate = system.cpuFrequency() / (262.0 * 1364.0);
|
||||||
|
if(Region::PAL()) vi.refreshRate = system.cpuFrequency() / (312.0 * 1364.0);
|
||||||
|
return vi;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoColors() -> uint32 {
|
auto Interface::videoColors() -> uint32 {
|
||||||
|
|
|
@ -38,7 +38,7 @@ struct Interface : Emulator::Interface {
|
||||||
auto manifest() -> string override;
|
auto manifest() -> string override;
|
||||||
auto title() -> string override;
|
auto title() -> string override;
|
||||||
|
|
||||||
auto videoResolution() -> VideoResolution override;
|
auto videoInformation() -> VideoInformation override;
|
||||||
auto videoColors() -> uint32 override;
|
auto videoColors() -> uint32 override;
|
||||||
auto videoColor(uint32 color) -> uint64 override;
|
auto videoColor(uint32 color) -> uint64 override;
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ ifeq ($(platform),windows)
|
||||||
ruby += video.wgl video.direct3d video.directdraw video.gdi
|
ruby += video.wgl video.direct3d video.directdraw video.gdi
|
||||||
ruby += audio.asio audio.wasapi audio.xaudio2 audio.directsound
|
ruby += audio.asio audio.wasapi audio.xaudio2 audio.directsound
|
||||||
ruby += input.windows
|
ruby += input.windows
|
||||||
else ifeq ($(platform),macosx)
|
else ifeq ($(platform),macos)
|
||||||
ruby += video.cgl
|
ruby += video.cgl
|
||||||
ruby += audio.openal
|
ruby += audio.openal
|
||||||
ruby += input.quartz input.carbon
|
ruby += input.quartz input.carbon
|
||||||
|
@ -68,7 +68,7 @@ obj/ui-resource.o:
|
||||||
# targets
|
# targets
|
||||||
build: $(objects)
|
build: $(objects)
|
||||||
$(strip $(compiler) -o out/$(name) $(objects) $(link))
|
$(strip $(compiler) -o out/$(name) $(objects) $(link))
|
||||||
ifeq ($(platform),macosx)
|
ifeq ($(platform),macos)
|
||||||
@if [ -d out/$(name).app ]; then rm -r out/$(name).app; fi
|
@if [ -d out/$(name).app ]; then rm -r out/$(name).app; fi
|
||||||
mkdir -p out/$(name).app/Contents/MacOS/
|
mkdir -p out/$(name).app/Contents/MacOS/
|
||||||
mkdir -p out/$(name).app/Contents/Resources/
|
mkdir -p out/$(name).app/Contents/Resources/
|
||||||
|
@ -81,7 +81,7 @@ install:
|
||||||
ifeq ($(shell id -un),root)
|
ifeq ($(shell id -un),root)
|
||||||
$(error "make install should not be run as root")
|
$(error "make install should not be run as root")
|
||||||
else ifeq ($(platform),windows)
|
else ifeq ($(platform),windows)
|
||||||
else ifeq ($(platform),macosx)
|
else ifeq ($(platform),macos)
|
||||||
mkdir -p ~/Library/Application\ Support/$(name)/
|
mkdir -p ~/Library/Application\ Support/$(name)/
|
||||||
mkdir -p ~/Emulation/System/
|
mkdir -p ~/Emulation/System/
|
||||||
cp -R out/$(name).app /Applications/$(name).app
|
cp -R out/$(name).app /Applications/$(name).app
|
||||||
|
@ -101,7 +101,7 @@ uninstall:
|
||||||
ifeq ($(shell id -un),root)
|
ifeq ($(shell id -un),root)
|
||||||
$(error "make uninstall should not be run as root")
|
$(error "make uninstall should not be run as root")
|
||||||
else ifeq ($(platform),windows)
|
else ifeq ($(platform),windows)
|
||||||
else ifeq ($(platform),macosx)
|
else ifeq ($(platform),macos)
|
||||||
if [ -d /Applications/$(name).app ]; then rm -r /Applications/$(name).app; fi
|
if [ -d /Applications/$(name).app ]; then rm -r /Applications/$(name).app; fi
|
||||||
else ifneq ($(filter $(platform),linux bsd),)
|
else ifneq ($(filter $(platform),linux bsd),)
|
||||||
if [ -f $(prefix)/bin/$(name) ]; then rm $(prefix)/bin/$(name); fi
|
if [ -f $(prefix)/bin/$(name) ]; then rm $(prefix)/bin/$(name); fi
|
||||||
|
|
|
@ -248,10 +248,10 @@ auto Presentation::resizeViewport(bool resizeWindow) -> void {
|
||||||
double emulatorHeight = 240;
|
double emulatorHeight = 240;
|
||||||
double aspectCorrection = 1.0;
|
double aspectCorrection = 1.0;
|
||||||
if(emulator) {
|
if(emulator) {
|
||||||
auto resolution = emulator->videoResolution();
|
auto information = emulator->videoInformation();
|
||||||
emulatorWidth = resolution.width;
|
emulatorWidth = information.width;
|
||||||
emulatorHeight = resolution.height;
|
emulatorHeight = information.height;
|
||||||
aspectCorrection = resolution.aspectCorrection;
|
aspectCorrection = information.aspectCorrection;
|
||||||
if(emulator->information.overscan) {
|
if(emulator->information.overscan) {
|
||||||
uint overscanHorizontal = settings["Video/Overscan/Horizontal"].natural();
|
uint overscanHorizontal = settings["Video/Overscan/Horizontal"].natural();
|
||||||
uint overscanVertical = settings["Video/Overscan/Vertical"].natural();
|
uint overscanVertical = settings["Video/Overscan/Vertical"].natural();
|
||||||
|
|
|
@ -59,9 +59,9 @@ auto Program::videoRefresh(const uint32* data, uint pitch, uint width, uint heig
|
||||||
if(emulator->information.overscan) {
|
if(emulator->information.overscan) {
|
||||||
uint overscanHorizontal = settings["Video/Overscan/Horizontal"].natural();
|
uint overscanHorizontal = settings["Video/Overscan/Horizontal"].natural();
|
||||||
uint overscanVertical = settings["Video/Overscan/Vertical"].natural();
|
uint overscanVertical = settings["Video/Overscan/Vertical"].natural();
|
||||||
auto resolution = emulator->videoResolution();
|
auto information = emulator->videoInformation();
|
||||||
overscanHorizontal *= resolution.internalWidth / resolution.width;
|
overscanHorizontal *= information.internalWidth / information.width;
|
||||||
overscanVertical *= resolution.internalHeight / resolution.height;
|
overscanVertical *= information.internalHeight / information.height;
|
||||||
data += overscanVertical * pitch + overscanHorizontal;
|
data += overscanVertical * pitch + overscanHorizontal;
|
||||||
width -= overscanHorizontal * 2;
|
width -= overscanHorizontal * 2;
|
||||||
height -= overscanVertical * 2;
|
height -= overscanVertical * 2;
|
||||||
|
|
|
@ -35,12 +35,19 @@ auto Interface::title() -> string {
|
||||||
return cartridge.information.title;
|
return cartridge.information.title;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::videoResolution() -> VideoResolution {
|
auto Interface::videoInformation() -> VideoInformation {
|
||||||
if(!settings.rotateLeft) {
|
VideoInformation vi;
|
||||||
return {224, 144, 224, 144, 1.0};
|
vi.width = 224;
|
||||||
} else {
|
vi.height = 144;
|
||||||
return {144, 224, 144, 224, 1.0};
|
vi.internalWidth = 224;
|
||||||
|
vi.internalHeight = 144;
|
||||||
|
vi.aspectCorrection = 1.0;
|
||||||
|
vi.refreshRate = 3'072'000.0 / (159.0 * 256.0);
|
||||||
|
if(settings.rotateLeft) {
|
||||||
|
swap(vi.width, vi.height);
|
||||||
|
swap(vi.internalWidth, vi.internalHeight);
|
||||||
}
|
}
|
||||||
|
return vi;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Interface::loaded() -> bool {
|
auto Interface::loaded() -> bool {
|
||||||
|
|
|
@ -22,7 +22,7 @@ struct Interface : Emulator::Interface {
|
||||||
auto manifest() -> string override;
|
auto manifest() -> string override;
|
||||||
auto title() -> string override;
|
auto title() -> string override;
|
||||||
|
|
||||||
auto videoResolution() -> VideoResolution override;
|
auto videoInformation() -> VideoInformation override;
|
||||||
|
|
||||||
auto loaded() -> bool override;
|
auto loaded() -> bool override;
|
||||||
auto sha256() -> string override;
|
auto sha256() -> string override;
|
||||||
|
|
|
@ -30,7 +30,7 @@ auto pFont::family(const string& family) -> string {
|
||||||
auto pFont::create(const Font& font) -> NSFont* {
|
auto pFont::create(const Font& font) -> NSFont* {
|
||||||
auto fontName = family(font.family());
|
auto fontName = family(font.family());
|
||||||
NSString* family = [NSString stringWithUTF8String:fontName];
|
NSString* family = [NSString stringWithUTF8String:fontName];
|
||||||
CGFloat size = (float)(font.size() ? font.size() : 8);
|
CGFloat size = Application::scale(font.size() ? font.size() : 8);
|
||||||
NSFontTraitMask traits = 0;
|
NSFontTraitMask traits = 0;
|
||||||
|
|
||||||
if(font.bold()) traits |= NSBoldFontMask;
|
if(font.bold()) traits |= NSBoldFontMask;
|
||||||
|
|
|
@ -11,7 +11,7 @@ auto pMonitor::count() -> uint {
|
||||||
auto pMonitor::dpi(uint monitor) -> Position {
|
auto pMonitor::dpi(uint monitor) -> Position {
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
NSScreen* screen = [[NSScreen screens] objectAtIndex:monitor];
|
NSScreen* screen = [[NSScreen screens] objectAtIndex:monitor];
|
||||||
NSDistionary* dictionary = [screen deviceDescription];
|
NSDictionary* dictionary = [screen deviceDescription];
|
||||||
NSSize dpi = [[dictionary objectForKey:NSDeviceSize] sizeValue];
|
NSSize dpi = [[dictionary objectForKey:NSDeviceSize] sizeValue];
|
||||||
return {dpi.width, dpi.height};
|
return {dpi.width, dpi.height};
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,10 @@ auto Application::setScale(float scale) -> void {
|
||||||
state.scale = scale;
|
state.scale = scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto Application::unscale(float value) -> float {
|
||||||
|
return value * (1.0 / state.scale);
|
||||||
|
}
|
||||||
|
|
||||||
//Windows
|
//Windows
|
||||||
//=======
|
//=======
|
||||||
|
|
||||||
|
|
|
@ -385,6 +385,7 @@ struct Application {
|
||||||
static auto setFont(const Font& font = {}) -> void;
|
static auto setFont(const Font& font = {}) -> void;
|
||||||
static auto setName(const string& name = "") -> void;
|
static auto setName(const string& name = "") -> void;
|
||||||
static auto setScale(float scale = 1.0) -> void;
|
static auto setScale(float scale = 1.0) -> void;
|
||||||
|
static auto unscale(float value) -> float;
|
||||||
|
|
||||||
struct Windows {
|
struct Windows {
|
||||||
static auto doModalChange(bool modal) -> void;
|
static auto doModalChange(bool modal) -> void;
|
||||||
|
|
|
@ -14,7 +14,7 @@ auto pFont::size(PangoFontDescription* font, const string& text) -> Size {
|
||||||
PangoLayout* layout = pango_layout_new(context);
|
PangoLayout* layout = pango_layout_new(context);
|
||||||
pango_layout_set_font_description(layout, font);
|
pango_layout_set_font_description(layout, font);
|
||||||
pango_layout_set_text(layout, text, -1);
|
pango_layout_set_text(layout, text, -1);
|
||||||
signed width = 0, height = 0;
|
int width = 0, height = 0;
|
||||||
pango_layout_get_pixel_size(layout, &width, &height);
|
pango_layout_get_pixel_size(layout, &width, &height);
|
||||||
g_object_unref((gpointer)layout);
|
g_object_unref((gpointer)layout);
|
||||||
return {width, height};
|
return {width, height};
|
||||||
|
@ -39,7 +39,7 @@ auto pFont::family(const string& family) -> string {
|
||||||
auto pFont::create(const Font& font) -> PangoFontDescription* {
|
auto pFont::create(const Font& font) -> PangoFontDescription* {
|
||||||
auto p = pango_font_description_new();
|
auto p = pango_font_description_new();
|
||||||
pango_font_description_set_family(p, family(font.family()));
|
pango_font_description_set_family(p, family(font.family()));
|
||||||
pango_font_description_set_size(p, (font.size() ? font.size() : 8) * PANGO_SCALE);
|
pango_font_description_set_size(p, Application::scale(font.size() ? font.size() : 8) * PANGO_SCALE);
|
||||||
pango_font_description_set_weight(p, font.bold() ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL);
|
pango_font_description_set_weight(p, font.bold() ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL);
|
||||||
pango_font_description_set_style(p, font.italic() ? PANGO_STYLE_OBLIQUE : PANGO_STYLE_NORMAL);
|
pango_font_description_set_style(p, font.italic() ? PANGO_STYLE_OBLIQUE : PANGO_STYLE_NORMAL);
|
||||||
return p;
|
return p;
|
||||||
|
|
|
@ -26,7 +26,7 @@ auto pFont::family(const string& family) -> QString {
|
||||||
auto pFont::create(const Font& font) -> QFont {
|
auto pFont::create(const Font& font) -> QFont {
|
||||||
QFont qtFont;
|
QFont qtFont;
|
||||||
qtFont.setFamily(family(font.family()));
|
qtFont.setFamily(family(font.family()));
|
||||||
qtFont.setPointSize(font.size() ? font.size() : 8);
|
qtFont.setPointSize(Application::scale(font.size() ? font.size() : 8));
|
||||||
qtFont.setBold(font.bold());
|
qtFont.setBold(font.bold());
|
||||||
qtFont.setItalic(font.italic());
|
qtFont.setItalic(font.italic());
|
||||||
return qtFont;
|
return qtFont;
|
||||||
|
|
|
@ -27,7 +27,7 @@ auto pFont::family(const string& family) -> string {
|
||||||
|
|
||||||
auto pFont::create(const Font& font) -> HFONT {
|
auto pFont::create(const Font& font) -> HFONT {
|
||||||
return CreateFont(
|
return CreateFont(
|
||||||
-((font.size() ? font.size() : 8) * 96.0 / 72.0 + 0.5),
|
-(Application::scale(font.size() ? font.size() : 8) * 96.0 / 72.0 + 0.5),
|
||||||
0, 0, 0, font.bold() ? FW_BOLD : FW_NORMAL, font.italic(), 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, font.bold() ? FW_BOLD : FW_NORMAL, font.italic(), 0, 0, 0, 0, 0, 0, 0,
|
||||||
utf16_t(family(font.family()))
|
utf16_t(family(font.family()))
|
||||||
);
|
);
|
||||||
|
|
|
@ -5,24 +5,19 @@ namespace hiro {
|
||||||
struct MonitorInfo {
|
struct MonitorInfo {
|
||||||
uint monitor = 0;
|
uint monitor = 0;
|
||||||
uint primary = 0;
|
uint primary = 0;
|
||||||
float dpiX = 0;
|
|
||||||
float dpiY = 0;
|
|
||||||
Geometry geometry;
|
Geometry geometry;
|
||||||
uint index = 0;
|
uint index = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
static auto CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) -> BOOL {
|
static auto CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) -> BOOL {
|
||||||
MonitorInfo& info = *(MonitorInfo*)dwData;
|
MonitorInfo& info = *(MonitorInfo*)dwData;
|
||||||
MONITORINFOEX mi{sizeof(MONITORINFOEX)};
|
MONITORINFOEX mi{};
|
||||||
|
mi.cbSize = sizeof(MONITORINFOEX);
|
||||||
GetMonitorInfo(hMonitor, &mi);
|
GetMonitorInfo(hMonitor, &mi);
|
||||||
string displayName = (const char*)utf8_t(mi.szDevice);
|
string displayName = (const char*)utf8_t(mi.szDevice);
|
||||||
if(displayName.beginsWith(R"(\\.\DISPLAYV)")) return true; //ignore pseudo-monitors
|
if(displayName.beginsWith(R"(\\.\DISPLAYV)")) return true; //ignore pseudo-monitors
|
||||||
if(mi.dwFlags & MONITORINFOF_PRIMARY) info.primary = info.index;
|
if(mi.dwFlags & MONITORINFOF_PRIMARY) info.primary = info.index;
|
||||||
if(info.monitor == info.index) {
|
if(info.monitor == info.index) {
|
||||||
UINT dpiX = 0, dpiY = 0;
|
|
||||||
GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY);
|
|
||||||
info.dpiX = dpiX;
|
|
||||||
info.dpiY = dpiY;
|
|
||||||
info.geometry = {lprcMonitor->left, lprcMonitor->top, lprcMonitor->right - lprcMonitor->left, lprcMonitor->bottom - lprcMonitor->top};
|
info.geometry = {lprcMonitor->left, lprcMonitor->top, lprcMonitor->right - lprcMonitor->left, lprcMonitor->bottom - lprcMonitor->top};
|
||||||
}
|
}
|
||||||
info.index++;
|
info.index++;
|
||||||
|
@ -34,10 +29,11 @@ auto pMonitor::count() -> uint {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pMonitor::dpi(uint monitor) -> Position {
|
auto pMonitor::dpi(uint monitor) -> Position {
|
||||||
MonitorInfo info;
|
HDC hdc = GetDC(0);
|
||||||
info.monitor = monitor;
|
auto dpiX = (float)GetDeviceCaps(hdc, LOGPIXELSX);
|
||||||
EnumDisplayMonitors(nullptr, nullptr, MonitorEnumProc, (LPARAM)&info);
|
auto dpiY = (float)GetDeviceCaps(hdc, LOGPIXELSY);
|
||||||
return {info.dpiX, info.dpiY};
|
ReleaseDC(0, hdc);
|
||||||
|
return {dpiX, dpiY};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pMonitor::geometry(uint monitor) -> Geometry {
|
auto pMonitor::geometry(uint monitor) -> Geometry {
|
||||||
|
|
|
@ -173,7 +173,12 @@ auto Button_CustomDraw(HWND hwnd, PAINTSTRUCT& ps, bool bordered, bool checked,
|
||||||
SetTextColor(ps.hdc, GetSysColor(IsWindowEnabled(hwnd) ? COLOR_BTNTEXT : COLOR_GRAYTEXT));
|
SetTextColor(ps.hdc, GetSysColor(IsWindowEnabled(hwnd) ? COLOR_BTNTEXT : COLOR_GRAYTEXT));
|
||||||
auto hFont = pFont::create(font);
|
auto hFont = pFont::create(font);
|
||||||
SelectObject(ps.hdc, hFont);
|
SelectObject(ps.hdc, hFont);
|
||||||
RECT rcText{textGeometry.x(), textGeometry.y(), textGeometry.x() + textGeometry.width(), textGeometry.y() + textGeometry.height()};
|
RECT rcText{
|
||||||
|
LONG(textGeometry.x()),
|
||||||
|
LONG(textGeometry.y()),
|
||||||
|
LONG(textGeometry.x() + textGeometry.width()),
|
||||||
|
LONG(textGeometry.y() + textGeometry.height())
|
||||||
|
};
|
||||||
DrawText(ps.hdc, wText, -1, &rcText, DT_NOPREFIX | DT_END_ELLIPSIS);
|
DrawText(ps.hdc, wText, -1, &rcText, DT_NOPREFIX | DT_END_ELLIPSIS);
|
||||||
DeleteObject(hFont);
|
DeleteObject(hFont);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,9 +31,9 @@ auto pFrame::setGeometry(Geometry geometry) -> void {
|
||||||
auto size = pFont::size(hfont, state().text);
|
auto size = pFont::size(hfont, state().text);
|
||||||
pWidget::setGeometry({
|
pWidget::setGeometry({
|
||||||
geometry.x(),
|
geometry.x(),
|
||||||
geometry.y() - (empty ? size.height() >> 1 : 0),
|
geometry.y() - (empty ? size.height() / 2 : 0),
|
||||||
geometry.width(),
|
geometry.width(),
|
||||||
geometry.height() + (empty ? size.height() >> 1 : 0)
|
geometry.height() + (empty ? size.height() / 2 : 0)
|
||||||
});
|
});
|
||||||
if(auto layout = state().layout) {
|
if(auto layout = state().layout) {
|
||||||
if(empty) size.setHeight(1);
|
if(empty) size.setHeight(1);
|
||||||
|
|
|
@ -16,7 +16,7 @@ objects += $(if $(call streq,$(platform),windows),obj/resource.o)
|
||||||
|
|
||||||
all: $(objects)
|
all: $(objects)
|
||||||
$(strip $(compiler) -o out/$(name) $(objects) $(link) $(hirolink))
|
$(strip $(compiler) -o out/$(name) $(objects) $(link) $(hirolink))
|
||||||
ifeq ($(platform),macosx)
|
ifeq ($(platform),macos)
|
||||||
@if [ -d out/$(name).app ]; then rm -r out/$(name).app; fi
|
@if [ -d out/$(name).app ]; then rm -r out/$(name).app; fi
|
||||||
mkdir -p out/$(name).app/Contents/MacOS/
|
mkdir -p out/$(name).app/Contents/MacOS/
|
||||||
mkdir -p out/$(name).app/Contents/Resources/
|
mkdir -p out/$(name).app/Contents/Resources/
|
||||||
|
@ -35,14 +35,14 @@ obj/resource.o:
|
||||||
$(windres) data/icarus.rc obj/resource.o
|
$(windres) data/icarus.rc obj/resource.o
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
ifeq ($(platform),macosx)
|
ifeq ($(platform),macos)
|
||||||
@if [ -d out/$(name).app ]; then rm out/$(name).app; fi
|
@if [ -d out/$(name).app ]; then rm out/$(name).app; fi
|
||||||
endif
|
endif
|
||||||
-@$(call delete,obj/*)
|
-@$(call delete,obj/*)
|
||||||
-@$(call delete,out/*)
|
-@$(call delete,out/*)
|
||||||
|
|
||||||
install:
|
install:
|
||||||
ifeq ($(platform),macosx)
|
ifeq ($(platform),macos)
|
||||||
cp -R out/$(name).app /Applications/$(name).app
|
cp -R out/$(name).app /Applications/$(name).app
|
||||||
else ifneq ($(filter $(platform),linux bsd),)
|
else ifneq ($(filter $(platform),linux bsd),)
|
||||||
mkdir -p $(prefix)/bin/
|
mkdir -p $(prefix)/bin/
|
||||||
|
@ -56,7 +56,7 @@ else ifneq ($(filter $(platform),linux bsd),)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
ifeq ($(platform),macosx)
|
ifeq ($(platform),macos)
|
||||||
if [ -d /Applications/$(name).app ]; then rm -r /Applications/$(name).app; fi
|
if [ -d /Applications/$(name).app ]; then rm -r /Applications/$(name).app; fi
|
||||||
else ifneq ($(filter $(platform),linux bsd),)
|
else ifneq ($(filter $(platform),linux bsd),)
|
||||||
if [ -f $(prefix)/bin/$(name) ]; then rm $(prefix)/bin/$(name); fi
|
if [ -f $(prefix)/bin/$(name) ]; then rm $(prefix)/bin/$(name); fi
|
||||||
|
|
|
@ -35,13 +35,13 @@ auto Icarus::bsMemoryImport(vector<uint8_t>& buffer, string location) -> string
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "BS Memory/", name, ".bs/"};
|
string target{settings["Library/Location"].text(), "BS Memory/", name, ".bs/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto markup = bsMemoryManifest(buffer, location);
|
auto manifest = bsMemoryManifest(buffer, location);
|
||||||
if(!markup) return failure("failed to parse ROM image");
|
if(!manifest) return failure("failed to parse ROM image");
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, markup);
|
if(!create(target)) return failure("library path unwritable");
|
||||||
file::write({target, "program.rom"}, buffer);
|
|
||||||
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, manifest);
|
||||||
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,28 @@
|
||||||
struct Icarus {
|
struct Icarus {
|
||||||
|
virtual auto create(const string& pathname) -> bool {
|
||||||
|
return directory::create(pathname);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual auto exists(const string& filename) -> bool {
|
||||||
|
return file::exists(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual auto copy(const string& target, const string& source) -> bool {
|
||||||
|
return file::copy(target, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual auto write(const string& filename, const uint8_t* data, uint size) -> bool {
|
||||||
|
return file::write(filename, data, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto write(const string& filename, const vector<uint8_t>& buffer) -> bool {
|
||||||
|
return write(filename, buffer.data(), buffer.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
auto write(const string& filename, const string& text) -> bool {
|
||||||
|
return write(filename, (const uint8_t*)text.data(), text.size());
|
||||||
|
}
|
||||||
|
|
||||||
//core.cpp
|
//core.cpp
|
||||||
Icarus();
|
Icarus();
|
||||||
|
|
||||||
|
|
|
@ -41,22 +41,21 @@ auto Icarus::famicomImport(vector<uint8_t>& buffer, string location) -> string {
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "Famicom/", name, ".fc/"};
|
string target{settings["Library/Location"].text(), "Famicom/", name, ".fc/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
uint prgrom = 0;
|
uint prgrom = 0;
|
||||||
uint chrrom = 0;
|
uint chrrom = 0;
|
||||||
auto markup = famicomManifest(buffer, location, &prgrom, &chrrom);
|
auto markup = famicomManifest(buffer, location, &prgrom, &chrrom);
|
||||||
if(!markup) return failure("failed to parse ROM image");
|
if(!markup) return failure("failed to parse ROM image");
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".sav"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".sav"}, {target, "save.ram"});
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, markup);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, markup);
|
||||||
file::write({target, "ines.rom"}, buffer.data(), 16);
|
write({target, "ines.rom"}, buffer.data(), 16);
|
||||||
file::write({target, "program.rom"}, buffer.data() + 16, prgrom);
|
write({target, "program.rom"}, buffer.data() + 16, prgrom);
|
||||||
if(!chrrom) return success(target);
|
if(!chrrom) return success(target);
|
||||||
file::write({target, "character.rom"}, buffer.data() + 16 + prgrom, chrrom);
|
write({target, "character.rom"}, buffer.data() + 16 + prgrom, chrrom);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,17 +35,16 @@ auto Icarus::gameBoyAdvanceImport(vector<uint8_t>& buffer, string location) -> s
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "Game Boy Advance/", name, ".gba/"};
|
string target{settings["Library/Location"].text(), "Game Boy Advance/", name, ".gba/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto markup = gameBoyAdvanceManifest(buffer, location);
|
auto markup = gameBoyAdvanceManifest(buffer, location);
|
||||||
if(!markup) return failure("failed to parse ROM image");
|
if(!markup) return failure("failed to parse ROM image");
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".sav"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".sav"}, {target, "save.ram"});
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, markup);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, markup);
|
||||||
file::write({target, "program.rom"}, buffer);
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,17 +35,16 @@ auto Icarus::gameBoyColorImport(vector<uint8_t>& buffer, string location) -> str
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "Game Boy Color/", name, ".gbc/"};
|
string target{settings["Library/Location"].text(), "Game Boy Color/", name, ".gbc/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto markup = gameBoyColorManifest(buffer, location);
|
auto markup = gameBoyColorManifest(buffer, location);
|
||||||
if(!markup) return failure("failed to parse ROM image");
|
if(!markup) return failure("failed to parse ROM image");
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".sav"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".sav"}, {target, "save.ram"});
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, markup);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, markup);
|
||||||
file::write({target, "program.rom"}, buffer);
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,17 +35,16 @@ auto Icarus::gameBoyImport(vector<uint8_t>& buffer, string location) -> string {
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "Game Boy/", name, ".gb/"};
|
string target{settings["Library/Location"].text(), "Game Boy/", name, ".gb/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto markup = gameBoyManifest(buffer, location);
|
auto markup = gameBoyManifest(buffer, location);
|
||||||
if(!markup) return failure("failed to parse ROM image");
|
if(!markup) return failure("failed to parse ROM image");
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".sav"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".sav"}, {target, "save.ram"});
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, markup);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, markup);
|
||||||
file::write({target, "program.rom"}, buffer);
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,17 +29,16 @@ auto Icarus::gameGearImport(vector<uint8_t>& buffer, string location) -> string
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "Game Gear/", name, ".gg/"};
|
string target{settings["Library/Location"].text(), "Game Gear/", name, ".gg/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto manifest = gameGearManifest(buffer, location);
|
auto manifest = gameGearManifest(buffer, location);
|
||||||
if(!manifest) return failure("failed to parse ROM image");
|
if(!manifest) return failure("failed to parse ROM image");
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".sav"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".sav"}, {target, "save.ram"});
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, manifest);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, manifest);
|
||||||
file::write({target, "program.rom"}, buffer);
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,17 +29,16 @@ auto Icarus::masterSystemImport(vector<uint8_t>& buffer, string location) -> str
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "Master System/", name, ".ms/"};
|
string target{settings["Library/Location"].text(), "Master System/", name, ".ms/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto manifest = masterSystemManifest(buffer, location);
|
auto manifest = masterSystemManifest(buffer, location);
|
||||||
if(!manifest) return failure("failed to parse ROM image");
|
if(!manifest) return failure("failed to parse ROM image");
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".sav"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".sav"}, {target, "save.ram"});
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, manifest);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, manifest);
|
||||||
file::write({target, "program.rom"}, buffer);
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,17 +29,16 @@ auto Icarus::megaDriveImport(vector<uint8_t>& buffer, string location) -> string
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "Mega Drive/", name, ".md/"};
|
string target{settings["Library/Location"].text(), "Mega Drive/", name, ".md/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto manifest = megaDriveManifest(buffer, location);
|
auto manifest = megaDriveManifest(buffer, location);
|
||||||
if(!manifest) return failure("failed to parse ROM image");
|
if(!manifest) return failure("failed to parse ROM image");
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".sav"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".sav"}, {target, "save.ram"});
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, manifest);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, manifest);
|
||||||
file::write({target, "program.rom"}, buffer);
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,17 +29,16 @@ auto Icarus::pcEngineImport(vector<uint8_t>& buffer, string location) -> string
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "PC Engine/", name, ".pce/"};
|
string target{settings["Library/Location"].text(), "PC Engine/", name, ".pce/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto manifest = pcEngineManifest(buffer, location);
|
auto manifest = pcEngineManifest(buffer, location);
|
||||||
if(!manifest) return failure("failed to parse ROM image");
|
if(!manifest) return failure("failed to parse ROM image");
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".sav"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".sav"}, {target, "save.ram"});
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, manifest);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, manifest);
|
||||||
file::write({target, "program.rom"}, buffer);
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,13 +35,16 @@ auto Icarus::sufamiTurboImport(vector<uint8_t>& buffer, string location) -> stri
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "Sufami Turbo/", name, ".st/"};
|
string target{settings["Library/Location"].text(), "Sufami Turbo/", name, ".st/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto markup = sufamiTurboManifest(buffer, location);
|
auto manifest = sufamiTurboManifest(buffer, location);
|
||||||
if(!markup) return failure("failed to parse ROM image");
|
if(!manifest) return failure("failed to parse ROM image");
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, markup);
|
if(!create(target)) return failure("library path unwritable");
|
||||||
file::write({target, "program.rom"}, buffer);
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
|
}
|
||||||
|
|
||||||
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, manifest);
|
||||||
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ auto Icarus::superFamicomManifest(vector<uint8_t>& buffer, string location, stri
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/UseHeuristics"].boolean() && !markup) {
|
if(settings["icarus/UseHeuristics"].boolean() && !markup) {
|
||||||
bool hasMSU1 = file::exists({location, "msu1.rom"});
|
bool hasMSU1 = exists({location, "msu1.rom"});
|
||||||
SuperFamicomCartridge cartridge{buffer.data(), buffer.size(), hasMSU1};
|
SuperFamicomCartridge cartridge{buffer.data(), buffer.size(), hasMSU1};
|
||||||
if(markup = cartridge.markup) {
|
if(markup = cartridge.markup) {
|
||||||
if(firmwareMissing) *firmwareMissing = cartridge.firmware_missing;
|
if(firmwareMissing) *firmwareMissing = cartridge.firmware_missing;
|
||||||
|
@ -49,19 +49,18 @@ auto Icarus::superFamicomImport(vector<uint8_t>& buffer, string location) -> str
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "Super Famicom/", name, ".sfc/"};
|
string target{settings["Library/Location"].text(), "Super Famicom/", name, ".sfc/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
string firmwareMissing;
|
string firmwareMissing;
|
||||||
auto markup = superFamicomManifest(buffer, location, &firmwareMissing);
|
auto markup = superFamicomManifest(buffer, location, &firmwareMissing);
|
||||||
if(!markup) return failure("failed to parse ROM image");
|
if(!markup) return failure("failed to parse ROM image");
|
||||||
if(firmwareMissing) return failure({"ROM image is missing ", firmwareMissing, " firmware data"});
|
if(firmwareMissing) return failure({"ROM image is missing ", firmwareMissing, " firmware data"});
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".srm"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".srm"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".srm"}, {target, "save.ram"});
|
copy({source, name, ".srm"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, markup);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, markup);
|
||||||
uint offset = (buffer.size() & 0x7fff) == 512 ? 512 : 0; //skip header if present
|
uint offset = (buffer.size() & 0x7fff) == 512 ? 512 : 0; //skip header if present
|
||||||
auto document = BML::unserialize(markup);
|
auto document = BML::unserialize(markup);
|
||||||
vector<Markup::Node> roms;
|
vector<Markup::Node> roms;
|
||||||
|
@ -70,7 +69,7 @@ auto Icarus::superFamicomImport(vector<uint8_t>& buffer, string location) -> str
|
||||||
auto name = rom["name"].text();
|
auto name = rom["name"].text();
|
||||||
auto size = rom["size"].natural();
|
auto size = rom["size"].natural();
|
||||||
if(size > buffer.size() - offset) return failure("ROM image is missing data");
|
if(size > buffer.size() - offset) return failure("ROM image is missing data");
|
||||||
file::write({target, name}, buffer.data() + offset, size);
|
write({target, name}, buffer.data() + offset, size);
|
||||||
offset += size;
|
offset += size;
|
||||||
}
|
}
|
||||||
return success(target);
|
return success(target);
|
||||||
|
|
|
@ -29,17 +29,16 @@ auto Icarus::superGrafxImport(vector<uint8_t>& buffer, string location) -> strin
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "SuperGrafx/", name, ".sg/"};
|
string target{settings["Library/Location"].text(), "SuperGrafx/", name, ".sg/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto manifest = superGrafxManifest(buffer, location);
|
auto manifest = superGrafxManifest(buffer, location);
|
||||||
if(!manifest) return failure("failed to parse ROM image");
|
if(!manifest) return failure("failed to parse ROM image");
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".sav"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".sav"}, {target, "save.ram"});
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, manifest);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, manifest);
|
||||||
file::write({target, "program.rom"}, buffer);
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,17 +29,16 @@ auto Icarus::wonderSwanColorImport(vector<uint8_t>& buffer, string location) ->
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "WonderSwan Color/", name, ".wsc/"};
|
string target{settings["Library/Location"].text(), "WonderSwan Color/", name, ".wsc/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto manifest = wonderSwanColorManifest(buffer, location);
|
auto manifest = wonderSwanColorManifest(buffer, location);
|
||||||
if(!manifest) return failure("failed to parse ROM image");
|
if(!manifest) return failure("failed to parse ROM image");
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".sav"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".sav"}, {target, "save.ram"});
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, manifest);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, manifest);
|
||||||
file::write({target, "program.rom"}, buffer);
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,17 +29,16 @@ auto Icarus::wonderSwanImport(vector<uint8_t>& buffer, string location) -> strin
|
||||||
auto name = Location::prefix(location);
|
auto name = Location::prefix(location);
|
||||||
auto source = Location::path(location);
|
auto source = Location::path(location);
|
||||||
string target{settings["Library/Location"].text(), "WonderSwan/", name, ".ws/"};
|
string target{settings["Library/Location"].text(), "WonderSwan/", name, ".ws/"};
|
||||||
//if(directory::exists(target)) return failure("game already exists");
|
|
||||||
|
|
||||||
auto manifest = wonderSwanManifest(buffer, location);
|
auto manifest = wonderSwanManifest(buffer, location);
|
||||||
if(!manifest) return failure("failed to parse ROM image");
|
if(!manifest) return failure("failed to parse ROM image");
|
||||||
|
|
||||||
if(!directory::create(target)) return failure("library path unwritable");
|
if(!create(target)) return failure("library path unwritable");
|
||||||
if(file::exists({source, name, ".sav"}) && !file::exists({target, "save.ram"})) {
|
if(exists({source, name, ".sav"}) && !exists({target, "save.ram"})) {
|
||||||
file::copy({source, name, ".sav"}, {target, "save.ram"});
|
copy({source, name, ".sav"}, {target, "save.ram"});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, manifest);
|
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, manifest);
|
||||||
file::write({target, "program.rom"}, buffer);
|
write({target, "program.rom"}, buffer);
|
||||||
return success(target);
|
return success(target);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,8 +47,10 @@ Settings settings;
|
||||||
#include "core/wonderswan-color.cpp"
|
#include "core/wonderswan-color.cpp"
|
||||||
#include "core/bs-memory.cpp"
|
#include "core/bs-memory.cpp"
|
||||||
#include "core/sufami-turbo.cpp"
|
#include "core/sufami-turbo.cpp"
|
||||||
Icarus icarus;
|
|
||||||
|
|
||||||
|
#if !defined(ICARUS_LIBRARY)
|
||||||
|
|
||||||
|
Icarus icarus;
|
||||||
#include "ui/ui.hpp"
|
#include "ui/ui.hpp"
|
||||||
#include "ui/scan-dialog.cpp"
|
#include "ui/scan-dialog.cpp"
|
||||||
#include "ui/settings-dialog.cpp"
|
#include "ui/settings-dialog.cpp"
|
||||||
|
@ -126,3 +128,5 @@ auto nall::main(string_vector args) -> void {
|
||||||
scanDialog->show();
|
scanDialog->show();
|
||||||
Application::run();
|
Application::run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -23,7 +23,7 @@ ifeq ($(platform),)
|
||||||
platform := windows
|
platform := windows
|
||||||
delete = del $(subst /,\,$1)
|
delete = del $(subst /,\,$1)
|
||||||
else ifneq ($(findstring Darwin,$(uname)),)
|
else ifneq ($(findstring Darwin,$(uname)),)
|
||||||
platform := macosx
|
platform := macos
|
||||||
delete = rm -f $1
|
delete = rm -f $1
|
||||||
else ifneq ($(findstring Linux,$(uname)),)
|
else ifneq ($(findstring Linux,$(uname)),)
|
||||||
platform := linux
|
platform := linux
|
||||||
|
@ -48,7 +48,7 @@ ifeq ($(compiler),)
|
||||||
ifeq ($(platform),windows)
|
ifeq ($(platform),windows)
|
||||||
compiler := g++
|
compiler := g++
|
||||||
cppflags := -x c++ -std=gnu++14
|
cppflags := -x c++ -std=gnu++14
|
||||||
else ifeq ($(platform),macosx)
|
else ifeq ($(platform),macos)
|
||||||
compiler := clang++
|
compiler := clang++
|
||||||
else ifeq ($(platform),linux)
|
else ifeq ($(platform),linux)
|
||||||
compiler := g++-4.9
|
compiler := g++-4.9
|
||||||
|
@ -92,8 +92,8 @@ ifeq ($(platform),windows)
|
||||||
windres := windres
|
windres := windres
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# macosx settings
|
# macos settings
|
||||||
ifeq ($(platform),macosx)
|
ifeq ($(platform),macos)
|
||||||
flags += -stdlib=libc++
|
flags += -stdlib=libc++
|
||||||
link += -lc++ -lobjc
|
link += -lc++ -lobjc
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -226,8 +226,7 @@ private:
|
||||||
terminate();
|
terminate();
|
||||||
if(!_context) return false;
|
if(!_context) return false;
|
||||||
|
|
||||||
POINT point = {0, 0};
|
HMONITOR monitor = MonitorFromWindow((HWND)_context, MONITOR_DEFAULTTOPRIMARY);
|
||||||
HMONITOR monitor = MonitorFromPoint(point, MONITOR_DEFAULTTOPRIMARY);
|
|
||||||
MONITORINFOEX information = {};
|
MONITORINFOEX information = {};
|
||||||
information.cbSize = sizeof(MONITORINFOEX);
|
information.cbSize = sizeof(MONITORINFOEX);
|
||||||
GetMonitorInfo(monitor, &information);
|
GetMonitorInfo(monitor, &information);
|
||||||
|
@ -247,7 +246,7 @@ private:
|
||||||
windowClass.style = CS_HREDRAW | CS_VREDRAW;
|
windowClass.style = CS_HREDRAW | CS_VREDRAW;
|
||||||
RegisterClass(&windowClass);
|
RegisterClass(&windowClass);
|
||||||
|
|
||||||
_exclusiveContext = (uintptr)CreateWindowEx(WS_EX_TOPMOST, L"VideoDirect3D_Window", L"", WS_POPUP,
|
_exclusiveContext = (uintptr)CreateWindow(L"VideoDirect3D_Window", L"", WS_POPUP,
|
||||||
information.rcMonitor.left, information.rcMonitor.top, _monitorWidth, _monitorHeight,
|
information.rcMonitor.left, information.rcMonitor.top, _monitorWidth, _monitorHeight,
|
||||||
nullptr, nullptr, GetModuleHandle(0), nullptr);
|
nullptr, nullptr, GetModuleHandle(0), nullptr);
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,5 @@ private:
|
||||||
|
|
||||||
HDC _display = nullptr;
|
HDC _display = nullptr;
|
||||||
HGLRC _wglContext = nullptr;
|
HGLRC _wglContext = nullptr;
|
||||||
HWND _window = nullptr;
|
|
||||||
HINSTANCE _glWindow = nullptr;
|
HINSTANCE _glWindow = nullptr;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue