@ -4,46 +4,25 @@
SPDX - License - Identifier : GPL - 2.0 - or - later
*/
# include "core/renderviewport.h"
# include "core/pixelgrid.h"
# include "core/rendertarget.h"
# include "effect/globals.h"
namespace KWin
{
static QMatrix4x4 createProjectionMatrix ( const QRectF & renderRect , double scale , const RenderTarget & renderTarge t)
static QMatrix4x4 createProjectionMatrix ( const RenderTarget & renderTarget , const QRect & rec t)
{
QMatrix4x4 ret = renderTarget . transformation ( ) ;
ret . ortho ( QRectF ( renderRect . left ( ) * scale , renderRect . top ( ) * scale , renderRect . width ( ) * scale , renderRect . height ( ) * scale ) ) ;
return ret ;
}
static QMatrix4x4 createLogicalToLocalMatrix ( const QRectF & renderRect , const RenderTarget & renderTarget )
{
// map the normalized device coordinates [-1, 1] from the projection matrix (without scaling) to pixels
QMatrix4x4 ret ;
ret . scale ( renderTarget . size ( ) . width ( ) , renderTarget . size ( ) . height ( ) ) ;
ret . translate ( 0.5 , 0.5 ) ;
ret . scale ( 0.5 , - 0.5 ) ;
ret * = renderTarget . transformation ( ) ;
ret . ortho ( renderRect ) ;
return ret ;
}
static QMatrix4x4 createLogicalToLocalTextureMatrix ( const QRectF & renderRect , double scale )
{
// map the normalized device coordinates [-1, 1] from the projection matrix (without scaling) to pixels
QMatrix4x4 ret ;
ret . scale ( renderRect . width ( ) * scale , renderRect . height ( ) * scale ) ;
ret . translate ( 0.5 , 0.5 ) ;
ret . scale ( 0.5 , - 0.5 ) ;
ret . ortho ( renderRect ) ;
ret . ortho ( rect ) ;
return ret ;
}
RenderViewport : : RenderViewport ( const QRectF & renderRect , double scale , const RenderTarget & renderTarget )
: m_renderRect ( renderRec t )
, m_projectionMatrix ( createProjectionMatrix ( renderRect , scale , renderTarget ) )
, m_logicalToLocal ( createLogicalToLocalMatrix ( renderRect , renderTarget ) )
, m_logicalToLocalTexture ( createLogicalToLocalTextureMatrix ( renderRect , scale ) )
: m_renderTarget ( & renderTarget )
, m_renderRect ( renderRect )
, m_deviceRenderRect ( snapToPixelGrid ( scaledRect ( renderRect , scale ) ) )
, m_projectionMatrix ( createProjectionMatrix ( renderTarget , m_deviceRenderRect ) )
, m_scale ( scale )
{
}
@ -65,58 +44,66 @@ double RenderViewport::scale() const
QRectF RenderViewport : : mapToRenderTarget ( const QRectF & logicalGeometry ) const
{
return m_logicalToLocal . mapRect ( logicalGeometry ) ;
const QRectF deviceGeometry = scaledRect ( logicalGeometry , m_scale )
. translated ( - m_deviceRenderRect . topLeft ( ) ) ;
return m_renderTarget - > applyTransformation ( deviceGeometry , QRectF ( QPointF ( ) , m_renderTarget - > size ( ) ) ) ;
}
QRect RenderViewport : : mapToRenderTarget ( const QRect & logicalGeometry ) const
{
return m_logicalToLocal . mapRect ( logicalGeometry ) ;
const QRect deviceGeometry = snapToPixelGrid ( scaledRect ( logicalGeometry , m_scale ) )
. translated ( - m_deviceRenderRect . topLeft ( ) ) ;
return m_renderTarget - > applyTransformation ( deviceGeometry , QRect ( QPoint ( ) , m_renderTarget - > size ( ) ) ) ;
}
QPoint RenderViewport : : mapToRenderTarget ( const QPoint & logicalGeometry ) const
{
return m_logicalToLocal . map ( logicalGeometry ) ;
const QPoint devicePoint = snapToPixelGrid ( QPointF ( logicalGeometry ) * m_scale ) - m_deviceRenderRect . topLeft ( ) ;
return m_renderTarget - > applyTransformation ( devicePoint , QRect ( QPoint ( ) , m_renderTarget - > size ( ) ) ) ;
}
QPointF RenderViewport : : mapToRenderTarget ( const QPointF & logicalGeometry ) const
{
return m_logicalToLocal . map ( logicalGeometry ) ;
const QPointF devicePoint = logicalGeometry * m_scale - m_deviceRenderRect . topLeft ( ) ;
return m_renderTarget - > applyTransformation ( devicePoint , QRectF ( QPointF ( ) , m_renderTarget - > size ( ) ) ) ;
}
QRegion RenderViewport : : mapToRenderTarget ( const QRegion & logicalGeometry ) const
{
QRegion ret ;
for ( const auto & rect : logicalGeometry ) {
ret | = m_logicalToLocal . mapRec t ( rect ) ;
ret | = mapToRenderTarge t ( rect ) ;
}
return ret ;
}
QRectF RenderViewport : : mapToRenderTargetTexture ( const QRectF & logicalGeometry ) const
{
return m_logicalToLocalTexture . mapRect ( logicalGeometry ) ;
return scaledRect ( logicalGeometry , m_scale )
. translated ( - m_deviceRenderRect . topLeft ( ) ) ;
}
QRect RenderViewport : : mapToRenderTargetTexture ( const QRect & logicalGeometry ) const
{
return m_logicalToLocalTexture . mapRect ( logicalGeometry ) ;
return snapToPixelGrid ( scaledRect ( logicalGeometry , m_scale ) )
. translated ( - m_deviceRenderRect . topLeft ( ) ) ;
}
QPoint RenderViewport : : mapToRenderTargetTexture ( const QPoint & logicalGeometry ) const
{
return m_logicalToLocalTexture . map ( logicalGeometry ) ;
return snapToPixelGrid ( QPointF ( logicalGeometry ) * m_scale ) - m_deviceRenderRect . topLeft ( ) ;
}
QPointF RenderViewport : : mapToRenderTargetTexture ( const QPointF & logicalGeometry ) const
{
return m_logicalToLocalTexture . map ( logicalGeometry ) ;
return logicalGeometry * m_scale - m_deviceRenderRect . topLeft ( ) ;
}
QRegion RenderViewport : : mapToRenderTargetTexture ( const QRegion & logicalGeometry ) const
{
QRegion ret ;
for ( const auto & rect : logicalGeometry ) {
ret | = m_logicalToLocalTexture . mapRect ( rect ) ;
ret | = mapToRenderTargetTexture ( rect ) ;
}
return ret ;
}