From e5949582e6b5d60f9a4aa1285668efdb598ed28b Mon Sep 17 00:00:00 2001 From: falkTX Date: Wed, 11 Oct 2023 15:18:12 +0200 Subject: [PATCH] Set auto-scale-factor early, cleaner GL setup Signed-off-by: falkTX --- dgl/src/Cairo.cpp | 7 +------ dgl/src/OpenGL.cpp | 35 +++++++++-------------------------- dgl/src/WindowPrivateData.cpp | 8 ++++++-- 3 files changed, 16 insertions(+), 34 deletions(-) diff --git a/dgl/src/Cairo.cpp b/dgl/src/Cairo.cpp index 1a5b69ec..d913c4e8 100644 --- a/dgl/src/Cairo.cpp +++ b/dgl/src/Cairo.cpp @@ -784,18 +784,13 @@ void TopLevelWidget::PrivateData::display() cairo_matrix_t matrix; cairo_get_matrix(handle, &matrix); + cairo_translate(handle, 0, 0); // full viewport size if (window.pData->autoScaling) - { - cairo_translate(handle, 0, 0); cairo_scale(handle, autoScaleFactor, autoScaleFactor); - } else - { - cairo_translate(handle, 0, 0); cairo_scale(handle, 1.0, 1.0); - } // main widget drawing self->onDisplay(); diff --git a/dgl/src/OpenGL.cpp b/dgl/src/OpenGL.cpp index 00fbbf6b..43d096e9 100644 --- a/dgl/src/OpenGL.cpp +++ b/dgl/src/OpenGL.cpp @@ -707,26 +707,21 @@ void SubWidget::PrivateData::display(const uint width, const uint height, const else if (needsFullViewportForDrawing || (absolutePos.isZero() && self->getSize() == Size(width, height))) { // full viewport size - glViewport(0, - -static_cast(height * autoScaleFactor - height + 0.5), - static_cast(width * autoScaleFactor + 0.5), - static_cast(height * autoScaleFactor + 0.5)); + glViewport(0, 0, static_cast(width), static_cast(height)); } else { // set viewport pos glViewport(static_cast(absolutePos.getX() * autoScaleFactor + 0.5), - -static_cast(std::round((height * autoScaleFactor - height) - + (absolutePos.getY() * autoScaleFactor))), - static_cast(std::round(width * autoScaleFactor)), - static_cast(std::round(height * autoScaleFactor))); + -static_cast(absolutePos.getY() * autoScaleFactor + 0.5), + static_cast(width), + static_cast(height)); // then cut the outer bounds glScissor(static_cast(absolutePos.getX() * autoScaleFactor + 0.5), - static_cast(height - std::round((static_cast(self->getHeight()) + absolutePos.getY()) - * autoScaleFactor)), - static_cast(std::round(self->getWidth() * autoScaleFactor)), - static_cast(std::round(self->getHeight() * autoScaleFactor))); + static_cast(height - (self->getHeight() + absolutePos.getY()) * autoScaleFactor + 0.5), + static_cast(self->getWidth() * autoScaleFactor + 0.5), + static_cast(self->getHeight() * autoScaleFactor + 0.5)); glEnable(GL_SCISSOR_TEST); needsDisableScissor = true; @@ -752,26 +747,14 @@ void TopLevelWidget::PrivateData::display() const uint width = size.getWidth(); const uint height = size.getHeight(); - const double autoScaleFactor = window.pData->autoScaleFactor; - // full viewport size - if (window.pData->autoScaling) - { - glViewport(0, - -static_cast(height * autoScaleFactor - height + 0.5), - static_cast(width * autoScaleFactor + 0.5), - static_cast(height * autoScaleFactor + 0.5)); - } - else - { - glViewport(0, 0, static_cast(width), static_cast(height)); - } + glViewport(0, 0, static_cast(width), static_cast(height)); // main widget drawing self->onDisplay(); // now draw subwidgets if there are any - selfw->pData->displaySubWidgets(width, height, autoScaleFactor); + selfw->pData->displaySubWidgets(width, height, window.pData->autoScaleFactor); } // ----------------------------------------------------------------------- diff --git a/dgl/src/WindowPrivateData.cpp b/dgl/src/WindowPrivateData.cpp index 7e3e5c83..2f0f4d75 100644 --- a/dgl/src/WindowPrivateData.cpp +++ b/dgl/src/WindowPrivateData.cpp @@ -577,9 +577,13 @@ void Window::PrivateData::onPuglConfigure(const double width, const double heigh const double scaleVertical = height / static_cast(minHeight); autoScaleFactor = scaleHorizontal < scaleVertical ? scaleHorizontal : scaleVertical; } + else + { + autoScaleFactor = 1.0; + } - const uint uwidth = static_cast(width + 0.5); - const uint uheight = static_cast(height + 0.5); + const uint uwidth = static_cast(width / autoScaleFactor + 0.5); + const uint uheight = static_cast(height / autoScaleFactor + 0.5); self->onReshape(uwidth, uheight);