diff --git a/es-core/src/Renderer_draw_gl.cpp b/es-core/src/Renderer_draw_gl.cpp index afa7ffdd6..cac28c5d4 100644 --- a/es-core/src/Renderer_draw_gl.cpp +++ b/es-core/src/Renderer_draw_gl.cpp @@ -45,9 +45,21 @@ namespace Renderer { //glScissor starts at the bottom left of the window //so (0, 0, 1, 1) is the bottom left pixel //everything else uses y+ = down, so flip it to be consistent - //also take screen height and offset into account - box.x = Renderer::getScreenOffsetX() + box.x; - box.y = Renderer::getWindowHeight() - Renderer::getScreenOffsetY() - box.y - box.h; + switch(Renderer::getScreenRotate()) + { + case 0: { box = ClipRect(box.x, Renderer::getWindowHeight() - (box.y + box.h), box.w, box.h); } break; + case 1: { box = ClipRect(Renderer::getScreenHeight() - (box.y + box.h), Renderer::getWindowWidth() - (box.x + box.w), box.h, box.w); } break; + case 2: { box = ClipRect(Renderer::getScreenWidth() - (box.x + box.w), Renderer::getWindowHeight() - Renderer::getScreenHeight() + box.y, box.w, box.h); } break; + case 3: { box = ClipRect(box.y, Renderer::getWindowWidth() - Renderer::getScreenWidth() + box.x, box.h, box.w); } break; + } + + switch(Renderer::getScreenRotate()) + { + case 0: { box.x += Renderer::getScreenOffsetX(); box.y -= Renderer::getScreenOffsetY(); } break; + case 1: { box.x += Renderer::getScreenOffsetY(); box.y -= Renderer::getScreenOffsetX(); } break; + case 2: { box.x += Renderer::getScreenOffsetX(); box.y -= Renderer::getScreenOffsetY(); } break; + case 3: { box.x += Renderer::getScreenOffsetY(); box.y -= Renderer::getScreenOffsetX(); } break; + } //make sure the box fits within clipStack.top(), and clip further accordingly if(clipStack.size()) @@ -69,13 +81,8 @@ namespace Renderer { box.h = 0; clipStack.push(box); - switch(Renderer::getScreenRotate()) - { - case 0: { glScissor(box.x, box.y, box.w, box.h); } break; - case 1: { glScissor(box.y, Renderer::getScreenWidth() - box.x - box.w, box.h, box.w); } break; - case 2: { glScissor(Renderer::getScreenWidth() - box.x - box.w, Renderer::getScreenHeight() - box.y - box.h, box.w, box.h); } break; - case 3: { glScissor(Renderer::getScreenHeight() - box.y - box.h, box.x, box.h, box.w); } break; - } + + glScissor(box.x, box.y, box.w, box.h); glEnable(GL_SCISSOR_TEST); } @@ -93,13 +100,7 @@ namespace Renderer { glDisable(GL_SCISSOR_TEST); }else{ const ClipRect& top = clipStack.top(); - switch(Renderer::getScreenRotate()) - { - case 0: { glScissor(top.x, top.y, top.w, top.h); } break; - case 1: { glScissor(top.y, Renderer::getScreenWidth() - top.x - top.w, top.h, top.w); } break; - case 2: { glScissor(Renderer::getScreenWidth() - top.x - top.w, Renderer::getScreenHeight() - top.y - top.h, top.w, top.h); } break; - case 3: { glScissor(Renderer::getScreenHeight() - top.y - top.h, top.x, top.h, top.w); } break; - } + glScissor(top.x, top.y, top.w, top.h); } } diff --git a/es-core/src/Settings.cpp b/es-core/src/Settings.cpp index 75bf095cd..a18f002f3 100644 --- a/es-core/src/Settings.cpp +++ b/es-core/src/Settings.cpp @@ -26,7 +26,8 @@ std::vector settings_dont_save { { "ScreenWidth" }, { "ScreenHeight" }, { "ScreenOffsetX" }, - { "ScreenOffsetY" } + { "ScreenOffsetY" }, + { "ScreenRotate" } }; Settings::Settings() @@ -140,6 +141,7 @@ void Settings::setDefaults() mIntMap["ScreenHeight"] = 0; mIntMap["ScreenOffsetX"] = 0; mIntMap["ScreenOffsetY"] = 0; + mIntMap["ScreenRotate"] = 0; } template