mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-02-19 20:55:24 +01:00
byuu says: Changelog: - nall/GNUmakefile: build=release changed to -O2, build=optimize is now -O3 - hiro: added Monitor::dpi(uint index) → Position [returns logical DPI for x, y] - Position is a bad name, but dpi(monitor).(x,y)() make more sense than .(width,height)() - hiro: Position, Size, Geometry, Font changed from using signed int to float - hiro: Alignment changed from using double to float - hiro: added skeleton (unused) Application::scale(), setScale() functions Errata: - hiro/cocoa's Monitor::dpi() is untested. Probably will cause issues with macOS' automatic scaling. - hiro/gtk lacks a way to get both per-monitor and per-axis (x,y) DPI scaling - hiro/qt lacks a way to get per-monitor DPI scaling (Qt 5.x has this, but I still use Qt 4.x) - and just to get global DPI, hiro/qt's DPI retrieval has to use undocumented functions ... fun The goal with this WIP was basically to prepare hiro for potential automatic scaling. It'll be extremely difficult, but I'm convinced that it must be possible if macOS can do it. By moving from signed integers to floats for coordinates, we can now scale and unscale without losing precision. That of course isn't the hard part, though. The hard part is where and how to do the scaling. In the ideal application, hiro/core and hiro/extension will handle 100% of this, and the per-platform hiro/(cocoa,gtk,qt,windows) will not be aware of what's going on, but ... to even make that possible, things will need to change in every per-platform core, eg the per-platform code will have to call a core function to change geometry, which will know about the scaling and unscale the values back down again. Gonna be a lot of work, but ... it's a start.
113 lines
2.3 KiB
C++
113 lines
2.3 KiB
C++
#if defined(Hiro_Geometry)
|
|
|
|
Geometry::Geometry() {
|
|
setGeometry(0, 0, 0, 0);
|
|
}
|
|
|
|
Geometry::Geometry(Position position, Size size) {
|
|
setGeometry(position, size);
|
|
}
|
|
|
|
Geometry::Geometry(float x, float y, float width, float height) {
|
|
setGeometry(x, y, width, height);
|
|
}
|
|
|
|
Geometry::operator bool() const {
|
|
return state.x || state.y || state.width || state.height;
|
|
}
|
|
|
|
auto Geometry::operator==(const Geometry& source) const -> bool {
|
|
return x() == source.x() && y() == source.y() && width() == source.width() && height() == source.height();
|
|
}
|
|
|
|
auto Geometry::operator!=(const Geometry& source) const -> bool {
|
|
return !operator==(source);
|
|
}
|
|
|
|
auto Geometry::height() const -> float {
|
|
return state.height;
|
|
}
|
|
|
|
auto Geometry::position() const -> Position {
|
|
return {state.x, state.y};
|
|
}
|
|
|
|
auto Geometry::reset() -> type& {
|
|
return setGeometry(0, 0, 0, 0);
|
|
}
|
|
|
|
auto Geometry::setHeight(float height) -> type& {
|
|
state.height = height;
|
|
return *this;
|
|
}
|
|
|
|
auto Geometry::setGeometry(Geometry geometry) -> type& {
|
|
return setGeometry(geometry.x(), geometry.y(), geometry.width(), geometry.height());
|
|
}
|
|
|
|
auto Geometry::setGeometry(Position position, Size size) -> type& {
|
|
setGeometry(position.x(), position.y(), size.width(), size.height());
|
|
return *this;
|
|
}
|
|
|
|
auto Geometry::setGeometry(float x, float y, float width, float height) -> type& {
|
|
state.x = x;
|
|
state.y = y;
|
|
state.width = width;
|
|
state.height = height;
|
|
return *this;
|
|
}
|
|
|
|
auto Geometry::setPosition(Position position) -> type& {
|
|
return setPosition(position.x(), position.y());
|
|
}
|
|
|
|
auto Geometry::setPosition(float x, float y) -> type& {
|
|
state.x = x;
|
|
state.y = y;
|
|
return *this;
|
|
}
|
|
|
|
auto Geometry::setSize(Size size) -> type& {
|
|
return setSize(size.width(), size.height());
|
|
}
|
|
|
|
auto Geometry::setSize(float width, float height) -> type& {
|
|
state.width = width;
|
|
state.height = height;
|
|
return *this;
|
|
}
|
|
|
|
auto Geometry::setWidth(float width) -> type& {
|
|
state.width = width;
|
|
return *this;
|
|
}
|
|
|
|
auto Geometry::setX(float x) -> type& {
|
|
state.x = x;
|
|
return *this;
|
|
}
|
|
|
|
auto Geometry::setY(float y) -> type& {
|
|
state.y = y;
|
|
return *this;
|
|
}
|
|
|
|
auto Geometry::size() const -> Size {
|
|
return {state.width, state.height};
|
|
}
|
|
|
|
auto Geometry::width() const -> float {
|
|
return state.width;
|
|
}
|
|
|
|
auto Geometry::x() const -> float {
|
|
return state.x;
|
|
}
|
|
|
|
auto Geometry::y() const -> float {
|
|
return state.y;
|
|
}
|
|
|
|
#endif
|