void StWindow::stglDraw() { if(myWin->myGlContext.isNull()) { return; } const StGLBoxPx aVPMaster = StWindow::stglViewport(ST_WIN_MASTER); const GLsizei aHeight = (aVPMaster .height() == 0) ? 1 : aVPMaster .height(); const StGLBoxPx aRect = {{ aVPMaster.x(), aVPMaster.y(), aVPMaster.width(), aHeight }}; myWin->myGlContext->stglResizeViewport(aRect); signals.onRedraw(ST_DRAW_LEFT); stglSwap(ST_WIN_ALL); }
void StGLRootWidget::stglScissorRect(const StRectI_t& theRect, StGLBoxPx& theScissorRect) const { const GLint aVPortWidth = myViewport[2]; const GLint aVPortHeight = myViewport[3]; const GLint aRootWidth = getRectPx().width(); const GLint aRootHeight = getRectPx().height(); if(aRootWidth <= 0 || aRootHeight <= 0) { // just prevent division by zero - should never happen stMemZero(&theScissorRect, sizeof(StGLBoxPx)); return; } // viewport could have different size in case of rendering to FBO const GLdouble aWidthFactor = GLdouble(aVPortWidth) / GLdouble(aRootWidth); const GLdouble aHeightFactor = GLdouble(aVPortHeight) / GLdouble(aRootHeight); theScissorRect.x() = myViewport[0] + GLint(aWidthFactor * GLdouble(theRect.left())) + myScrDispXPx; theScissorRect.y() = myViewport[1] + GLint(aHeightFactor * GLdouble(aRootHeight - theRect.bottom())); theScissorRect.width() = GLint(aWidthFactor * GLdouble(theRect.width())); theScissorRect.height() = GLint(aHeightFactor * GLdouble(theRect.height())); }