-
Notifications
You must be signed in to change notification settings - Fork 0
/
ResolutionConversionSingleton.cpp
114 lines (89 loc) · 3.54 KB
/
ResolutionConversionSingleton.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "ResolutionConversionSingleton.h"
#include "ResizingQuickWidget.h"
#include "World.h"
#include <cassert>
#include <QWindow>
#include <QScreen>
#include <QGuiApplication>
#include <QApplication>
// TODO: make configurable using QSettings
static const qreal theHandleSizeMM = 4.; // handle is resolution independent, 4mm wide and tall
static const int theHandleMinPix = 18; // never make handle smaller than 18 pixels
static ResolutionConversionSingleton *theRCSPtr = nullptr;
ResolutionConversionSingleton::ResolutionConversionSingleton(ResizingQuickWidget *parent)
: QObject(parent),
theActualQScreenPtr(nullptr),
theWorldHeight(1.0), theWorldWidth(1.0)
{
theRCSPtr = this;
theActualQScreenPtr = QApplication::primaryScreen();
assert (theActualQScreenPtr != nullptr);
printf(" physicX DPI: %f\n", theActualQScreenPtr->physicalDotsPerInchX());
printf(" physicY DPI: %f\n", theActualQScreenPtr->physicalDotsPerInchY());
theRenderPixels = theActualQScreenPtr->availableGeometry().width();
// Pre-calculate the handle sizes, they normally won't change during play...
theHandleHeight = theHandleSizeMM / 25.4 * theActualQScreenPtr->physicalDotsPerInchX();
if (theHandleHeight < theHandleMinPix)
theHandleHeight = theHandleMinPix;
theHandleWidth = theHandleSizeMM / 25.4 * theActualQScreenPtr->physicalDotsPerInchY();
if (theHandleWidth < theHandleMinPix)
theHandleWidth = theHandleMinPix;
// connect (parent, &ResizingQuickWidget::wasResized,
// this, &ResolutionConversionSingleton::slot_RQW_resized);
}
ResolutionConversionSingleton::~ResolutionConversionSingleton()
{
theMainWindowPtr = nullptr;
theActualQScreenPtr = nullptr;
}
void ResolutionConversionSingleton::adjustToWorldSize(const World &aWorldPtr)
{
theWorldHeight = aWorldPtr.getHeight();
theWorldWidth = aWorldPtr.getWidth();
emit aspectRatioChanged();
}
qreal ResolutionConversionSingleton::convertPixels2H(qreal aPixelH)
{
return aPixelH / (me()->theRenderPixels/me()->aspectRatio()) * me()->theWorldHeight;
}
qreal ResolutionConversionSingleton::convertPixels2W(qreal aPixelW)
{
return aPixelW / me()->theRenderPixels * me()->theWorldWidth;
}
qreal ResolutionConversionSingleton::convertPixels2X(qreal aPixelX)
{
return convertPixels2W(aPixelX);
}
qreal ResolutionConversionSingleton::convertPixels2Y(qreal aPixelY)
{
return convertPixels2H(me()->theRenderPixels/me()->aspectRatio() - aPixelY);
}
qreal ResolutionConversionSingleton::convertH2Pixels(qreal anSI_H)
{
return anSI_H/me()->theWorldHeight * (me()->theRenderPixels/me()->aspectRatio());
}
qreal ResolutionConversionSingleton::convertW2Pixels(qreal anSI_W)
{
return anSI_W/me()->theWorldWidth * me()->theRenderPixels;
}
qreal ResolutionConversionSingleton::convertX2Pixels(qreal anSI_X)
{
return convertH2Pixels(anSI_X);
}
qreal ResolutionConversionSingleton::convertY2Pixels(qreal anSI_Y)
{
return me()->theRenderPixels/me()->aspectRatio() - convertH2Pixels(anSI_Y);
}
ResolutionConversionSingleton* ResolutionConversionSingleton::me()
{
assert (theRCSPtr != nullptr);
return theRCSPtr;
}
//void ResolutionConversionSingleton::slot_RQW_resized(QSize aNewSize)
//{
// printf("RCS::slot_RQW_resized() called\n");
// // We want to draw World::width() meters on aNewSize.width() pixels which should
// // be the same as drawing World::height() meters on aNewSize.height() pixels.
// // Note that we already limit the RQW in aspect ratio.
// // But we get here because aNewSize [pixels] has changed.
//}