Cocoa Port: Standardize display rotations to always assume a left-handed Cartesian coordinate system (clockwise rotation).
This commit is contained in:
parent
a6cb37901f
commit
616962f0b7
|
@ -155,7 +155,7 @@ void ClientDisplayView::GetNDSPoint(const int inputID, const bool isInitialTouch
|
||||||
ClientDisplayView::ConvertClientToNormalPoint(this->_property.normalWidth, this->_property.normalHeight,
|
ClientDisplayView::ConvertClientToNormalPoint(this->_property.normalWidth, this->_property.normalHeight,
|
||||||
this->_property.clientWidth, this->_property.clientHeight,
|
this->_property.clientWidth, this->_property.clientHeight,
|
||||||
s,
|
s,
|
||||||
360.0 - this->_property.rotation,
|
this->_property.rotation,
|
||||||
x, y);
|
x, y);
|
||||||
|
|
||||||
// Normalize the touch location to the DS.
|
// Normalize the touch location to the DS.
|
||||||
|
|
|
@ -71,8 +71,8 @@ static const char *Sample1x1OutputVertShader_100 = {"\
|
||||||
mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\
|
mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\
|
||||||
vec2( 0.0, 2.0/viewSize.y)); \n\
|
vec2( 0.0, 2.0/viewSize.y)); \n\
|
||||||
\n\
|
\n\
|
||||||
mat2 rotation = mat2( vec2(cos(angleRadians), -sin(angleRadians)), \n\
|
mat2 rotation = mat2( vec2( cos(angleRadians), sin(angleRadians)), \n\
|
||||||
vec2(sin(angleRadians), cos(angleRadians))); \n\
|
vec2(-sin(angleRadians), cos(angleRadians))); \n\
|
||||||
\n\
|
\n\
|
||||||
mat2 scale = mat2( vec2(scalar, 0.0), \n\
|
mat2 scale = mat2( vec2(scalar, 0.0), \n\
|
||||||
vec2( 0.0, scalar)); \n\
|
vec2( 0.0, scalar)); \n\
|
||||||
|
@ -105,8 +105,8 @@ static const char *BicubicSample4x4Output_VertShader_110 = {"\
|
||||||
mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\
|
mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\
|
||||||
vec2( 0.0, 2.0/viewSize.y)); \n\
|
vec2( 0.0, 2.0/viewSize.y)); \n\
|
||||||
\n\
|
\n\
|
||||||
mat2 rotation = mat2( vec2(cos(angleRadians), -sin(angleRadians)), \n\
|
mat2 rotation = mat2( vec2( cos(angleRadians), sin(angleRadians)), \n\
|
||||||
vec2(sin(angleRadians), cos(angleRadians))); \n\
|
vec2(-sin(angleRadians), cos(angleRadians))); \n\
|
||||||
\n\
|
\n\
|
||||||
mat2 scale = mat2( vec2(scalar, 0.0), \n\
|
mat2 scale = mat2( vec2(scalar, 0.0), \n\
|
||||||
vec2( 0.0, scalar)); \n\
|
vec2( 0.0, scalar)); \n\
|
||||||
|
@ -161,8 +161,8 @@ static const char *BicubicSample5x5Output_VertShader_110 = {"\
|
||||||
mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\
|
mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\
|
||||||
vec2( 0.0, 2.0/viewSize.y)); \n\
|
vec2( 0.0, 2.0/viewSize.y)); \n\
|
||||||
\n\
|
\n\
|
||||||
mat2 rotation = mat2( vec2(cos(angleRadians), -sin(angleRadians)), \n\
|
mat2 rotation = mat2( vec2( cos(angleRadians), sin(angleRadians)), \n\
|
||||||
vec2(sin(angleRadians), cos(angleRadians))); \n\
|
vec2(-sin(angleRadians), cos(angleRadians))); \n\
|
||||||
\n\
|
\n\
|
||||||
mat2 scale = mat2( vec2(scalar, 0.0), \n\
|
mat2 scale = mat2( vec2(scalar, 0.0), \n\
|
||||||
vec2( 0.0, scalar)); \n\
|
vec2( 0.0, scalar)); \n\
|
||||||
|
@ -228,8 +228,8 @@ static const char *BicubicSample6x6Output_VertShader_110 = {"\
|
||||||
mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\
|
mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\
|
||||||
vec2( 0.0, 2.0/viewSize.y)); \n\
|
vec2( 0.0, 2.0/viewSize.y)); \n\
|
||||||
\n\
|
\n\
|
||||||
mat2 rotation = mat2( vec2(cos(angleRadians), -sin(angleRadians)), \n\
|
mat2 rotation = mat2( vec2( cos(angleRadians), sin(angleRadians)), \n\
|
||||||
vec2(sin(angleRadians), cos(angleRadians))); \n\
|
vec2(-sin(angleRadians), cos(angleRadians))); \n\
|
||||||
\n\
|
\n\
|
||||||
mat2 scale = mat2( vec2(scalar, 0.0), \n\
|
mat2 scale = mat2( vec2(scalar, 0.0), \n\
|
||||||
vec2( 0.0, scalar)); \n\
|
vec2( 0.0, scalar)); \n\
|
||||||
|
|
|
@ -209,8 +209,6 @@
|
||||||
#define SPU_SAMPLE_SIZE ((SPU_SAMPLE_RESOLUTION / 8) * SPU_NUMBER_CHANNELS) // Bytes per sample, multiplied by the number of channels
|
#define SPU_SAMPLE_SIZE ((SPU_SAMPLE_RESOLUTION / 8) * SPU_NUMBER_CHANNELS) // Bytes per sample, multiplied by the number of channels
|
||||||
#define SPU_BUFFER_BYTES ((SPU_SAMPLE_RATE / DS_FRAMES_PER_SECOND) * SPU_SAMPLE_SIZE) // Note that this value may be returned as floating point
|
#define SPU_BUFFER_BYTES ((SPU_SAMPLE_RATE / DS_FRAMES_PER_SECOND) * SPU_SAMPLE_SIZE) // Note that this value may be returned as floating point
|
||||||
|
|
||||||
#define CLOCKWISE_DEGREES(x) (360.0 - x) // Converts an angle in degrees from normal-direction to clockwise-direction.
|
|
||||||
|
|
||||||
#define VOLUME_THRESHOLD_LOW 35.0f
|
#define VOLUME_THRESHOLD_LOW 35.0f
|
||||||
#define VOLUME_THRESHOLD_HIGH 75.0f
|
#define VOLUME_THRESHOLD_HIGH 75.0f
|
||||||
|
|
||||||
|
|
|
@ -112,6 +112,7 @@ class OGLVideoOutput;
|
||||||
BOOL _masterStatusBarState;
|
BOOL _masterStatusBarState;
|
||||||
NSRect _masterWindowFrame;
|
NSRect _masterWindowFrame;
|
||||||
double _masterWindowScale;
|
double _masterWindowScale;
|
||||||
|
double _localRotation;
|
||||||
|
|
||||||
OSSpinLock spinlockScale;
|
OSSpinLock spinlockScale;
|
||||||
OSSpinLock spinlockRotation;
|
OSSpinLock spinlockRotation;
|
||||||
|
|
|
@ -117,6 +117,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
|
||||||
_localViewProps.layout = ClientDisplayLayout_Vertical;
|
_localViewProps.layout = ClientDisplayLayout_Vertical;
|
||||||
_localViewProps.order = ClientDisplayOrder_MainFirst;
|
_localViewProps.order = ClientDisplayOrder_MainFirst;
|
||||||
|
|
||||||
|
_localRotation = 0.0;
|
||||||
_minDisplayViewSize = NSMakeSize(_localViewProps.clientWidth, _localViewProps.clientHeight + _localViewProps.gapDistance);
|
_minDisplayViewSize = NSMakeSize(_localViewProps.clientWidth, _localViewProps.clientHeight + _localViewProps.gapDistance);
|
||||||
_isMinSizeNormal = YES;
|
_isMinSizeNormal = YES;
|
||||||
_statusBarHeight = WINDOW_STATUS_BAR_HEIGHT;
|
_statusBarHeight = WINDOW_STATUS_BAR_HEIGHT;
|
||||||
|
@ -192,15 +193,18 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
|
||||||
}
|
}
|
||||||
|
|
||||||
OSSpinLockLock(&spinlockRotation);
|
OSSpinLockLock(&spinlockRotation);
|
||||||
_localViewProps.rotation = newAngleDegrees;
|
_localRotation = newAngleDegrees;
|
||||||
OSSpinLockUnlock(&spinlockRotation);
|
OSSpinLockUnlock(&spinlockRotation);
|
||||||
|
|
||||||
|
// Convert angle to clockwise-direction degrees (left-handed Cartesian coordinate system).
|
||||||
|
_localViewProps.rotation = 360.0 - newAngleDegrees;
|
||||||
|
|
||||||
NSWindow *theWindow = [self window];
|
NSWindow *theWindow = [self window];
|
||||||
|
|
||||||
// Set the minimum content size for the window, since this will change based on rotation.
|
// Set the minimum content size for the window, since this will change based on rotation.
|
||||||
double contentMinWidth = _minDisplayViewSize.width;
|
double contentMinWidth = _minDisplayViewSize.width;
|
||||||
double contentMinHeight = _minDisplayViewSize.height;
|
double contentMinHeight = _minDisplayViewSize.height;
|
||||||
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, CLOCKWISE_DEGREES(newAngleDegrees), contentMinWidth, contentMinHeight);
|
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, _localViewProps.rotation, contentMinWidth, contentMinHeight);
|
||||||
contentMinHeight += _statusBarHeight;
|
contentMinHeight += _statusBarHeight;
|
||||||
[theWindow setContentMinSize:NSMakeSize(contentMinWidth, contentMinHeight)];
|
[theWindow setContentMinSize:NSMakeSize(contentMinWidth, contentMinHeight)];
|
||||||
|
|
||||||
|
@ -218,7 +222,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
|
||||||
}
|
}
|
||||||
|
|
||||||
DisplayOutputTransformData transformData = { _localViewProps.viewScale,
|
DisplayOutputTransformData transformData = { _localViewProps.viewScale,
|
||||||
newAngleDegrees,
|
_localViewProps.rotation,
|
||||||
0.0,
|
0.0,
|
||||||
0.0,
|
0.0,
|
||||||
0.0 };
|
0.0 };
|
||||||
|
@ -231,7 +235,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
|
||||||
- (double) displayRotation
|
- (double) displayRotation
|
||||||
{
|
{
|
||||||
OSSpinLockLock(&spinlockRotation);
|
OSSpinLockLock(&spinlockRotation);
|
||||||
const double angleDegrees = _localViewProps.rotation;
|
const double angleDegrees = _localRotation;
|
||||||
OSSpinLockUnlock(&spinlockRotation);
|
OSSpinLockUnlock(&spinlockRotation);
|
||||||
|
|
||||||
return angleDegrees;
|
return angleDegrees;
|
||||||
|
@ -408,7 +412,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
|
||||||
// Set the minimum content size, keeping the display rotation in mind.
|
// Set the minimum content size, keeping the display rotation in mind.
|
||||||
double transformedMinWidth = _minDisplayViewSize.width;
|
double transformedMinWidth = _minDisplayViewSize.width;
|
||||||
double transformedMinHeight = _minDisplayViewSize.height;
|
double transformedMinHeight = _minDisplayViewSize.height;
|
||||||
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, CLOCKWISE_DEGREES([self displayRotation]), transformedMinWidth, transformedMinHeight);
|
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, _localViewProps.rotation, transformedMinWidth, transformedMinHeight);
|
||||||
[[self window] setContentMinSize:NSMakeSize(transformedMinWidth, transformedMinHeight + _statusBarHeight)];
|
[[self window] setContentMinSize:NSMakeSize(transformedMinWidth, transformedMinHeight + _statusBarHeight)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -510,13 +514,10 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert angle to clockwise-direction degrees.
|
|
||||||
const double angleDegrees = CLOCKWISE_DEGREES(_localViewProps.rotation);
|
|
||||||
|
|
||||||
// Get the maximum scalar size within drawBounds. Constrain scalar to maxScalar if necessary.
|
// Get the maximum scalar size within drawBounds. Constrain scalar to maxScalar if necessary.
|
||||||
double checkWidth = _localViewProps.normalWidth;
|
double checkWidth = _localViewProps.normalWidth;
|
||||||
double checkHeight = _localViewProps.normalHeight;
|
double checkHeight = _localViewProps.normalHeight;
|
||||||
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, angleDegrees, checkWidth, checkHeight);
|
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, _localViewProps.rotation, checkWidth, checkHeight);
|
||||||
|
|
||||||
const double constrainedScale = [self maxScalarForContentBoundsWidth:checkWidth height:checkHeight];
|
const double constrainedScale = [self maxScalarForContentBoundsWidth:checkWidth height:checkHeight];
|
||||||
if (_localViewProps.viewScale > constrainedScale)
|
if (_localViewProps.viewScale > constrainedScale)
|
||||||
|
@ -529,7 +530,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
|
||||||
// Get the new bounds for the window's content view based on the transformed draw bounds.
|
// Get the new bounds for the window's content view based on the transformed draw bounds.
|
||||||
double transformedWidth = _localViewProps.normalWidth;
|
double transformedWidth = _localViewProps.normalWidth;
|
||||||
double transformedHeight = _localViewProps.normalHeight;
|
double transformedHeight = _localViewProps.normalHeight;
|
||||||
ClientDisplayView::ConvertNormalToTransformedBounds(_localViewProps.viewScale, angleDegrees, transformedWidth, transformedHeight);
|
ClientDisplayView::ConvertNormalToTransformedBounds(_localViewProps.viewScale, _localViewProps.rotation, transformedWidth, transformedHeight);
|
||||||
|
|
||||||
// Get the center of the content view in screen coordinates.
|
// Get the center of the content view in screen coordinates.
|
||||||
const NSRect windowContentRect = [[masterWindow contentView] bounds];
|
const NSRect windowContentRect = [[masterWindow contentView] bounds];
|
||||||
|
@ -759,7 +760,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
|
||||||
// Set the minimum content size, keeping the display rotation in mind.
|
// Set the minimum content size, keeping the display rotation in mind.
|
||||||
double transformedMinWidth = _minDisplayViewSize.width;
|
double transformedMinWidth = _minDisplayViewSize.width;
|
||||||
double transformedMinHeight = _minDisplayViewSize.height;
|
double transformedMinHeight = _minDisplayViewSize.height;
|
||||||
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, CLOCKWISE_DEGREES([self displayRotation]), transformedMinWidth, transformedMinHeight);
|
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, _localViewProps.rotation, transformedMinWidth, transformedMinHeight);
|
||||||
transformedMinHeight += _statusBarHeight;
|
transformedMinHeight += _statusBarHeight;
|
||||||
|
|
||||||
// Resize the window if it's smaller than the minimum content size.
|
// Resize the window if it's smaller than the minimum content size.
|
||||||
|
@ -1275,7 +1276,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
|
||||||
// content Rect.
|
// content Rect.
|
||||||
double checkWidth = _localViewProps.normalWidth;
|
double checkWidth = _localViewProps.normalWidth;
|
||||||
double checkHeight = _localViewProps.normalHeight;
|
double checkHeight = _localViewProps.normalHeight;
|
||||||
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, [self displayRotation], checkWidth, checkHeight);
|
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, _localViewProps.rotation, checkWidth, checkHeight);
|
||||||
const NSSize contentBounds = NSMakeSize(contentRect.size.width, contentRect.size.height - _statusBarHeight);
|
const NSSize contentBounds = NSMakeSize(contentRect.size.width, contentRect.size.height - _statusBarHeight);
|
||||||
const double constrainedScale = ClientDisplayView::GetMaxScalarWithinBounds(checkWidth, checkHeight, contentBounds.width, contentBounds.height);
|
const double constrainedScale = ClientDisplayView::GetMaxScalarWithinBounds(checkWidth, checkHeight, contentBounds.width, contentBounds.height);
|
||||||
|
|
||||||
|
@ -1297,7 +1298,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
|
||||||
// Get the max scalar within the window's current content bounds.
|
// Get the max scalar within the window's current content bounds.
|
||||||
double checkWidth = _localViewProps.normalWidth;
|
double checkWidth = _localViewProps.normalWidth;
|
||||||
double checkHeight = _localViewProps.normalHeight;
|
double checkHeight = _localViewProps.normalHeight;
|
||||||
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, [self displayRotation], checkWidth, checkHeight);
|
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, _localViewProps.rotation, checkWidth, checkHeight);
|
||||||
|
|
||||||
NSSize contentBounds = [[[self window] contentView] bounds].size;
|
NSSize contentBounds = [[[self window] contentView] bounds].size;
|
||||||
contentBounds.height -= _statusBarHeight;
|
contentBounds.height -= _statusBarHeight;
|
||||||
|
@ -1346,7 +1347,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
|
||||||
// content Rect.
|
// content Rect.
|
||||||
double checkWidth = _localViewProps.normalWidth;
|
double checkWidth = _localViewProps.normalWidth;
|
||||||
double checkHeight = _localViewProps.normalHeight;
|
double checkHeight = _localViewProps.normalHeight;
|
||||||
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, [self displayRotation], checkWidth, checkHeight);
|
ClientDisplayView::ConvertNormalToTransformedBounds(1.0, _localViewProps.rotation, checkWidth, checkHeight);
|
||||||
const NSSize contentBounds = NSMakeSize(contentRect.size.width, contentRect.size.height - _statusBarHeight);
|
const NSSize contentBounds = NSMakeSize(contentRect.size.width, contentRect.size.height - _statusBarHeight);
|
||||||
const double maxS = ClientDisplayView::GetMaxScalarWithinBounds(checkWidth, checkHeight, contentBounds.width, contentBounds.height);
|
const double maxS = ClientDisplayView::GetMaxScalarWithinBounds(checkWidth, checkHeight, contentBounds.width, contentBounds.height);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue