diff options
Diffstat (limited to 'src/gui/rhi/qrhi_p_p.h')
-rw-r--r-- | src/gui/rhi/qrhi_p_p.h | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/src/gui/rhi/qrhi_p_p.h b/src/gui/rhi/qrhi_p_p.h index 7ac0184a16..446403f9b7 100644 --- a/src/gui/rhi/qrhi_p_p.h +++ b/src/gui/rhi/qrhi_p_p.h @@ -245,7 +245,13 @@ private: friend class QRhiResourceUpdateBatchPrivate; }; -template<typename T, size_t N> +enum QRhiTargetRectBoundMode +{ + UnBounded, + Bounded +}; + +template<QRhiTargetRectBoundMode boundingMode, typename T, size_t N> bool qrhi_toTopLeftRenderTargetRect(const QSize &outputSize, const std::array<T, N> &r, T *x, T *y, T *w, T *h) { @@ -256,7 +262,7 @@ bool qrhi_toTopLeftRenderTargetRect(const QSize &outputSize, const std::array<T, // or height. We must handle all other input gracefully, clamping to a zero // width or height rect in the worst case, and ensuring the resulting rect // is inside the rendertarget's bounds because some APIs' validation/debug - // layers are allergic to out of bounds scissor or viewport rects. + // layers are allergic to out of bounds scissor rects. const T outputWidth = outputSize.width(); const T outputHeight = outputSize.height(); @@ -268,20 +274,23 @@ bool qrhi_toTopLeftRenderTargetRect(const QSize &outputSize, const std::array<T, *x = r[0]; *y = outputHeight - (r[1] + inputHeight); - - const T widthOffset = *x < 0 ? -*x : 0; - const T heightOffset = *y < 0 ? -*y : 0; - *w = *x < outputWidth ? qMax<T>(0, inputWidth - widthOffset) : 0; - *h = *y < outputHeight ? qMax<T>(0, inputHeight - heightOffset) : 0; - - *x = qBound<T>(0, *x, outputWidth - 1); - *y = qBound<T>(0, *y, outputHeight - 1); - - if (*x + *w > outputWidth) - *w = qMax<T>(0, outputWidth - *x); - if (*y + *h > outputHeight) - *h = qMax<T>(0, outputHeight - *y); - + *w = inputWidth; + *h = inputHeight; + + if (boundingMode == Bounded) { + const T widthOffset = *x < 0 ? -*x : 0; + const T heightOffset = *y < 0 ? -*y : 0; + *w = *x < outputWidth ? qMax<T>(0, inputWidth - widthOffset) : 0; + *h = *y < outputHeight ? qMax<T>(0, inputHeight - heightOffset) : 0; + + *x = qBound<T>(0, *x, outputWidth - 1); + *y = qBound<T>(0, *y, outputHeight - 1); + + if (*x + *w > outputWidth) + *w = qMax<T>(0, outputWidth - *x); + if (*y + *h > outputHeight) + *h = qMax<T>(0, outputHeight - *y); + } return true; } |