Krita Source Code Documentation
Loading...
Searching...
No Matches
KisLodTransformBase Class Reference

#include <kis_lod_transform_base.h>

+ Inheritance diagram for KisLodTransformBase:

Public Member Functions

 KisLodTransformBase (int levelOfDetail)
 
QRect map (const QRect &rc) const
 
QRectF map (const QRectF &rc) const
 
template<class T >
map (const T &object) const
 
QRect mapInverted (const QRect &rc) const
 
QRectF mapInverted (const QRectF &rc) const
 
QTransform transform () const
 

Static Public Member Functions

static QRect alignedRect (const QRect &srcRect, int lod)
 
static int coordToLodCoord (int x, int lod)
 
static qreal lodToInvScale (int levelOfDetail)
 
static qreal lodToScale (int levelOfDetail)
 
template<class PaintDeviceTypeSP >
static qreal lodToScale (PaintDeviceTypeSP device)
 
static QRect scaledRect (const QRect &srcRect, int lod)
 
static int scaleToLod (qreal scale, int maxLod)
 
static QRect upscaledRect (const QRect &srcRect, int lod)
 

Protected Attributes

int m_levelOfDetail
 
QTransform m_transform
 

Static Private Member Functions

static void alignByPow2ButOneHi (qint32 &value, qint32 alignment)
 
static void alignByPow2Lo (qint32 &value, qint32 alignment)
 
static int divideSafe (int x, int lod)
 

Friends

class KisRectsGrid
 

Detailed Description

Definition at line 17 of file kis_lod_transform_base.h.

Constructor & Destructor Documentation

◆ KisLodTransformBase()

KisLodTransformBase::KisLodTransformBase ( int levelOfDetail)
inline

Definition at line 19 of file kis_lod_transform_base.h.

19 {
20 qreal scale = lodToScale(levelOfDetail);
21 m_transform = QTransform::fromScale(scale, scale);
22 m_levelOfDetail = levelOfDetail;
23 }
static qreal lodToScale(int levelOfDetail)

Member Function Documentation

◆ alignByPow2ButOneHi()

static void KisLodTransformBase::alignByPow2ButOneHi ( qint32 & value,
qint32 alignment )
inlinestaticprivate

Aligns @value to the lowest integer not smaller than @value and that is, increased by one, a divident of alignment

Definition at line 146 of file kis_lod_transform_base.h.

147 {
148 qint32 mask = alignment - 1;
149 value |= mask;
150 }
float value(const T *src, size_t ch)

References value().

◆ alignByPow2Lo()

static void KisLodTransformBase::alignByPow2Lo ( qint32 & value,
qint32 alignment )
inlinestaticprivate

Aligns @value to the highest integer not exceeding @value and that is a divident of @alignment

Definition at line 156 of file kis_lod_transform_base.h.

157 {
158 qint32 mask = alignment - 1;
159 value &= ~mask;
160 }

References value().

◆ alignedRect()

static QRect KisLodTransformBase::alignedRect ( const QRect & srcRect,
int lod )
inlinestatic

Here is a workaround of Qt's QRect::right()/bottom() "historical reasons". It should be one pixel smaller than actual right/bottom position

Definition at line 67 of file kis_lod_transform_base.h.

68 {
69 qint32 alignment = 1 << lod;
70
71 qint32 x1, y1, x2, y2;
72 srcRect.getCoords(&x1, &y1, &x2, &y2);
73
74 alignByPow2Lo(x1, alignment);
75 alignByPow2Lo(y1, alignment);
76
82 alignByPow2ButOneHi(x2, alignment);
83 alignByPow2ButOneHi(y2, alignment);
84
85 QRect rect;
86 rect.setCoords(x1, y1, x2, y2);
87
88 return rect;
89 }
static void alignByPow2ButOneHi(qint32 &value, qint32 alignment)
static void alignByPow2Lo(qint32 &value, qint32 alignment)

References alignByPow2ButOneHi(), and alignByPow2Lo().

◆ coordToLodCoord()

static int KisLodTransformBase::coordToLodCoord ( int x,
int lod )
inlinestatic

Definition at line 132 of file kis_lod_transform_base.h.

132 {
133 return divideSafe(x, lod);
134 }
static int divideSafe(int x, int lod)

◆ divideSafe()

static int KisLodTransformBase::divideSafe ( int x,
int lod )
inlinestaticprivate

Definition at line 162 of file kis_lod_transform_base.h.

162 {
163 return x > 0 ? x >> lod : -( -x >> lod);
164 }

◆ lodToInvScale()

static qreal KisLodTransformBase::lodToInvScale ( int levelOfDetail)
inlinestatic

Definition at line 35 of file kis_lod_transform_base.h.

35 {
36 return 1 << qMax(0, levelOfDetail);
37 }

◆ lodToScale() [1/2]

static qreal KisLodTransformBase::lodToScale ( int levelOfDetail)
inlinestatic

Definition at line 31 of file kis_lod_transform_base.h.

31 {
32 return levelOfDetail > 0 ? 1.0 / (1 << qMax(0, levelOfDetail)) : 1.0;
33 }

◆ lodToScale() [2/2]

template<class PaintDeviceTypeSP >
static qreal KisLodTransformBase::lodToScale ( PaintDeviceTypeSP device)
inlinestatic

Definition at line 40 of file kis_lod_transform_base.h.

40 {
41 return lodToScale(device->defaultBounds()->currentLevelOfDetail());
42 }

◆ map() [1/3]

QRect KisLodTransformBase::map ( const QRect & rc) const
inline

Definition at line 48 of file kis_lod_transform_base.h.

48 {
49 return m_transform.mapRect(rc);
50 }

◆ map() [2/3]

QRectF KisLodTransformBase::map ( const QRectF & rc) const
inline

Definition at line 44 of file kis_lod_transform_base.h.

44 {
45 return m_transform.mapRect(rc);
46 }

◆ map() [3/3]

template<class T >
T KisLodTransformBase::map ( const T & object) const
inline

Definition at line 63 of file kis_lod_transform_base.h.

63 {
64 return m_transform.map(object);
65 }

◆ mapInverted() [1/2]

QRect KisLodTransformBase::mapInverted ( const QRect & rc) const
inline

Definition at line 56 of file kis_lod_transform_base.h.

56 {
57 return m_transform.inverted().mapRect(rc);
58 }

◆ mapInverted() [2/2]

QRectF KisLodTransformBase::mapInverted ( const QRectF & rc) const
inline

Definition at line 52 of file kis_lod_transform_base.h.

52 {
53 return m_transform.inverted().mapRect(rc);
54 }

◆ scaledRect()

static QRect KisLodTransformBase::scaledRect ( const QRect & srcRect,
int lod )
inlinestatic

Definition at line 91 of file kis_lod_transform_base.h.

91 {
92 qint32 x1, y1, x2, y2;
93 srcRect.getCoords(&x1, &y1, &x2, &y2);
94
95 KIS_ASSERT_RECOVER_NOOP(!(x1 & 1));
96 KIS_ASSERT_RECOVER_NOOP(!(y1 & 1));
97 KIS_ASSERT_RECOVER_NOOP(!((x2 + 1) & 1));
98 KIS_ASSERT_RECOVER_NOOP(!((y2 + 1) & 1));
99
100 x1 = divideSafe(x1, lod);
101 y1 = divideSafe(y1, lod);
102 x2 = divideSafe(x2 + 1, lod) - 1;
103 y2 = divideSafe(y2 + 1, lod) - 1;
104
105 QRect rect;
106 rect.setCoords(x1, y1, x2, y2);
107
108 return rect;
109 }
#define KIS_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:97

References KIS_ASSERT_RECOVER_NOOP.

◆ scaleToLod()

static int KisLodTransformBase::scaleToLod ( qreal scale,
int maxLod )
inlinestatic

Definition at line 27 of file kis_lod_transform_base.h.

27 {
28 return qMin(maxLod, qMax(0, qFloor(std::log2(1.0 / scale))));
29 }

◆ transform()

QTransform KisLodTransformBase::transform ( ) const
inline

Definition at line 136 of file kis_lod_transform_base.h.

136 {
137 return m_transform;
138 }

◆ upscaledRect()

static QRect KisLodTransformBase::upscaledRect ( const QRect & srcRect,
int lod )
inlinestatic

Definition at line 111 of file kis_lod_transform_base.h.

111 {
112 qint32 x1, y1, x2, y2;
113 srcRect.getCoords(&x1, &y1, &x2, &y2);
114
115 x2++;
116 y2++;
117
118 x1 <<= lod;
119 y1 <<= lod;
120 x2 <<= lod;
121 y2 <<= lod;
122
123 x2--;
124 y2--;
125
126 QRect rect;
127 rect.setCoords(x1, y1, x2, y2);
128
129 return rect;
130 }

Friends And Related Symbol Documentation

◆ KisRectsGrid

friend class KisRectsGrid
friend

Definition at line 141 of file kis_lod_transform_base.h.

Member Data Documentation

◆ m_levelOfDetail

int KisLodTransformBase::m_levelOfDetail
protected

Definition at line 168 of file kis_lod_transform_base.h.

◆ m_transform

QTransform KisLodTransformBase::m_transform
protected

Definition at line 167 of file kis_lod_transform_base.h.


The documentation for this class was generated from the following file: