qskinny/src/nodes/QskBoxRenderer.h

120 lines
3.7 KiB
C
Raw Normal View History

/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#ifndef QSK_BOX_RENDERER_H
#define QSK_BOX_RENDERER_H
#include "QskBoxShapeMetrics.h"
#include "QskVertex.h"
2018-07-19 14:10:48 +02:00
#include <qrect.h>
class QskBoxBorderMetrics;
class QskBoxBorderColors;
class QskGradient;
class QSGGeometry;
class QSK_EXPORT QskBoxRenderer
{
2018-08-03 08:15:28 +02:00
public:
2022-12-05 17:06:55 +01:00
static void renderBorder( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& );
2022-12-05 17:06:55 +01:00
static void renderFill( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& );
2022-12-05 17:06:55 +01:00
static void renderBox( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&,
const QskBoxBorderColors&, const QskGradient&, QSGGeometry& );
static bool isGradientSupported( const QskBoxShapeMetrics&, const QskGradient& );
class Metrics
{
2018-08-03 08:15:28 +02:00
public:
Metrics( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics& );
QskVertex::Quad outerQuad;
QskVertex::Quad innerQuad;
#if 1
QskVertex::Quad centerQuad; // to be removed
#endif
struct Corner
{
bool isCropped;
qreal centerX, centerY;
qreal radiusX, radiusY;
qreal radiusInnerX, radiusInnerY;
int stepCount;
2018-08-03 08:15:28 +02:00
} corner[ 4 ];
bool isBorderRegular;
bool isRadiusRegular;
bool isTotallyCropped;
};
2018-08-03 08:15:28 +02:00
private:
2022-12-05 17:06:55 +01:00
static void renderRectFill( const QRectF&,
2022-11-16 14:33:10 +01:00
const QskBoxBorderMetrics&, QSGGeometry& );
2022-12-05 17:06:55 +01:00
static void renderRectBorder( const QRectF&,
2022-11-16 14:33:10 +01:00
const QskBoxBorderMetrics&, QSGGeometry& );
2022-12-05 17:06:55 +01:00
static void renderRect( const QRectF&, const QskBoxBorderMetrics&,
const QskBoxBorderColors&, const QskGradient&, QSGGeometry& );
2022-12-05 17:06:55 +01:00
static void renderRectellipseFill( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& );
2022-12-05 17:06:55 +01:00
static void renderRectellipseBorder( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& );
2022-12-05 17:06:55 +01:00
static void renderRectellipse( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&,
const QskBoxBorderColors&, const QskGradient&, QSGGeometry& );
2022-12-05 17:06:55 +01:00
static void renderDiagonalFill( const Metrics&, const QskGradient&,
int lineCount, QskVertex::ColoredLine* );
static void renderRectFill( const QskVertex::Quad&,
const QskGradient&, QskVertex::ColoredLine* );
};
inline void QskBoxRenderer::renderBorder(
const QRectF& rect, const QskBoxShapeMetrics& shape,
const QskBoxBorderMetrics& border, QSGGeometry& geometry )
{
if ( shape.isRectangle() )
2022-11-16 14:33:10 +01:00
renderRectBorder( rect, border, geometry );
else
renderRectellipseBorder( rect, shape, border, geometry );
}
inline void QskBoxRenderer::renderFill(
const QRectF& rect, const QskBoxShapeMetrics& shape,
const QskBoxBorderMetrics& border, QSGGeometry& geometry )
{
if ( shape.isRectangle() )
2022-11-16 14:33:10 +01:00
renderRectFill( rect, border, geometry );
else
renderRectellipseFill( rect, shape, border, geometry );
}
inline void QskBoxRenderer::renderBox( const QRectF& rect,
const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border,
const QskBoxBorderColors& borderColors, const QskGradient& gradient,
QSGGeometry& geometry )
{
if ( shape.isRectangle() )
2022-11-16 14:33:10 +01:00
renderRect( rect, border, borderColors, gradient, geometry );
else
renderRectellipse( rect, shape, border, borderColors, gradient, geometry );
}
#endif