Cocoa Port: New feature -- add Hybrid display orientations.

- The new Hybrid display orientations show three NDS screens — the top
and bottom screens on the left side, and a larger major screen on the
right side. This feature is intended to better use the widescreen
resolution of most users’ host displays, which are usually 16:9 or
16:10. Three different Hybrid orientations are provided (3:2, 16:9, and
16:10) so that users can choose the display size ratio that they prefer.
- Horizontal display orientation no longer uses the display separation
setting.
- Do some additional code cleanup.
This commit is contained in:
rogerman 2016-12-31 18:10:48 -08:00
parent cf8f021b30
commit 207a3b2e9e
11 changed files with 583 additions and 387 deletions

View File

@ -5584,7 +5584,7 @@ bool OGLImage::CanUseShaderBasedFilters()
return this->_canUseShaderBasedFilters;
}
void OGLImage::GetNormalSize(double &w, double &h)
void OGLImage::GetNormalSize(double &w, double &h) const
{
w = this->_normalWidth;
h = this->_normalHeight;
@ -6736,16 +6736,14 @@ OGLDisplayLayer::OGLDisplayLayer(OGLVideoOutput *oglVO)
_needUpdateVertices = true;
_useDeposterize = false;
_displayWidth = GPU_DISPLAY_WIDTH;
_displayHeight = GPU_DISPLAY_HEIGHT;
_displayMode = DS_DISPLAY_TYPE_DUAL;
_displayOrder = DS_DISPLAY_ORDER_MAIN_FIRST;
_displayOrientation = DS_DISPLAY_ORIENTATION_VERTICAL;
_displayMode = ClientDisplayMode_Dual;
_displayOrder = ClientDisplayOrder_MainFirst;
_displayOrientation = ClientDisplayLayout_Vertical;
_gapScalar = 0.0f;
_rotation = 0.0f;
_normalWidth = _displayWidth;
_normalHeight = _displayHeight*2.0 + ((_displayHeight * DS_DISPLAY_VERTICAL_GAP_TO_HEIGHT_RATIO) * _gapScalar);
_normalWidth = GPU_DISPLAY_WIDTH;
_normalHeight = GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_UNSCALED_GAP*_gapScalar);
_vf[0] = new VideoFilter(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT, VideoFilterTypeID_None, 0);
_vf[1] = new VideoFilter(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT, VideoFilterTypeID_None, 0);
@ -6832,9 +6830,9 @@ OGLDisplayLayer::OGLDisplayLayer(OGLVideoOutput *oglVO)
glGenBuffersARB(1, &_vboTexCoordID);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboVertexID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLint) * (2 * 8), NULL, GL_STATIC_DRAW_ARB);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * (4 * 8), NULL, GL_STATIC_DRAW_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboTexCoordID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * (2 * 8), NULL, GL_STREAM_DRAW_ARB);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * (4 * 8), NULL, GL_STREAM_DRAW_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
// Set up VAO
@ -6844,7 +6842,7 @@ OGLDisplayLayer::OGLDisplayLayer(OGLVideoOutput *oglVO)
if (this->_output->GetInfo()->IsShaderSupported())
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboVertexID);
glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_INT, GL_FALSE, 0, 0);
glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_FLOAT, GL_FALSE, 0, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboTexCoordID);
glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, 0, 0);
@ -6854,7 +6852,7 @@ OGLDisplayLayer::OGLDisplayLayer(OGLVideoOutput *oglVO)
else
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboVertexID);
glVertexPointer(2, GL_INT, 0, 0);
glVertexPointer(2, GL_FLOAT, 0, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboTexCoordID);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
@ -7118,66 +7116,48 @@ void OGLDisplayLayer::SetFiltersPreferGPUOGL(bool preferGPU)
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
}
uint16_t OGLDisplayLayer::GetDisplayWidth()
{
return this->_displayWidth;
}
uint16_t OGLDisplayLayer::GetDisplayHeight()
{
return this->_displayHeight;
}
void OGLDisplayLayer::SetDisplaySize(uint16_t w, uint16_t h)
{
this->_displayWidth = w;
this->_displayHeight = h;
this->GetNormalSize(this->_normalWidth, this->_normalHeight);
this->_needUpdateVertices = true;
}
int OGLDisplayLayer::GetMode()
ClientDisplayMode OGLDisplayLayer::GetMode() const
{
return this->_displayMode;
}
void OGLDisplayLayer::SetMode(int dispMode)
void OGLDisplayLayer::SetMode(const ClientDisplayMode dispMode)
{
this->_displayMode = dispMode;
this->GetNormalSize(this->_normalWidth, this->_normalHeight);
OGLDisplayLayer::CalculateNormalSize(this->_displayMode, this->_displayOrientation, this->_gapScalar, this->_normalWidth, this->_normalHeight);
this->_needUpdateVertices = true;
}
int OGLDisplayLayer::GetOrientation()
ClientDisplayLayout OGLDisplayLayer::GetOrientation() const
{
return this->_displayOrientation;
}
void OGLDisplayLayer::SetOrientation(int dispOrientation)
void OGLDisplayLayer::SetOrientation(ClientDisplayLayout dispOrientation)
{
this->_displayOrientation = dispOrientation;
this->GetNormalSize(this->_normalWidth, this->_normalHeight);
OGLDisplayLayer::CalculateNormalSize(this->_displayMode, this->_displayOrientation, this->_gapScalar, this->_normalWidth, this->_normalHeight);
this->_needUpdateVertices = true;
}
GLfloat OGLDisplayLayer::GetGapScalar()
double OGLDisplayLayer::GetGapScalar() const
{
return this->_gapScalar;
}
void OGLDisplayLayer::SetGapScalar(GLfloat theScalar)
void OGLDisplayLayer::SetGapScalar(double theScalar)
{
this->_gapScalar = theScalar;
this->GetNormalSize(this->_normalWidth, this->_normalHeight);
OGLDisplayLayer::CalculateNormalSize(this->_displayMode, this->_displayOrientation, this->_gapScalar, this->_normalWidth, this->_normalHeight);
this->_needUpdateVertices = true;
}
GLfloat OGLDisplayLayer::GetRotation()
double OGLDisplayLayer::GetRotation() const
{
return this->_rotation;
}
void OGLDisplayLayer::SetRotation(GLfloat theRotation)
void OGLDisplayLayer::SetRotation(double theRotation)
{
this->_rotation = theRotation;
}
@ -7192,12 +7172,12 @@ void OGLDisplayLayer::SetSourceDeposterize(bool useDeposterize)
this->_useDeposterize = (this->_canUseShaderBasedFilters) ? useDeposterize : false;
}
int OGLDisplayLayer::GetOrder()
ClientDisplayOrder OGLDisplayLayer::GetOrder() const
{
return this->_displayOrder;
}
void OGLDisplayLayer::SetOrder(int dispOrder)
void OGLDisplayLayer::SetOrder(ClientDisplayOrder dispOrder)
{
this->_displayOrder = dispOrder;
this->_needUpdateVertices = true;
@ -7205,50 +7185,129 @@ void OGLDisplayLayer::SetOrder(int dispOrder)
void OGLDisplayLayer::UpdateVerticesOGL()
{
const size_t f = (this->_displayOrder == DS_DISPLAY_ORDER_MAIN_FIRST) ? 0 : 8;
const GLfloat w = this->_displayWidth;
const GLfloat h = this->_displayHeight;
const GLfloat gap = (h * DS_DISPLAY_VERTICAL_GAP_TO_HEIGHT_RATIO) * this->_gapScalar / 2.0;
const GLfloat w = this->_normalWidth / 2.0f;
const GLfloat h = this->_normalHeight / 2.0f;
const size_t f = (this->_displayOrder == ClientDisplayOrder_MainFirst) ? 0 : 8;
glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboVertexID);
GLint *vtxBufferPtr = (GLint *)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
GLfloat *vtxBufferPtr = (GLfloat *)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
if (this->_displayMode == DS_DISPLAY_TYPE_DUAL)
if (this->_displayMode == ClientDisplayMode_Dual)
{
// displayOrder == DS_DISPLAY_ORDER_MAIN_FIRST
if (this->_displayOrientation == DS_DISPLAY_ORIENTATION_VERTICAL)
switch (this->_displayOrientation)
{
vtxBufferPtr[0+f] = -w/2; vtxBufferPtr[1+f] = h+gap; // Top display, top left
vtxBufferPtr[2+f] = w/2; vtxBufferPtr[3+f] = h+gap; // Top display, top right
vtxBufferPtr[4+f] = -w/2; vtxBufferPtr[5+f] = gap; // Top display, bottom left
vtxBufferPtr[6+f] = w/2; vtxBufferPtr[7+f] = gap; // Top display, bottom right
vtxBufferPtr[8-f] = -w/2; vtxBufferPtr[9-f] = -gap; // Bottom display, top left
vtxBufferPtr[10-f] = w/2; vtxBufferPtr[11-f] = -gap; // Bottom display, top right
vtxBufferPtr[12-f] = -w/2; vtxBufferPtr[13-f] = -(h+gap); // Bottom display, bottom left
vtxBufferPtr[14-f] = w/2; vtxBufferPtr[15-f] = -(h+gap); // Bottom display, bottom right
}
else // displayOrientationID == DS_DISPLAY_ORIENTATION_HORIZONTAL
{
vtxBufferPtr[0+f] = -(w+gap); vtxBufferPtr[1+f] = h/2; // Left display, top left
vtxBufferPtr[2+f] = -gap; vtxBufferPtr[3+f] = h/2; // Left display, top right
vtxBufferPtr[4+f] = -(w+gap); vtxBufferPtr[5+f] = -h/2; // Left display, bottom left
vtxBufferPtr[6+f] = -gap; vtxBufferPtr[7+f] = -h/2; // Left display, bottom right
vtxBufferPtr[8-f] = gap; vtxBufferPtr[9-f] = h/2; // Right display, top left
vtxBufferPtr[10-f] = w+gap; vtxBufferPtr[11-f] = h/2; // Right display, top right
vtxBufferPtr[12-f] = gap; vtxBufferPtr[13-f] = -h/2; // Right display, bottom left
vtxBufferPtr[14-f] = w+gap; vtxBufferPtr[15-f] = -h/2; // Right display, bottom right
case ClientDisplayLayout_Horizontal:
{
vtxBufferPtr[0+f] = -w; vtxBufferPtr[1+f] = h; // Left display, top left
vtxBufferPtr[2+f] = 0.0f; vtxBufferPtr[3+f] = h; // Left display, top right
vtxBufferPtr[4+f] = -w; vtxBufferPtr[5+f] = -h; // Left display, bottom left
vtxBufferPtr[6+f] = 0.0f; vtxBufferPtr[7+f] = -h; // Left display, bottom right
vtxBufferPtr[8-f] = 0.0f; vtxBufferPtr[9-f] = h; // Right display, top left
vtxBufferPtr[10-f] = w; vtxBufferPtr[11-f] = h; // Right display, top right
vtxBufferPtr[12-f] = 0.0f; vtxBufferPtr[13-f] = -h; // Right display, bottom left
vtxBufferPtr[14-f] = w; vtxBufferPtr[15-f] = -h; // Right display, bottom right
memcpy(vtxBufferPtr + (2 * 8), vtxBufferPtr + (0 * 8), sizeof(GLfloat) * (2 * 8)); // Unused displays
break;
}
case ClientDisplayLayout_Hybrid_3_2:
{
vtxBufferPtr[0] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[1] = -h + (96.0f * 2.0f); // Minor top display, top left
vtxBufferPtr[2] = w; vtxBufferPtr[3] = -h + (96.0f * 2.0f); // Minor top display, top right
vtxBufferPtr[4] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[5] = -h + 96.0f; // Minor top display, bottom left
vtxBufferPtr[6] = w; vtxBufferPtr[7] = -h + 96.0f; // Minor top display, bottom right
vtxBufferPtr[8] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[9] = -h + 96.0f; // Minor bottom display, top left
vtxBufferPtr[10] = w; vtxBufferPtr[11] = -h + 96.0f; // Minor bottom display, top right
vtxBufferPtr[12] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[13] = -h; // Minor bottom display, bottom left
vtxBufferPtr[14] = w; vtxBufferPtr[15] = -h; // Minor bottom display, bottom right
vtxBufferPtr[16] = -w; vtxBufferPtr[17] = h; // Major display, top left
vtxBufferPtr[18] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[19] = h; // Major display, top right
vtxBufferPtr[20] = -w; vtxBufferPtr[21] = -h; // Major display, bottom left
vtxBufferPtr[22] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[23] = -h; // Major display, bottom right
memcpy(vtxBufferPtr + (3 * 8), vtxBufferPtr + (2 * 8), sizeof(GLfloat) * (1 * 8)); // Major display (bottom screen)
break;
}
case ClientDisplayLayout_Hybrid_16_9:
{
const GLfloat g = (GLfloat)DS_DISPLAY_UNSCALED_GAP * this->_gapScalar * (this->_normalWidth - (GLfloat)GPU_DISPLAY_WIDTH) / (GLfloat)GPU_DISPLAY_WIDTH;
vtxBufferPtr[0] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[1] = -h + g + (64.0f * 2.0f); // Minor top display, top left
vtxBufferPtr[2] = w; vtxBufferPtr[3] = -h + g + (64.0f * 2.0f); // Minor top display, top right
vtxBufferPtr[4] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[5] = -h + g + 64.0f; // Minor top display, bottom left
vtxBufferPtr[6] = w; vtxBufferPtr[7] = -h + g + 64.0f; // Minor top display, bottom right
vtxBufferPtr[8] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[9] = -h + 64.0f; // Minor bottom display, top left
vtxBufferPtr[10] = w; vtxBufferPtr[11] = -h + 64.0f; // Minor bottom display, top right
vtxBufferPtr[12] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[13] = -h; // Minor bottom display, bottom left
vtxBufferPtr[14] = w; vtxBufferPtr[15] = -h; // Minor bottom display, bottom right
vtxBufferPtr[16] = -w; vtxBufferPtr[17] = h; // Major display, top left
vtxBufferPtr[18] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[19] = h; // Major display, top right
vtxBufferPtr[20] = -w; vtxBufferPtr[21] = -h; // Major display, bottom left
vtxBufferPtr[22] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[23] = -h; // Major display, bottom right
memcpy(vtxBufferPtr + (3 * 8), vtxBufferPtr + (2 * 8), sizeof(GLfloat) * (1 * 8)); // Major display (bottom screen)
break;
}
case ClientDisplayLayout_Hybrid_16_10:
{
const GLfloat g = (GLfloat)DS_DISPLAY_UNSCALED_GAP * this->_gapScalar * (this->_normalWidth - (GLfloat)GPU_DISPLAY_WIDTH) / (GLfloat)GPU_DISPLAY_WIDTH;
vtxBufferPtr[0] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[1] = -h + g + (38.4f * 2.0f); // Minor top display, top left
vtxBufferPtr[2] = w; vtxBufferPtr[3] = -h + g + (38.4f * 2.0f); // Minor top display, top right
vtxBufferPtr[4] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[5] = -h + g + 38.4f; // Minor top display, bottom left
vtxBufferPtr[6] = w; vtxBufferPtr[7] = -h + g + 38.4f; // Minor top display, bottom right
vtxBufferPtr[8] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[9] = -h + 38.4f; // Minor bottom display, top left
vtxBufferPtr[10] = w; vtxBufferPtr[11] = -h + 38.4f; // Minor bottom display, top right
vtxBufferPtr[12] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[13] = -h; // Minor bottom display, bottom left
vtxBufferPtr[14] = w; vtxBufferPtr[15] = -h; // Minor bottom display, bottom right
vtxBufferPtr[16] = -w; vtxBufferPtr[17] = h; // Major display, top left
vtxBufferPtr[18] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[19] = h; // Major display, top right
vtxBufferPtr[20] = -w; vtxBufferPtr[21] = -h; // Major display, bottom left
vtxBufferPtr[22] = -w + (GLfloat)GPU_DISPLAY_WIDTH; vtxBufferPtr[23] = -h; // Major display, bottom right
memcpy(vtxBufferPtr + (3 * 8), vtxBufferPtr + (2 * 8), sizeof(GLfloat) * (1 * 8)); // Major display (bottom screen)
break;
}
default: // Default to vertical orientation.
{
const GLfloat g = (GLfloat)DS_DISPLAY_UNSCALED_GAP * this->_gapScalar;
vtxBufferPtr[0+f] = -w; vtxBufferPtr[1+f] = h; // Top display, top left
vtxBufferPtr[2+f] = w; vtxBufferPtr[3+f] = h; // Top display, top right
vtxBufferPtr[4+f] = -w; vtxBufferPtr[5+f] = g/2.0f; // Top display, bottom left
vtxBufferPtr[6+f] = w; vtxBufferPtr[7+f] = g/2.0f; // Top display, bottom right
vtxBufferPtr[8-f] = -w; vtxBufferPtr[9-f] = -g/2.0f; // Bottom display, top left
vtxBufferPtr[10-f] = w; vtxBufferPtr[11-f] = -g/2.0f; // Bottom display, top right
vtxBufferPtr[12-f] = -w; vtxBufferPtr[13-f] = -h; // Bottom display, bottom left
vtxBufferPtr[14-f] = w; vtxBufferPtr[15-f] = -h; // Bottom display, bottom right
memcpy(vtxBufferPtr + (2 * 8), vtxBufferPtr + (0 * 8), sizeof(GLfloat) * (2 * 8)); // Unused displays
break;
}
}
}
else // displayModeID == DS_DISPLAY_TYPE_MAIN || displayModeID == DS_DISPLAY_TYPE_TOUCH
else // displayModeID == ClientDisplayMode_Main || displayModeID == ClientDisplayMode_Touch
{
vtxBufferPtr[0] = -w/2; vtxBufferPtr[1] = h/2; // First display, top left
vtxBufferPtr[2] = w/2; vtxBufferPtr[3] = h/2; // First display, top right
vtxBufferPtr[4] = -w/2; vtxBufferPtr[5] = -h/2; // First display, bottom left
vtxBufferPtr[6] = w/2; vtxBufferPtr[7] = -h/2; // First display, bottom right
vtxBufferPtr[0] = -w; vtxBufferPtr[1] = h; // First display, top left
vtxBufferPtr[2] = w; vtxBufferPtr[3] = h; // First display, top right
vtxBufferPtr[4] = -w; vtxBufferPtr[5] = -h; // First display, bottom left
vtxBufferPtr[6] = w; vtxBufferPtr[7] = -h; // First display, bottom right
memcpy(vtxBufferPtr + (1 * 8), vtxBufferPtr + (0 * 8), sizeof(GLint) * (1 * 8)); // Second display
memcpy(vtxBufferPtr + (1 * 8), vtxBufferPtr + (0 * 8), sizeof(GLfloat) * (1 * 8)); // Second display
memcpy(vtxBufferPtr + (2 * 8), vtxBufferPtr + (0 * 8), sizeof(GLfloat) * (1 * 8)); // Unused display
memcpy(vtxBufferPtr + (3 * 8), vtxBufferPtr + (0 * 8), sizeof(GLfloat) * (1 * 8)); // Unused display
}
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
@ -7262,23 +7321,10 @@ bool OGLDisplayLayer::CanUseShaderBasedFilters()
return this->_canUseShaderBasedFilters;
}
void OGLDisplayLayer::GetNormalSize(double &w, double &h)
void OGLDisplayLayer::GetNormalSize(double &outWidth, double &outHeight) const
{
if (this->_displayMode != DS_DISPLAY_TYPE_DUAL)
{
w = this->_displayWidth;
h = this->_displayHeight;
}
else if (this->_displayOrientation == DS_DISPLAY_ORIENTATION_VERTICAL)
{
w = this->_displayWidth;
h = this->_displayHeight * 2.0 + ((this->_displayHeight * DS_DISPLAY_VERTICAL_GAP_TO_HEIGHT_RATIO) * this->_gapScalar);
}
else
{
w = this->_displayWidth * 2.0 + ((this->_displayHeight * DS_DISPLAY_VERTICAL_GAP_TO_HEIGHT_RATIO) * this->_gapScalar);
h = this->_displayHeight;
}
outWidth = this->_normalWidth;
outHeight = this->_normalHeight;
}
void OGLDisplayLayer::ResizeCPUPixelScalerOGL(const size_t srcWidthMain, const size_t srcHeightMain, const size_t srcWidthTouch, const size_t srcHeightTouch, const size_t scaleMultiply, const size_t scaleDivide)
@ -7350,6 +7396,7 @@ void OGLDisplayLayer::UploadTransformationOGL()
}
glViewport(0, 0, this->_viewportWidth, this->_viewportHeight);
this->_needUpdateVertices = true;
}
int OGLDisplayLayer::GetOutputFilter()
@ -7750,8 +7797,8 @@ void OGLDisplayLayer::SetCPUPixelScalerOGL(const VideoFilterTypeID filterID)
void OGLDisplayLayer::LoadFrameOGL(bool isMainSizeNative, bool isTouchSizeNative)
{
const bool isUsingCPUPixelScaler = (this->_pixelScaler != VideoFilterTypeID_None) && !this->_useShaderBasedPixelScaler;
const bool loadMainScreen = (this->_displayMode == DS_DISPLAY_TYPE_MAIN) || (this->_displayMode == DS_DISPLAY_TYPE_DUAL);
const bool loadTouchScreen = (this->_displayMode == DS_DISPLAY_TYPE_TOUCH) || (this->_displayMode == DS_DISPLAY_TYPE_DUAL);
const bool loadMainScreen = (this->_displayMode == ClientDisplayMode_Main) || (this->_displayMode == ClientDisplayMode_Dual);
const bool loadTouchScreen = (this->_displayMode == ClientDisplayMode_Touch) || (this->_displayMode == ClientDisplayMode_Dual);
this->_isTexVideoInputDataNative[0] = isMainSizeNative;
this->_isTexVideoInputDataNative[1] = isTouchSizeNative;
@ -7860,7 +7907,7 @@ void OGLDisplayLayer::ProcessOGL()
GLfloat w1 = this->_texLoadedWidth[1];
GLfloat h1 = this->_texLoadedHeight[1];
if (this->_isTexVideoInputDataNative[0] && (displayMode == DS_DISPLAY_TYPE_MAIN || displayMode == DS_DISPLAY_TYPE_DUAL))
if (this->_isTexVideoInputDataNative[0] && (displayMode == ClientDisplayMode_Main || displayMode == ClientDisplayMode_Dual))
{
if (this->_useDeposterize)
{
@ -7873,7 +7920,7 @@ void OGLDisplayLayer::ProcessOGL()
if (isUsingCPUPixelScaler) // Hybrid CPU/GPU-based path (may cause a performance hit on pixel download)
{
if ( this->_isTexVideoInputDataNative[0] && ((displayMode == DS_DISPLAY_TYPE_MAIN) || (displayMode == DS_DISPLAY_TYPE_DUAL)) )
if ( this->_isTexVideoInputDataNative[0] && ((displayMode == ClientDisplayMode_Main) || (displayMode == ClientDisplayMode_Dual)) )
{
this->_filterDeposterize[0]->DownloadDstBufferOGL(this->_vf[0]->GetSrcBufferPtr(), 0, this->_filterDeposterize[0]->GetSrcHeight());
}
@ -7905,7 +7952,7 @@ void OGLDisplayLayer::ProcessOGL()
}
}
if (this->_isTexVideoInputDataNative[1] && (displayMode == DS_DISPLAY_TYPE_TOUCH || displayMode == DS_DISPLAY_TYPE_DUAL))
if (this->_isTexVideoInputDataNative[1] && (displayMode == ClientDisplayMode_Touch || displayMode == ClientDisplayMode_Dual))
{
if (this->_useDeposterize)
{
@ -7915,7 +7962,7 @@ void OGLDisplayLayer::ProcessOGL()
if (isUsingCPUPixelScaler) // Hybrid CPU/GPU-based path (may cause a performance hit on pixel download)
{
if ( this->_isTexVideoInputDataNative[1] && ((displayMode == DS_DISPLAY_TYPE_TOUCH) || (displayMode == DS_DISPLAY_TYPE_DUAL)) )
if ( this->_isTexVideoInputDataNative[1] && ((displayMode == ClientDisplayMode_Touch) || (displayMode == ClientDisplayMode_Dual)) )
{
this->_filterDeposterize[1]->DownloadDstBufferOGL(this->_vf[1]->GetSrcBufferPtr(), 0, this->_filterDeposterize[1]->GetSrcHeight());
}
@ -7953,7 +8000,7 @@ void OGLDisplayLayer::ProcessOGL()
// Update the texture coordinates
glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboTexCoordID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, (2 * 8) * sizeof(GLfloat), NULL, GL_STREAM_DRAW_ARB);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, (4 * 8) * sizeof(GLfloat), NULL, GL_STREAM_DRAW_ARB);
GLfloat *texCoordBufferPtr = (GLfloat *)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
texCoordBufferPtr[0] = 0.0f; texCoordBufferPtr[1] = 0.0f;
@ -7966,6 +8013,8 @@ void OGLDisplayLayer::ProcessOGL()
texCoordBufferPtr[12] = 0.0f; texCoordBufferPtr[13] = h1;
texCoordBufferPtr[14] = w1; texCoordBufferPtr[15] = h1;
memcpy(texCoordBufferPtr + (2 * 8), texCoordBufferPtr + (0 * 8), sizeof(GLfloat) * (2 * 8));
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
@ -7985,23 +8034,42 @@ void OGLDisplayLayer::RenderOGL()
// Enable vertex attributes
glBindVertexArrayDESMUME(this->_vaoMainStatesID);
switch (this->GetMode())
switch (this->_displayMode)
{
case DS_DISPLAY_TYPE_MAIN:
case ClientDisplayMode_Main:
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoOutputID[0]);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, this->_displayTexFilter[0]);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, this->_displayTexFilter[0]);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
break;
case DS_DISPLAY_TYPE_TOUCH:
case ClientDisplayMode_Touch:
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoOutputID[1]);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, this->_displayTexFilter[1]);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, this->_displayTexFilter[1]);
glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);
break;
case DS_DISPLAY_TYPE_DUAL:
case ClientDisplayMode_Dual:
{
const size_t majorDisplayTex = (this->_displayOrder == ClientDisplayOrder_MainFirst) ? 0 : 1;
const size_t majorDisplayVtx = (this->_displayOrder == ClientDisplayOrder_MainFirst) ? 8 : 12;
switch (this->_displayOrientation)
{
case ClientDisplayLayout_Hybrid_3_2:
case ClientDisplayLayout_Hybrid_16_9:
case ClientDisplayLayout_Hybrid_16_10:
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoOutputID[majorDisplayTex]);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, this->_displayTexFilter[majorDisplayTex]);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, this->_displayTexFilter[majorDisplayTex]);
glDrawArrays(GL_TRIANGLE_STRIP, majorDisplayVtx, 4);
break;
default:
break;
}
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoOutputID[0]);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, this->_displayTexFilter[0]);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, this->_displayTexFilter[0]);
@ -8011,7 +8079,7 @@ void OGLDisplayLayer::RenderOGL()
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, this->_displayTexFilter[1]);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, this->_displayTexFilter[1]);
glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);
break;
}
default:
break;
@ -8029,3 +8097,42 @@ void OGLDisplayLayer::FinishOGL()
glFinishObjectAPPLE(GL_TEXTURE_RECTANGLE_ARB, (isUsingCPUPixelScaler) ? this->_texCPUFilterDstID[0] : ( (this->_isTexVideoInputDataNative[0]) ? this->_texVideoInputDataNativeID[0] : this->_texVideoInputDataCustomID[0]) );
glFinishObjectAPPLE(GL_TEXTURE_RECTANGLE_ARB, (isUsingCPUPixelScaler) ? this->_texCPUFilterDstID[1] : ( (this->_isTexVideoInputDataNative[1]) ? this->_texVideoInputDataNativeID[1] : this->_texVideoInputDataCustomID[1]) );
}
void OGLDisplayLayer::CalculateNormalSize(const ClientDisplayMode mode, const ClientDisplayLayout layout, const double gapScalar, double &outWidth, double &outHeight)
{
if (mode == ClientDisplayMode_Dual)
{
switch (layout)
{
case ClientDisplayLayout_Horizontal:
outWidth = GPU_DISPLAY_WIDTH*2.0;
outHeight = GPU_DISPLAY_HEIGHT;
break;
case ClientDisplayLayout_Hybrid_3_2:
outWidth = (float)GPU_DISPLAY_WIDTH + (128.0);
outHeight = GPU_DISPLAY_HEIGHT;
break;
case ClientDisplayLayout_Hybrid_16_9:
outWidth = (float)GPU_DISPLAY_WIDTH + (64.0 * 4.0 / 3.0);
outHeight = GPU_DISPLAY_HEIGHT;
break;
case ClientDisplayLayout_Hybrid_16_10:
outWidth = (float)GPU_DISPLAY_WIDTH + (51.2);
outHeight = GPU_DISPLAY_HEIGHT;
break;
default: // Default to vertical orientation.
outWidth = GPU_DISPLAY_WIDTH;
outHeight = GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_UNSCALED_GAP*gapScalar);
break;
}
}
else
{
outWidth = GPU_DISPLAY_WIDTH;
outHeight = GPU_DISPLAY_HEIGHT;
}
}

View File

@ -43,7 +43,29 @@
class OGLVideoOutput;
struct NDSFrameInfo;
enum
enum ClientDisplayMode
{
ClientDisplayMode_Main = 0,
ClientDisplayMode_Touch,
ClientDisplayMode_Dual
};
enum ClientDisplayLayout
{
ClientDisplayLayout_Vertical = 0,
ClientDisplayLayout_Horizontal = 1,
ClientDisplayLayout_Hybrid_3_2 = 1000,
ClientDisplayLayout_Hybrid_16_9 = 1001,
ClientDisplayLayout_Hybrid_16_10 = 1002
};
enum ClientDisplayOrder
{
ClientDisplayOrder_MainFirst = 0,
ClientDisplayOrder_TouchFirst
};
enum OutputFilterTypeID
{
OutputFilterTypeID_NearestNeighbor = 0,
OutputFilterTypeID_Bilinear = 1,
@ -251,7 +273,7 @@ public:
void SetSourceDeposterize(bool useDeposterize);
bool CanUseShaderBasedFilters();
void GetNormalSize(double &w, double &h);
void GetNormalSize(double &w, double &h) const;
int GetOutputFilter();
virtual void SetOutputFilterOGL(const int filterID);
@ -411,15 +433,13 @@ protected:
VideoFilter *_vf[2];
GLuint _texCPUFilterDstID[2];
uint16_t _displayWidth;
uint16_t _displayHeight;
int _displayMode;
int _displayOrder;
int _displayOrientation;
ClientDisplayMode _displayMode;
ClientDisplayOrder _displayOrder;
ClientDisplayLayout _displayOrientation;
double _normalWidth;
double _normalHeight;
GLfloat _gapScalar;
GLfloat _rotation;
double _gapScalar;
double _rotation;
GLuint _texLQ2xLUT;
GLuint _texHQ2xLUT;
@ -457,24 +477,21 @@ public:
bool GetFiltersPreferGPU();
void SetFiltersPreferGPUOGL(bool preferGPU);
uint16_t GetDisplayWidth();
uint16_t GetDisplayHeight();
void SetDisplaySize(uint16_t w, uint16_t h);
int GetMode();
void SetMode(int dispMode);
int GetOrientation();
void SetOrientation(int dispOrientation);
int GetOrder();
void SetOrder(int dispOrder);
GLfloat GetGapScalar();
void SetGapScalar(GLfloat theScalar);
GLfloat GetRotation();
void SetRotation(GLfloat theRotation);
ClientDisplayMode GetMode() const;
void SetMode(ClientDisplayMode dispMode);
ClientDisplayLayout GetOrientation() const;
void SetOrientation(ClientDisplayLayout dispOrientation);
ClientDisplayOrder GetOrder() const;
void SetOrder(ClientDisplayOrder dispOrder);
double GetGapScalar() const;
void SetGapScalar(double theScalar);
double GetRotation() const;
void SetRotation(double theRotation);
bool GetSourceDeposterize();
void SetSourceDeposterize(bool useDeposterize);
bool CanUseShaderBasedFilters();
void GetNormalSize(double &w, double &h);
void GetNormalSize(double &w, double &h) const;
int GetOutputFilter();
virtual void SetOutputFilterOGL(const int filterID);
@ -487,6 +504,8 @@ public:
virtual void ProcessOGL();
virtual void RenderOGL();
virtual void FinishOGL();
static void CalculateNormalSize(const ClientDisplayMode mode, const ClientDisplayLayout layout, const double gapScalar, double &outWidth, double &outHeight);
};
class OGLVideoOutput

View File

@ -445,34 +445,12 @@ enum
MESSAGE_COPY_TO_PASTEBOARD
};
/*
DS DISPLAY TYPES
*/
enum
{
DS_DISPLAY_TYPE_MAIN = 0,
DS_DISPLAY_TYPE_TOUCH,
DS_DISPLAY_TYPE_DUAL
};
enum
{
VIDEO_SOURCE_INTERNAL = 0,
VIDEO_SOURCE_EMULATOR = 1
};
enum
{
DS_DISPLAY_ORIENTATION_VERTICAL = 0,
DS_DISPLAY_ORIENTATION_HORIZONTAL
};
enum
{
DS_DISPLAY_ORDER_MAIN_FIRST = 0,
DS_DISPLAY_ORDER_TOUCH_FIRST
};
/*
COCOA DS CORE STATES
*/

View File

@ -108,9 +108,6 @@ typedef struct
- (void) doFinishFrame;
- (void) doDisplayModeChanged:(NSInteger)displayModeID;
@optional
- (void) doDisplaySizeChanged:(NSSize)displaySize;
@end
@protocol CocoaDSDisplayVideoDelegate <CocoaDSDisplayDelegate>
@ -149,8 +146,6 @@ typedef struct
id <CocoaDSDisplayDelegate> delegate;
NSSize displaySize;
NSInteger displayMode;
size_t _gpuCurrentWidth;
size_t _gpuCurrentHeight;
uint32_t _receivedFrameIndex;
uint32_t _currentReceivedFrameIndex;

View File

@ -32,6 +32,8 @@
#include "../../metaspu/metaspu.h"
#include "../../rtc.h"
#include "OGLDisplayOutput.h"
#import <Cocoa/Cocoa.h>
#undef BOOL
@ -520,9 +522,7 @@
spinlockCPULoadAverage = OS_SPINLOCK_INIT;
delegate = nil;
displayMode = DS_DISPLAY_TYPE_DUAL;
_gpuCurrentWidth = GPU_DISPLAY_WIDTH;
_gpuCurrentHeight = GPU_DISPLAY_HEIGHT;
displayMode = ClientDisplayMode_Dual;
_receivedFrameIndex = 0;
_currentReceivedFrameIndex = 0;
@ -547,7 +547,7 @@
- (NSSize) displaySize
{
pthread_rwlock_rdlock(self.rwlockProducer);
NSSize size = NSMakeSize((CGFloat)GPU->GetCustomFramebufferWidth(), (displayMode == DS_DISPLAY_TYPE_DUAL) ? (CGFloat)(GPU->GetCustomFramebufferHeight() * 2): (CGFloat)GPU->GetCustomFramebufferHeight());
NSSize size = NSMakeSize((CGFloat)GPU->GetCustomFramebufferWidth(), (displayMode == ClientDisplayMode_Dual) ? (CGFloat)(GPU->GetCustomFramebufferHeight() * 2): (CGFloat)GPU->GetCustomFramebufferHeight());
pthread_rwlock_unlock(self.rwlockProducer);
return size;
@ -559,15 +559,15 @@
switch (displayModeID)
{
case DS_DISPLAY_TYPE_MAIN:
case ClientDisplayMode_Main:
newDispString = NSSTRING_DISPLAYMODE_MAIN;
break;
case DS_DISPLAY_TYPE_TOUCH:
case ClientDisplayMode_Touch:
newDispString = NSSTRING_DISPLAYMODE_TOUCH;
break;
case DS_DISPLAY_TYPE_DUAL:
case ClientDisplayMode_Dual:
newDispString = NSSTRING_DISPLAYMODE_DUAL;
break;
@ -726,7 +726,7 @@
const NSInteger dispMode = [self displayMode];
NSUInteger w = (NSUInteger)dispInfo.customWidth;
NSUInteger h = (dispMode == DS_DISPLAY_TYPE_DUAL) ? (NSUInteger)(dispInfo.customHeight * 2) : (NSUInteger)dispInfo.customHeight;
NSUInteger h = (dispMode == ClientDisplayMode_Dual) ? (NSUInteger)(dispInfo.customHeight * 2) : (NSUInteger)dispInfo.customHeight;
NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:w
@ -895,20 +895,6 @@
pthread_rwlock_rdlock(self.rwlockProducer);
const NDSDisplayInfo &dispInfo = GPU->GetDisplayInfo();
const uint16_t newGpuWidth = dispInfo.customWidth;
const uint16_t newGpuHeight = dispInfo.customHeight;
if (newGpuWidth != _gpuCurrentWidth || newGpuHeight != _gpuCurrentHeight)
{
if (delegate != nil && [delegate respondsToSelector:@selector(doDisplaySizeChanged:)])
{
[(id<CocoaDSDisplayDelegate>)delegate doDisplaySizeChanged:NSMakeSize(newGpuWidth, newGpuHeight)];
}
_gpuCurrentWidth = newGpuWidth;
_gpuCurrentHeight = newGpuHeight;
}
const bool isMainSizeNative = !dispInfo.didPerformCustomRender[NDSDisplayID_Main];
const bool isTouchSizeNative = !dispInfo.didPerformCustomRender[NDSDisplayID_Touch];

View File

@ -114,7 +114,7 @@ volatile bool execute = true;
SPU_SetVolume(100);
// Set up the DS display
displayMode = DS_DISPLAY_TYPE_DUAL;
displayMode = ClientDisplayMode_Dual;
displayRect = OEIntRectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2);
displayAspectRatio = OEIntSizeMake(2, 3);
@ -153,17 +153,17 @@ volatile bool execute = true;
switch (theMode)
{
case DS_DISPLAY_TYPE_MAIN:
case ClientDisplayMode_Main:
newDisplayRect = OEIntRectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT);
newDisplayAspectRatio = OEIntSizeMake(4, 3);
break;
case DS_DISPLAY_TYPE_TOUCH:
case ClientDisplayMode_Touch:
newDisplayRect = OEIntRectMake(0, GPU_DISPLAY_HEIGHT + 1, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT);
newDisplayAspectRatio = OEIntSizeMake(4, 3);
break;
case DS_DISPLAY_TYPE_DUAL:
case ClientDisplayMode_Dual:
newDisplayRect = OEIntRectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2);
newDisplayAspectRatio = OEIntSizeMake(2, 3);
break;
@ -312,16 +312,16 @@ volatile bool execute = true;
{
switch (displayMode)
{
case DS_DISPLAY_TYPE_MAIN:
[self setDisplayMode:DS_DISPLAY_TYPE_TOUCH];
case ClientDisplayMode_Main:
[self setDisplayMode:ClientDisplayMode_Touch];
break;
case DS_DISPLAY_TYPE_TOUCH:
[self setDisplayMode:DS_DISPLAY_TYPE_DUAL];
case ClientDisplayMode_Touch:
[self setDisplayMode:ClientDisplayMode_Dual];
break;
case DS_DISPLAY_TYPE_DUAL:
[self setDisplayMode:DS_DISPLAY_TYPE_MAIN];
case ClientDisplayMode_Dual:
[self setDisplayMode:ClientDisplayMode_Main];
break;
default:
@ -386,15 +386,15 @@ volatile bool execute = true;
switch (dispMode)
{
case DS_DISPLAY_TYPE_MAIN:
case ClientDisplayMode_Main:
isTouchPressed = NO; // Reject touch input if showing only the main screen.
break;
case DS_DISPLAY_TYPE_TOUCH:
case ClientDisplayMode_Touch:
isTouchPressed = YES;
break;
case DS_DISPLAY_TYPE_DUAL:
case ClientDisplayMode_Dual:
isTouchPressed = YES;
aPoint.y -= GPU_DISPLAY_HEIGHT; // Normalize the y-coordinate to the DS.
break;

View File

@ -1158,6 +1158,33 @@
<reference key="NSMixedImage" ref="678976864"/>
<int key="NSTag">1</int>
</object>
<object class="NSMenuItem" id="495023019">
<reference key="NSMenu" ref="696122360"/>
<string key="NSTitle">Hybrid (3:2)</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="396634170"/>
<reference key="NSMixedImage" ref="678976864"/>
<int key="NSTag">1000</int>
</object>
<object class="NSMenuItem" id="360918133">
<reference key="NSMenu" ref="696122360"/>
<string key="NSTitle">Hybrid (16:9)</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="396634170"/>
<reference key="NSMixedImage" ref="678976864"/>
<int key="NSTag">1001</int>
</object>
<object class="NSMenuItem" id="613673496">
<reference key="NSMenu" ref="696122360"/>
<string key="NSTitle">Hybrid (16:10)</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="396634170"/>
<reference key="NSMixedImage" ref="678976864"/>
<int key="NSTag">1002</int>
</object>
</object>
</object>
</object>
@ -4425,7 +4452,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<reference key="NSNextKeyView" ref="493465383"/>
</object>
</object>
<string key="NSFrame">{{6, 218}, {431, 116}}</string>
<string key="NSFrame">{{6, 238}, {431, 116}}</string>
<reference key="NSSuperview" ref="698863500"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="610612997"/>
@ -4467,13 +4494,13 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<object class="NSMatrix" id="534073839">
<reference key="NSNextResponder" ref="713770080"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 14}, {100, 38}}</string>
<string key="NSFrame">{{18, 14}, {126, 98}}</string>
<reference key="NSSuperview" ref="713770080"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1057767226"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSNumRows">2</int>
<int key="NSNumRows">5</int>
<int key="NSNumCols">1</int>
<object class="NSMutableArray" key="NSCells">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -4599,8 +4626,47 @@ QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA</bytes>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
</object>
<object class="NSButtonCell" id="830803978">
<int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Hybrid (3:2)</string>
<reference key="NSSupport" ref="462791774"/>
<reference key="NSControlView" ref="534073839"/>
<int key="NSTag">1000</int>
<int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">0</int>
<reference key="NSAlternateImage" ref="491083016"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
</object>
<object class="NSButtonCell" id="17957965">
<int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Hybrid (16:9)</string>
<reference key="NSSupport" ref="462791774"/>
<reference key="NSControlView" ref="534073839"/>
<int key="NSTag">1001</int>
<int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">0</int>
<reference key="NSAlternateImage" ref="491083016"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
</object>
<object class="NSButtonCell" id="114580774">
<int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Hybrid (16:10)</string>
<reference key="NSSupport" ref="462791774"/>
<reference key="NSControlView" ref="534073839"/>
<int key="NSTag">1002</int>
<int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">0</int>
<reference key="NSAlternateImage" ref="491083016"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
</object>
</object>
<string key="NSCellSize">{100, 18}</string>
<string key="NSCellSize">{126, 18}</string>
<string key="NSIntercellSpacing">{4, 2}</string>
<int key="NSMatrixFlags">1151868928</int>
<string key="NSCellClass">NSActionCell</string>
@ -4715,13 +4781,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<reference key="NSFont" ref="462791774"/>
</object>
</object>
<string key="NSFrame">{{1, 1}, {194, 62}}</string>
<string key="NSFrame">{{1, 1}, {194, 122}}</string>
<reference key="NSSuperview" ref="405894970"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="534073839"/>
</object>
</object>
<string key="NSFrame">{{15, 53}, {196, 78}}</string>
<string key="NSFrame">{{15, 53}, {196, 138}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="713770080"/>
@ -5005,7 +5071,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<reference key="NSNextKeyView" ref="399471743"/>
</object>
</object>
<string key="NSFrame">{{218, 53}, {196, 78}}</string>
<string key="NSFrame">{{218, 113}, {196, 78}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="533349872"/>
@ -5257,13 +5323,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSTextFieldAlignmentRectInsetsVersion">1</int>
</object>
</object>
<string key="NSFrame">{{1, 1}, {429, 141}}</string>
<string key="NSFrame">{{1, 1}, {429, 201}}</string>
<reference key="NSSuperview" ref="367271593"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="405894970"/>
</object>
</object>
<string key="NSFrame">{{6, 57}, {431, 157}}</string>
<string key="NSFrame">{{6, 17}, {431, 217}}</string>
<reference key="NSSuperview" ref="698863500"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="320484480"/>
@ -6109,7 +6175,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string key="NSClassName">NSView</string>
</object>
<object class="NSCustomView" id="704316683">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -6118,7 +6184,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{163, 329}, {220, 26}}</string>
<reference key="NSSuperview" ref="704316683"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="394747689"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="29269565">
@ -6178,7 +6243,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 335}, {144, 17}}</string>
<reference key="NSSuperview" ref="704316683"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="193380617"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="748093335">
@ -6208,7 +6272,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 12}, {153, 18}}</string>
<reference key="NSSuperview" ref="441129927"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1070621411"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="412966482">
@ -6231,13 +6294,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {364, 38}}</string>
<reference key="NSSuperview" ref="990175597"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="89239259"/>
</object>
</object>
<string key="NSFrame">{{17, 209}, {366, 54}}</string>
<reference key="NSSuperview" ref="704316683"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="441129927"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -6269,7 +6330,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 15}, {180, 46}}</string>
<reference key="NSSuperview" ref="611125211"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="329183370"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
@ -6518,7 +6578,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{145, 10}, {204, 26}}</string>
<reference key="NSSuperview" ref="611125211"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="289234889">
<int key="NSCellFlags">-2076180416</int>
@ -6586,13 +6645,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {364, 71}}</string>
<reference key="NSSuperview" ref="379003821"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="996962843"/>
</object>
</object>
<string key="NSFrame">{{17, 16}, {366, 87}}</string>
<reference key="NSSuperview" ref="704316683"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="611125211"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -6624,7 +6681,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 14}, {328, 58}}</string>
<reference key="NSSuperview" ref="244021145"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="379003821"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
@ -6884,13 +6940,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {364, 82}}</string>
<reference key="NSSuperview" ref="1070621411"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="945502088"/>
</object>
</object>
<string key="NSFrame">{{17, 107}, {366, 98}}</string>
<reference key="NSSuperview" ref="704316683"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="244021145"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -6922,7 +6976,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{40, 13}, {246, 21}}</string>
<reference key="NSSuperview" ref="539280335"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="990570759"/>
<bool key="NSEnabled">YES</bool>
<object class="NSSliderCell" key="NSCell" id="577080553">
@ -6946,7 +6999,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{287, 17}, {62, 17}}</string>
<reference key="NSSuperview" ref="539280335"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="990175597"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="871591132">
@ -7047,7 +7099,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{18, 16}, {16, 16}}</string>
<reference key="NSSuperview" ref="539280335"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="682389865"/>
<bool key="NSEnabled">YES</bool>
<object class="NSImageCell" key="NSCell" id="206851430">
@ -7068,13 +7119,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {364, 44}}</string>
<reference key="NSSuperview" ref="394747689"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="983879008"/>
</object>
</object>
<string key="NSFrame">{{17, 267}, {366, 60}}</string>
<reference key="NSSuperview" ref="704316683"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="539280335"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -7093,13 +7142,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
</object>
<string key="NSFrameSize">{400, 373}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="913591955"/>
<string key="NSClassName">NSView</string>
</object>
<object class="NSCustomView" id="748902585">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -7115,7 +7162,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{13, 10}, {528, 441}}</string>
<reference key="NSSuperview" ref="748902585"/>
<reference key="NSWindow"/>
<object class="NSMutableArray" key="NSTabViewItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTabViewItem" id="1008833987">
@ -7140,7 +7186,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 32}, {198, 18}}</string>
<reference key="NSSuperview" ref="330186328"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="689857730"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="152711854">
@ -7165,7 +7210,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 12}, {217, 18}}</string>
<reference key="NSSuperview" ref="330186328"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1034534989"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="683227590">
@ -7188,13 +7232,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {494, 58}}</string>
<reference key="NSSuperview" ref="699930286"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="621197304"/>
</object>
</object>
<string key="NSFrame">{{6, 301}, {496, 74}}</string>
<reference key="NSSuperview" ref="461624007"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="330186328"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -7226,7 +7268,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 14}, {165, 38}}</string>
<reference key="NSSuperview" ref="16233"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="923192764"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
@ -7474,7 +7515,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{242, 15}, {73, 17}}</string>
<reference key="NSSuperview" ref="16233"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="156454980"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="206408938">
@ -7494,7 +7534,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{320, 13}, {50, 22}}</string>
<reference key="NSSuperview" ref="16233"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="636878832"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1033938841">
@ -7573,7 +7612,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{371, 10}, {19, 27}}</string>
<reference key="NSSuperview" ref="16233"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="704971554"/>
<bool key="NSEnabled">YES</bool>
<object class="NSStepperCell" key="NSCell" id="401365162">
@ -7592,13 +7630,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {494, 62}}</string>
<reference key="NSSuperview" ref="1034534989"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1002748640"/>
</object>
</object>
<string key="NSFrame">{{6, 219}, {496, 78}}</string>
<reference key="NSSuperview" ref="461624007"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="16233"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -7630,7 +7666,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{337, 17}, {141, 18}}</string>
<reference key="NSSuperview" ref="987276464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="808054783"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
@ -7657,7 +7692,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 14}, {66, 17}}</string>
<reference key="NSSuperview" ref="987276464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="239207266"/>
<string key="NSReuseIdentifierKey">_NS:526</string>
<string key="NSHuggingPriority">{251, 750}</string>
@ -7680,7 +7714,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{86, 12}, {176, 26}}</string>
<reference key="NSSuperview" ref="987276464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="642300079"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
@ -7706,7 +7739,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{266, 14}, {52, 17}}</string>
<reference key="NSSuperview" ref="987276464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="773356702"/>
<string key="NSReuseIdentifierKey">_NS:526</string>
<string key="NSHuggingPriority">{251, 750}</string>
@ -7781,7 +7813,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{83, 36}, {26, 14}}</string>
<reference key="NSSuperview" ref="987276464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="943830921"/>
<string key="NSReuseIdentifierKey">_NS:526</string>
<string key="NSHuggingPriority">{251, 750}</string>
@ -7804,7 +7835,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{161, 36}, {26, 14}}</string>
<reference key="NSSuperview" ref="987276464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="636105289"/>
<string key="NSReuseIdentifierKey">_NS:526</string>
<string key="NSHuggingPriority">{251, 750}</string>
@ -7827,7 +7857,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{236, 36}, {31, 14}}</string>
<reference key="NSSuperview" ref="987276464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="90098197"/>
<string key="NSReuseIdentifierKey">_NS:526</string>
<string key="NSHuggingPriority">{251, 750}</string>
@ -7848,14 +7877,12 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {494, 60}}</string>
<reference key="NSSuperview" ref="704971554"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="765549650"/>
<string key="NSReuseIdentifierKey">_NS:11</string>
</object>
</object>
<string key="NSFrame">{{6, 139}, {496, 76}}</string>
<reference key="NSSuperview" ref="461624007"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="987276464"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<string key="NSOffsets">{0, 0}</string>
@ -7888,7 +7915,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 12}, {462, 18}}</string>
<reference key="NSSuperview" ref="675831467"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="337932383"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="830122320">
@ -7911,13 +7937,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {494, 38}}</string>
<reference key="NSSuperview" ref="808054783"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="361866954"/>
</object>
</object>
<string key="NSFrame">{{6, 81}, {496, 54}}</string>
<reference key="NSSuperview" ref="461624007"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="675831467"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -7949,7 +7973,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 32}, {146, 18}}</string>
<reference key="NSSuperview" ref="808083999"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="743074144"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="340220192">
@ -7974,7 +7997,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 12}, {118, 18}}</string>
<reference key="NSSuperview" ref="808083999"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="16571944">
<int key="NSCellFlags">67108864</int>
@ -7996,13 +8018,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {494, 58}}</string>
<reference key="NSSuperview" ref="337932383"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="396299062"/>
</object>
</object>
<string key="NSFrame">{{6, 3}, {496, 74}}</string>
<reference key="NSSuperview" ref="461624007"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="808083999"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -8022,7 +8042,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{10, 33}, {508, 395}}</string>
<reference key="NSSuperview" ref="626099"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="699930286"/>
</object>
<string key="NSLabel">General Settings</string>
@ -9369,8 +9388,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
</object>
<string key="NSFrameSize">{554, 465}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="626099"/>
<string key="NSClassName">NSView</string>
</object>
@ -22506,7 +22523,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<nil key="NSUserInterfaceItemIdentifier"/>
<string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
<object class="NSView" key="NSWindowView" id="729561310">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -22525,7 +22542,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 109}, {206, 18}}</string>
<reference key="NSSuperview" ref="372893695"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="59471532"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="715693022">
@ -22550,7 +22566,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{185, 39}, {45, 19}}</string>
<reference key="NSSuperview" ref="372893695"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="621607539"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="424545719">
@ -22635,7 +22650,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 41}, {165, 14}}</string>
<reference key="NSSuperview" ref="372893695"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="914518661"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="714807735">
@ -22655,7 +22669,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 15}, {109, 14}}</string>
<reference key="NSSuperview" ref="372893695"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="409790934"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="212555065">
@ -22675,7 +22688,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{231, 34}, {19, 27}}</string>
<reference key="NSSuperview" ref="372893695"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="36681890"/>
<bool key="NSEnabled">YES</bool>
<object class="NSStepperCell" key="NSCell" id="538492838">
@ -22694,7 +22706,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 89}, {115, 18}}</string>
<reference key="NSSuperview" ref="372893695"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1021934313"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="394241287">
@ -22719,7 +22730,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 69}, {195, 18}}</string>
<reference key="NSSuperview" ref="372893695"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="85361012"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="473306767">
@ -22744,7 +22754,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{126, 10}, {124, 22}}</string>
<reference key="NSSuperview" ref="372893695"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="226041199"/>
<string key="NSReuseIdentifierKey">_NS:791</string>
<bool key="NSEnabled">YES</bool>
@ -22856,13 +22865,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {265, 134}}</string>
<reference key="NSSuperview" ref="219189503"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="743170152"/>
</object>
</object>
<string key="NSFrame">{{17, 107}, {267, 150}}</string>
<reference key="NSSuperview" ref="729561310"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="372893695"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -22884,7 +22891,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{69, 7}, {162, 19}}</string>
<reference key="NSSuperview" ref="729561310"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="837427736">
<int key="NSCellFlags">-2080374784</int>
@ -22916,7 +22922,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 14}, {107, 58}}</string>
<reference key="NSSuperview" ref="909175549"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="353783913"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
@ -23176,13 +23181,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {265, 82}}</string>
<reference key="NSSuperview" ref="299127137"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="229881229"/>
</object>
</object>
<string key="NSFrame">{{17, 425}, {267, 98}}</string>
<reference key="NSSuperview" ref="729561310"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="909175549"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -23214,7 +23217,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 52}, {108, 18}}</string>
<reference key="NSSuperview" ref="887816052"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="352871217"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="109440671">
@ -23239,7 +23241,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 32}, {135, 18}}</string>
<reference key="NSSuperview" ref="887816052"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="606253351"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="874032897">
@ -23264,7 +23265,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 12}, {82, 18}}</string>
<reference key="NSSuperview" ref="887816052"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="219189503"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="67001337">
@ -23289,7 +23289,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 119}, {112, 14}}</string>
<reference key="NSSuperview" ref="887816052"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="759859011"/>
<string key="NSReuseIdentifierKey">_NS:526</string>
<string key="NSHuggingPriority">{251, 750}</string>
@ -23312,7 +23311,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{134, 117}, {48, 19}}</string>
<reference key="NSSuperview" ref="887816052"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1038713956"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
@ -23391,7 +23389,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{187, 113}, {19, 27}}</string>
<reference key="NSSuperview" ref="887816052"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="357545381"/>
<string key="NSReuseIdentifierKey">_NS:1592</string>
<bool key="NSEnabled">YES</bool>
@ -23412,7 +23409,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 72}, {137, 18}}</string>
<reference key="NSSuperview" ref="887816052"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="120043682">
<int key="NSCellFlags">67108864</int>
@ -23436,7 +23432,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 96}, {127, 14}}</string>
<reference key="NSSuperview" ref="887816052"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="675964218">
<int key="NSCellFlags">68157504</int>
@ -23455,7 +23450,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{187, 89}, {19, 27}}</string>
<reference key="NSSuperview" ref="887816052"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSStepperCell" key="NSCell" id="940124700">
<int key="NSCellFlags">67895328</int>
@ -23475,7 +23469,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{161, 96}, {19, 14}}</string>
<reference key="NSSuperview" ref="887816052"/>
<reference key="NSWindow"/>
<string key="NSReuseIdentifierKey">_NS:4068</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1027435588">
@ -23548,13 +23541,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {265, 144}}</string>
<reference key="NSSuperview" ref="353783913"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="909638648"/>
</object>
</object>
<string key="NSFrame">{{17, 261}, {267, 160}}</string>
<reference key="NSSuperview" ref="729561310"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="887816052"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -23586,7 +23577,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 32}, {192, 18}}</string>
<reference key="NSSuperview" ref="633221410"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="412885015"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="477056413">
@ -23611,7 +23601,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 12}, {114, 18}}</string>
<reference key="NSSuperview" ref="633221410"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="474989169">
<int key="NSCellFlags">67108864</int>
@ -23633,13 +23622,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<string key="NSFrame">{{1, 1}, {265, 58}}</string>
<reference key="NSSuperview" ref="226041199"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="846174836"/>
</object>
</object>
<string key="NSFrame">{{17, 29}, {267, 74}}</string>
<reference key="NSSuperview" ref="729561310"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="633221410"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
@ -23658,8 +23645,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
</object>
<string key="NSFrameSize">{301, 543}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="299127137"/>
</object>
<string key="NSScreenRect">{{0, 0}, {1920, 1177}}</string>
@ -43318,6 +43303,30 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<int key="connectionID">10250</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">changeDisplayOrientation:</string>
<reference key="source" ref="1014"/>
<reference key="destination" ref="495023019"/>
</object>
<int key="connectionID">10254</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">changeDisplayOrientation:</string>
<reference key="source" ref="1014"/>
<reference key="destination" ref="360918133"/>
</object>
<int key="connectionID">10255</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">changeDisplayOrientation:</string>
<reference key="source" ref="1014"/>
<reference key="destination" ref="613673496"/>
</object>
<int key="connectionID">10257</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@ -48894,6 +48903,9 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="172785222"/>
<reference ref="593656559"/>
<reference ref="495023019"/>
<reference ref="360918133"/>
<reference ref="613673496"/>
</object>
<reference key="parent" ref="993127302"/>
</object>
@ -49006,6 +49018,9 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<reference ref="221667571"/>
<reference ref="863837355"/>
<reference ref="777091208"/>
<reference ref="830803978"/>
<reference ref="17957965"/>
<reference ref="114580774"/>
</object>
<reference key="parent" ref="405894970"/>
</object>
@ -58625,6 +58640,36 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<reference key="object" ref="919334514"/>
<reference key="parent" ref="1027435588"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10251</int>
<reference key="object" ref="495023019"/>
<reference key="parent" ref="696122360"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10252</int>
<reference key="object" ref="360918133"/>
<reference key="parent" ref="696122360"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10253</int>
<reference key="object" ref="613673496"/>
<reference key="parent" ref="696122360"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10258</int>
<reference key="object" ref="830803978"/>
<reference key="parent" ref="534073839"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10259</int>
<reference key="object" ref="17957965"/>
<reference key="parent" ref="534073839"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10260</int>
<reference key="object" ref="114580774"/>
<reference key="parent" ref="534073839"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@ -58813,6 +58858,12 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>10247.IBPluginDependency</string>
<string>10247.IBViewBoundsToFrameTransform</string>
<string>10248.IBPluginDependency</string>
<string>10251.IBPluginDependency</string>
<string>10252.IBPluginDependency</string>
<string>10253.IBPluginDependency</string>
<string>10258.IBAttributePlaceholdersKey</string>
<string>10259.IBAttributePlaceholdersKey</string>
<string>10260.IBAttributePlaceholdersKey</string>
<string>1034.IBPluginDependency</string>
<string>1035.IBPluginDependency</string>
<string>1036.IBPluginDependency</string>
@ -59833,9 +59884,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>6161.IBPluginDependency</string>
<string>6162.IBPluginDependency</string>
<string>6168.IBPluginDependency</string>
<string>6169.IBEditorWindowLastContentRect</string>
<string>6169.IBPluginDependency</string>
<string>6170.IBPluginDependency</string>
<string>6171.IBPluginDependency</string>
<string>6172.IBEditorWindowLastContentRect</string>
<string>6172.IBPluginDependency</string>
<string>6173.IBPluginDependency</string>
<string>6174.IBPluginDependency</string>
@ -60258,6 +60311,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>7766.IBPluginDependency</string>
<string>7767.IBPluginDependency</string>
<string>7771.IBPluginDependency</string>
<string>7772.IBEditorWindowLastContentRect</string>
<string>7772.IBPluginDependency</string>
<string>7773.IBPluginDependency</string>
<string>7774.IBPluginDependency</string>
@ -60309,6 +60363,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>7837.IBPluginDependency</string>
<string>7838.IBPluginDependency</string>
<string>7839.IBPluginDependency</string>
<string>784.IBEditorWindowLastContentRect</string>
<string>784.IBPluginDependency</string>
<string>7840.IBNumberFormatterBehaviorMetadataKey</string>
<string>7840.IBNumberFormatterLocalizesFormatMetadataKey</string>
@ -60348,6 +60403,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>7875.IBPluginDependency</string>
<string>7876.IBPluginDependency</string>
<string>7879.IBPluginDependency</string>
<string>788.IBEditorWindowLastContentRect</string>
<string>788.IBPluginDependency</string>
<string>7880.IBPluginDependency</string>
<string>7881.IBPluginDependency</string>
@ -61476,6 +61532,33 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSMutableDictionary">
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="830803978"/>
<string key="toolTip">By default, arranges the NDS screens where the top and bottom screens are displayed on the right side, along with a larger major screen on the left side. This display orientation does not use the display separation setting. It is best suited for users who want a balanced size ratio between the minor screens and the major screen.</string>
</object>
</object>
<object class="NSMutableDictionary">
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="17957965"/>
<string key="toolTip">By default, arranges the NDS screens where the top and bottom screens are displayed on the right side, along with a larger major screen on the left side. This display orientation uses the display separation setting. It is best suited for host displays running a 16:9 resolution.</string>
</object>
</object>
<object class="NSMutableDictionary">
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="114580774"/>
<string key="toolTip">By default, arranges the NDS screens where the top and bottom screens are displayed on the right side, along with a larger major screen on the left side. This display orientation uses the display separation setting. It is best suited for host displays running a 16:10 resolution.</string>
</object>
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -61564,7 +61647,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{310, 296}, {489, 437}}</string>
<string>{{585, 358}, {489, 437}}</string>
<string>{796.5, 896.5}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSMutableDictionary">
@ -61968,14 +62051,14 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{616, 836}, {512, 20}}</string>
<string>{{411, 836}, {512, 20}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{288, 552}, {315, 473}}</string>
<string>{{685, 363}, {315, 473}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -62446,7 +62529,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{603, 962}, {132, 63}}</string>
<string>{{1000, 773}, {132, 63}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -63191,9 +63274,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{1000, 673}, {151, 103}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{1000, 713}, {178, 43}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -63207,7 +63292,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="674773171"/>
<string key="toolTip">If the display orientation is vertical, the main screen will be arranged above the touch screen by default. If the display layout is horizontal, the main screen will be arranged left of the touch screen by default.</string>
<string key="toolTip">If the display orientation is Vertical, then the main screen will be arranged above the touch screen by default. If the display orientation is Horizontal, then the main screen will be arranged left of the touch screen by default. If the display orientation is Hybrid, then the main screen will be the major display by default.</string>
</object>
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -63216,7 +63301,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="1042209853"/>
<string key="toolTip">If the display orientation is vertical, the touch screen will be arranged above the main screen by default. If the display layout is horizontal, the touch screen will be arranged left of the main screen by default.</string>
<string key="toolTip">If the display orientation is Vertical, then the touch screen will be arranged above the main screen by default. If the display orientation is Horizontal, then the touch screen will be arranged left of the main screen by default. If the display orientation is Hybrid, then the touch screen will be the major display by default.</string>
</object>
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -63228,7 +63313,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="863837355"/>
<string key="toolTip">Arranges the NDS screens where one screen is to the left of the other screen by default.</string>
<string key="toolTip">By default, arranges the NDS screens where one screen is to the left of the other screen. This display orientation does not use the display separation setting.</string>
</object>
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -63237,7 +63322,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="777091208"/>
<string key="toolTip">Arranges the NDS screens where one screen is above the other screen by default.</string>
<string key="toolTip">By default, arranges the NDS screens where one screen is above the other screen, just like a hardware NDS. This display orientation uses the display separation setting.</string>
</object>
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -63771,6 +63856,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{1000, 603}, {118, 133}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -63836,6 +63922,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{1000, 633}, {136, 163}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1040"/>
<boolean value="YES"/>
@ -63917,6 +64004,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{1000, 713}, {70, 103}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -64935,7 +65023,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">10250</int>
<int key="maxID">10260</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">

View File

@ -18,6 +18,7 @@
#import <Cocoa/Cocoa.h>
#import <OpenGL/OpenGL.h>
#include <libkern/OSAtomic.h>
#include <map>
#import "InputManager.h"
#import "cocoa_output.h"
@ -26,6 +27,7 @@
@class EmuControllerDelegate;
class OGLVideoOutput;
typedef std::map<int, bool> InitialTouchPressMap; // Key = An ID number of the host input, Value = Flag that indicates if the initial touch press was in the major display
// Subclass NSWindow for full screen windows so that we can override some methods.
@interface DisplayFullScreenWindow : NSWindow
@ -35,8 +37,8 @@ class OGLVideoOutput;
@interface DisplayView : NSView <CocoaDSDisplayVideoDelegate, InputHIDManagerTarget>
{
InputManager *inputManager;
InitialTouchPressMap *_initialTouchInMajorDisplay;
OGLVideoOutput *oglv;
CGFloat _displayRotation;
BOOL canUseShaderBasedFilters;
BOOL _useVerticalSync;
@ -54,6 +56,7 @@ class OGLVideoOutput;
}
@property (retain) InputManager *inputManager;
@property (readonly) NSSize normalSize;
@property (readonly) BOOL canUseShaderBasedFilters;
@property (assign) BOOL isHUDVisible;
@property (assign) BOOL isHUDVideoFPSVisible;
@ -70,12 +73,14 @@ class OGLVideoOutput;
- (void) setScaleFactor:(float)theScaleFactor;
- (void) drawVideoFrame;
- (NSPoint) dsPointFromEvent:(NSEvent *)theEvent;
- (NSPoint) convertPointToDS:(NSPoint)clickLoc;
- (NSPoint) dsPointFromEvent:(NSEvent *)theEvent inputID:(const NSInteger)inputID;
- (NSPoint) convertPointToDS:(NSPoint)clickLoc inputID:(const NSInteger)inputID initialTouchPress:(BOOL)isInitialTouchPress;
- (BOOL) handleKeyPress:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed;
- (BOOL) handleMouseButton:(NSEvent *)theEvent buttonPressed:(BOOL)buttonPressed;
- (void) requestScreenshot:(NSURL *)fileURL fileType:(NSBitmapImageFileType)fileType;
+ (NSSize) calculateNormalSizeUsingMode:(const NSInteger)mode layout:(const NSInteger)layout gapScalar:(const double)gapScalar;
@end
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5

View File

@ -107,8 +107,8 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
// These need to be initialized first since there are dependencies on these.
_displayGap = 0.0;
_displayMode = DS_DISPLAY_TYPE_DUAL;
_displayOrientation = DS_DISPLAY_ORIENTATION_VERTICAL;
_displayMode = ClientDisplayMode_Dual;
_displayOrientation = ClientDisplayLayout_Vertical;
_minDisplayViewSize = NSMakeSize(GPU_DISPLAY_WIDTH, (GPU_DISPLAY_HEIGHT*2.0) + (DS_DISPLAY_UNSCALED_GAP*_displayGap));
_isMinSizeNormal = YES;
@ -202,7 +202,8 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
// Resize the window.
const NSSize oldBounds = [theWindow frame].size;
const double constrainedScale = [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:newAngleDegrees];
const NSSize newNormalSize = [DisplayView calculateNormalSizeUsingMode:[self displayMode] layout:[self displayOrientation] gapScalar:[self displayGap]];
const double constrainedScale = [self resizeWithTransform:newNormalSize scalar:[self displayScale] rotation:newAngleDegrees];
const NSSize newBounds = [theWindow frame].size;
OSSpinLockLock(&spinlockScale);
@ -243,15 +244,15 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
switch (displayModeID)
{
case DS_DISPLAY_TYPE_MAIN:
case ClientDisplayMode_Main:
modeString = NSSTRING_DISPLAYMODE_MAIN;
break;
case DS_DISPLAY_TYPE_TOUCH:
case ClientDisplayMode_Touch:
modeString = NSSTRING_DISPLAYMODE_TOUCH;
break;
case DS_DISPLAY_TYPE_DUAL:
case ClientDisplayMode_Dual:
modeString = NSSTRING_DISPLAYMODE_DUAL;
break;
@ -263,8 +264,9 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
_displayMode = displayModeID;
OSSpinLockUnlock(&spinlockDisplayMode);
const NSSize newNormalSize = [DisplayView calculateNormalSizeUsingMode:[self displayMode] layout:[self displayOrientation] gapScalar:[self displayGap]];
[self setIsMinSizeNormal:[self isMinSizeNormal]];
[self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]];
[self resizeWithTransform:newNormalSize scalar:[self displayScale] rotation:[self displayRotation]];
[CocoaDSUtil messageSendOneWayWithInteger:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_TYPE integerValue:displayModeID];
}
@ -284,10 +286,11 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
_displayOrientation = theOrientation;
OSSpinLockUnlock(&spinlockDisplayOrientation);
if ([self displayMode] == DS_DISPLAY_TYPE_DUAL)
if ([self displayMode] == ClientDisplayMode_Dual)
{
const NSSize newNormalSize = [DisplayView calculateNormalSizeUsingMode:[self displayMode] layout:[self displayOrientation] gapScalar:[self displayGap]];
[self setIsMinSizeNormal:[self isMinSizeNormal]];
[self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]];
[self resizeWithTransform:newNormalSize scalar:[self displayScale] rotation:[self displayRotation]];
}
[CocoaDSUtil messageSendOneWayWithInteger:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_ORIENTATION integerValue:theOrientation];
@ -326,10 +329,11 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
_displayGap = gapScalar;
OSSpinLockUnlock(&spinlockDisplayGap);
if ([self displayMode] == DS_DISPLAY_TYPE_DUAL)
if ([self displayMode] == ClientDisplayMode_Dual)
{
const NSSize newNormalSize = [DisplayView calculateNormalSizeUsingMode:[self displayMode] layout:[self displayOrientation] gapScalar:[self displayGap]];
[self setIsMinSizeNormal:[self isMinSizeNormal]];
[self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]];
[self resizeWithTransform:newNormalSize scalar:[self displayScale] rotation:[self displayRotation]];
}
[CocoaDSUtil messageSendOneWayWithFloat:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_GAP floatValue:(float)gapScalar];
@ -390,30 +394,8 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
- (void) setIsMinSizeNormal:(BOOL)theState
{
OSSpinLockLock(&spinlockDisplayGap);
const double gapScalar = _displayGap;
OSSpinLockUnlock(&spinlockDisplayGap);
_isMinSizeNormal = theState;
if ([self displayMode] == DS_DISPLAY_TYPE_DUAL)
{
if ([self displayOrientation] == DS_DISPLAY_ORIENTATION_HORIZONTAL)
{
_minDisplayViewSize.width = GPU_DISPLAY_WIDTH*2.0 + (DS_DISPLAY_UNSCALED_GAP*gapScalar);
_minDisplayViewSize.height = GPU_DISPLAY_HEIGHT;
}
else
{
_minDisplayViewSize.width = GPU_DISPLAY_WIDTH;
_minDisplayViewSize.height = GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_UNSCALED_GAP*gapScalar);
}
}
else
{
_minDisplayViewSize.width = GPU_DISPLAY_WIDTH;
_minDisplayViewSize.height = GPU_DISPLAY_HEIGHT;
}
_minDisplayViewSize = [DisplayView calculateNormalSizeUsingMode:[self displayMode] layout:[self displayOrientation] gapScalar:[self displayGap]];
if (!_isMinSizeNormal)
{
@ -505,21 +487,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
- (NSSize) normalSize
{
NSSize normalSize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT);
if ([self displayMode] == DS_DISPLAY_TYPE_DUAL)
{
if ([self displayOrientation] == DS_DISPLAY_ORIENTATION_VERTICAL)
{
normalSize.height = GPU_DISPLAY_HEIGHT * 2.0 + (DS_DISPLAY_UNSCALED_GAP * _displayGap);
}
else
{
normalSize.width = GPU_DISPLAY_WIDTH * 2.0 + (DS_DISPLAY_UNSCALED_GAP * _displayGap);
}
}
return normalSize;
return [[self view] normalSize];
}
- (BOOL) masterStatusBarState
@ -965,7 +933,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
- (IBAction) toggleNDSDisplays:(id)sender
{
[self setDisplayOrder:([self displayOrder] == DS_DISPLAY_ORDER_MAIN_FIRST) ? DS_DISPLAY_ORDER_TOUCH_FIRST : DS_DISPLAY_ORDER_MAIN_FIRST];
[self setDisplayOrder:([self displayOrder] == ClientDisplayOrder_MainFirst) ? ClientDisplayOrder_TouchFirst : ClientDisplayOrder_MainFirst];
}
- (IBAction) writeDefaultsDisplayRotation:(id)sender
@ -1597,6 +1565,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
#endif
inputManager = nil;
_initialTouchInMajorDisplay = new InitialTouchPressMap;
// Initialize the OpenGL context
NSOpenGLPixelFormatAttribute attributes[] = {
@ -1670,6 +1639,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
delete oglv;
CGLSetCurrentContext(prevContext);
delete _initialTouchInMajorDisplay;
[self setInputManager:nil];
[context clearDrawable];
[context release];
@ -1679,6 +1649,16 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
#pragma mark Dynamic Property Methods
- (NSSize) normalSize
{
double w;
double h;
oglv->GetDisplayLayer()->GetNormalSize(w, h);
return NSMakeSize(w, h);
}
- (void) setIsHUDVisible:(BOOL)theState
{
OSSpinLockLock(&spinlockIsHUDVisible);
@ -1955,18 +1935,21 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
CGLFlushDrawable(cglDisplayContext);
}
- (NSPoint) dsPointFromEvent:(NSEvent *)theEvent
- (NSPoint) dsPointFromEvent:(NSEvent *)theEvent inputID:(const NSInteger)inputID
{
const NSEventType eventType = [theEvent type];
const BOOL isInitialMouseDown = (eventType == NSLeftMouseDown) || (eventType == NSRightMouseDown) || (eventType == NSOtherMouseDown);
// Convert the clicked location from window coordinates, to view coordinates,
// and finally to DS touchscreen coordinates.
NSPoint touchLoc = [theEvent locationInWindow];
touchLoc = [self convertPoint:touchLoc fromView:nil];
touchLoc = [self convertPointToDS:touchLoc];
touchLoc = [self convertPointToDS:touchLoc inputID:inputID initialTouchPress:isInitialMouseDown];
return touchLoc;
}
- (NSPoint) convertPointToDS:(NSPoint)clickLoc
- (NSPoint) convertPointToDS:(NSPoint)clickLoc inputID:(const NSInteger)inputID initialTouchPress:(BOOL)isInitialTouchPress
{
DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate];
@ -1978,7 +1961,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
const NSSize normalBounds = [windowController normalSize];
const NSSize viewSize = [self bounds].size;
const CGSize transformBounds = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, _displayRotation);
const CGSize transformBounds = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, oglv->GetDisplayLayer()->GetRotation());
const double s = GetMaxScalarInBounds(transformBounds.width, transformBounds.height, viewSize.width, viewSize.height);
CGPoint touchLoc = GetNormalPointFromTransformedPoint(clickLoc.x, clickLoc.y,
@ -1988,19 +1971,51 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
viewAngle);
// Normalize the touch location to the DS.
if ([windowController displayMode] == DS_DISPLAY_TYPE_DUAL)
if ([windowController displayMode] == ClientDisplayMode_Dual)
{
const NSInteger theOrientation = [windowController displayOrientation];
const NSInteger theOrder = [windowController displayOrder];
const double gap = DS_DISPLAY_UNSCALED_GAP * [windowController displayGap];
const ClientDisplayLayout theOrientation = (ClientDisplayLayout)[windowController displayOrientation];
const ClientDisplayOrder theOrder = (ClientDisplayOrder)[windowController displayOrder];
if (theOrientation == DS_DISPLAY_ORIENTATION_VERTICAL && theOrder == DS_DISPLAY_ORDER_TOUCH_FIRST)
switch (theOrientation)
{
touchLoc.y -= (GPU_DISPLAY_HEIGHT+gap);
}
else if (theOrientation == DS_DISPLAY_ORIENTATION_HORIZONTAL && theOrder == DS_DISPLAY_ORDER_MAIN_FIRST)
{
touchLoc.x -= (GPU_DISPLAY_WIDTH+gap);
case ClientDisplayLayout_Horizontal:
{
if (theOrder == ClientDisplayOrder_MainFirst)
{
touchLoc.x -= GPU_DISPLAY_WIDTH;
}
break;
}
case ClientDisplayLayout_Hybrid_3_2:
case ClientDisplayLayout_Hybrid_16_9:
case ClientDisplayLayout_Hybrid_16_10:
{
if (isInitialTouchPress)
{
const bool isClickWithinMajorDisplay = (theOrder == ClientDisplayOrder_TouchFirst) && (touchLoc.x >= 0.0) && (touchLoc.x < 256.0);
(*_initialTouchInMajorDisplay)[(int)inputID] = isClickWithinMajorDisplay;
}
const bool handleClickInMajorDisplay = (*_initialTouchInMajorDisplay)[(int)inputID];
if (!handleClickInMajorDisplay)
{
const double minorDisplayScale = (normalBounds.width - (GLfloat)GPU_DISPLAY_WIDTH) / (GLfloat)GPU_DISPLAY_WIDTH;
touchLoc.x = (touchLoc.x - GPU_DISPLAY_WIDTH) / minorDisplayScale;
touchLoc.y = touchLoc.y / minorDisplayScale;
}
break;
}
default: // Default to vertical orientation.
{
if (theOrder == ClientDisplayOrder_TouchFirst)
{
const double gap = DS_DISPLAY_UNSCALED_GAP * [windowController displayGap];
touchLoc.y -= (GPU_DISPLAY_HEIGHT+gap);
}
break;
}
}
}
@ -2097,12 +2112,13 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
// Convert the clicked location from window coordinates, to view coordinates,
// and finally to DS touchscreen coordinates.
const NSPoint touchLoc = (displayModeID == DS_DISPLAY_TYPE_MAIN) ? NSMakePoint(0.0, 0.0) : [self dsPointFromEvent:theEvent];
const InputAttributes inputAttr = InputManagerEncodeMouseButtonInput([theEvent buttonNumber], touchLoc, buttonPressed);
const NSInteger buttonNumber = [theEvent buttonNumber];
const NSPoint touchLoc = (displayModeID == ClientDisplayMode_Main) ? NSMakePoint(0.0, 0.0) : [self dsPointFromEvent:theEvent inputID:buttonNumber];
const InputAttributes inputAttr = InputManagerEncodeMouseButtonInput(buttonNumber, touchLoc, buttonPressed);
if (buttonPressed && [theEvent window] != nil)
{
NSString *newStatusText = (displayModeID == DS_DISPLAY_TYPE_MAIN) ? [NSString stringWithFormat:@"%s:%s", inputAttr.deviceName, inputAttr.elementName] : [NSString stringWithFormat:@"%s:%s X:%i Y:%i", inputAttr.deviceName, inputAttr.elementName, (int)inputAttr.intCoordX, (int)inputAttr.intCoordY];
NSString *newStatusText = (displayModeID == ClientDisplayMode_Main) ? [NSString stringWithFormat:@"%s:%s", inputAttr.deviceName, inputAttr.elementName] : [NSString stringWithFormat:@"%s:%s X:%i Y:%i", inputAttr.deviceName, inputAttr.elementName, (int)inputAttr.intCoordX, (int)inputAttr.intCoordY];
[[windowController emuControl] setStatusText:newStatusText];
}
@ -2369,9 +2385,7 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
}
- (void)doTransformView:(const DisplayOutputTransformData *)transformData
{
_displayRotation = (GLfloat)transformData->rotation;
{
OGLDisplayLayer *display = oglv->GetDisplayLayer();
display->SetRotation((GLfloat)transformData->rotation);
[self doRedraw];
@ -2385,26 +2399,19 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
CGLUnlockContext(cglDisplayContext);
}
- (void)doDisplaySizeChanged:(NSSize)displaySize
{
OGLDisplayLayer *display = oglv->GetDisplayLayer();
display->SetDisplaySize((uint16_t)displaySize.width, (uint16_t)displaySize.height);
[self doRedraw];
}
- (void)doDisplayModeChanged:(NSInteger)displayModeID
{
OGLDisplayLayer *display = oglv->GetDisplayLayer();
display->SetMode(displayModeID);
display->SetMode((ClientDisplayMode)displayModeID);
[self doRedraw];
}
- (void)doDisplayOrientationChanged:(NSInteger)displayOrientationID
{
OGLDisplayLayer *display = oglv->GetDisplayLayer();
display->SetOrientation(displayOrientationID);
display->SetOrientation((ClientDisplayLayout)displayOrientationID);
if (display->GetMode() == DS_DISPLAY_TYPE_DUAL)
if (display->GetMode() == ClientDisplayMode_Dual)
{
[self doRedraw];
}
@ -2413,9 +2420,9 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
- (void)doDisplayOrderChanged:(NSInteger)displayOrderID
{
OGLDisplayLayer *display = oglv->GetDisplayLayer();
display->SetOrder(displayOrderID);
display->SetOrder((ClientDisplayOrder)displayOrderID);
if (display->GetMode() == DS_DISPLAY_TYPE_DUAL)
if (display->GetMode() == ClientDisplayMode_Dual)
{
[self doRedraw];
}
@ -2426,12 +2433,22 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
OGLDisplayLayer *display = oglv->GetDisplayLayer();
display->SetGapScalar((GLfloat)displayGapScalar);
if (display->GetMode() == DS_DISPLAY_TYPE_DUAL)
if (display->GetMode() == ClientDisplayMode_Dual)
{
[self doRedraw];
}
}
+ (NSSize) calculateNormalSizeUsingMode:(const NSInteger)mode layout:(const NSInteger)layout gapScalar:(const double)gapScalar
{
double w;
double h;
OGLDisplayLayer::CalculateNormalSize((ClientDisplayMode)mode, (ClientDisplayLayout)layout, gapScalar, w, h);
return NSMakeSize(w, h);
}
@end
#pragma mark -

View File

@ -32,6 +32,7 @@
#import "cocoa_rom.h"
#import "cocoa_slot2.h"
#include "../OGLDisplayOutput.h"
@implementation EmuControllerDelegate
@ -1272,24 +1273,24 @@
const NSInteger displayMode = [theWindow displayMode];
switch (displayMode)
{
case DS_DISPLAY_TYPE_MAIN:
[theWindow setDisplayMode:DS_DISPLAY_TYPE_TOUCH];
case ClientDisplayMode_Main:
[theWindow setDisplayMode:ClientDisplayMode_Touch];
break;
case DS_DISPLAY_TYPE_TOUCH:
[theWindow setDisplayMode:DS_DISPLAY_TYPE_MAIN];
case ClientDisplayMode_Touch:
[theWindow setDisplayMode:ClientDisplayMode_Main];
break;
case DS_DISPLAY_TYPE_DUAL:
case ClientDisplayMode_Dual:
{
const NSInteger displayOrder = [theWindow displayOrder];
if (displayOrder == DS_DISPLAY_ORDER_MAIN_FIRST)
if (displayOrder == ClientDisplayOrder_MainFirst)
{
[theWindow setDisplayOrder:DS_DISPLAY_ORDER_TOUCH_FIRST];
[theWindow setDisplayOrder:ClientDisplayOrder_TouchFirst];
}
else
{
[theWindow setDisplayOrder:DS_DISPLAY_ORDER_MAIN_FIRST];
[theWindow setDisplayOrder:ClientDisplayOrder_MainFirst];
}
break;
}