all repos — mgba @ c4b38790f211b65cb15af26cebe9fc25e3c19914

mGBA Game Boy Advance Emulator

src/platform/qt/utils.h (view raw)

 1/* Copyright (c) 2013-2017 Jeffrey Pfau
 2 *
 3 * This Source Code Form is subject to the terms of the Mozilla Public
 4 * License, v. 2.0. If a copy of the MPL was not distributed with this
 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 6#pragma once
 7
 8#include <mgba/core/core.h>
 9#include <mgba-util/socket.h>
10
11#include <QHostAddress>
12#include <QRect>
13#include <QSize>
14#include <QString>
15
16#include <algorithm>
17
18namespace QGBA {
19
20enum class Endian {
21	NONE    = 0b00,
22	BIG     = 0b01,
23	LITTLE  = 0b10,
24	UNKNOWN = 0b11
25};
26
27QString niceSizeFormat(size_t filesize);
28QString nicePlatformFormat(mPlatform platform);
29
30bool convertAddress(const QHostAddress* input, Address* output);
31
32inline void lockAspectRatio(const QSize& ref, QSize& size) {
33	if (size.width() * ref.height() > size.height() * ref.width()) {
34		size.setWidth(size.height() * ref.width() / ref.height());
35	} else if (size.width() * ref.height() < size.height() * ref.width()) {
36		size.setHeight(size.width() * ref.height() / ref.width());
37	}
38}
39
40inline void lockIntegerScaling(const QSize& ref, QSize& size) {
41	if (size.width() >= ref.width()) {
42		size.setWidth(size.width() - size.width() % ref.width());
43	}
44	if (size.height() >= ref.height()) {
45		size.setHeight(size.height() - size.height() % ref.height());
46	}
47}
48
49inline QRect clampSize(const QSize& ref, const QSize& size, bool aspectRatio, bool integerScaling) {
50	QSize ds = size;
51	if (aspectRatio) {
52		lockAspectRatio(ref, ds);
53	}
54	if (integerScaling) {
55		QGBA::lockIntegerScaling(ref, ds);
56	}
57	QPoint origin = QPoint((size.width() - ds.width()) / 2, (size.height() - ds.height()) / 2);
58	return QRect(origin, ds);
59}
60
61#if __cplusplus >= 201703L
62using std::clamp;
63#else
64template<class T>
65constexpr const T& clamp(const T& v, const T& lo, const T& hi) {
66	return std::max(lo, std::min(hi, v));
67}
68#endif
69
70}