17#define KIS_GAP_MAP_MEASURE_ELAPSED_TIME 0
20#define KIS_GAP_MAP_DEBUG_LOGGING_AND_ASSERTS 0
27 ,
m_accessor(paintDevice->createRandomAccessorNG())
44#if KIS_GAP_MAP_DEBUG_LOGGING_AND_ASSERTS
57 const int localX = x & (
TileSize - 1);
58 const int localY = y & (
TileSize - 1);
105 const QRect& mapBounds,
106 const FillOpacityFunc& fillOpacityFunc);
115 if (isDistanceAvailable(x, y)) {
116 return dataPtr(x, y)->distance;
118 return lazyDistance(x, y);
127#if KIS_GAP_MAP_MEASURE_ELAPSED_TIME
129 quint64 opacityElapsedMillis()
const
131 return m_opacityElapsedNanos / 1000000ull;
134 quint64 distanceElapsedMillis()
const
136 return m_distanceElapsedNanos / 1000000ull;
140 quint64 m_opacityElapsedNanos = 0;
141 quint64 m_distanceElapsedNanos = 0;
148 static constexpr int TileSize = 64;
153 TILE_DISTANCE_LOADED = 0x1,
154 TILE_OPACITY_LOADED = 0x2,
155 TILE_HAS_OPAQUE_PIXELS = 0x4,
164 static_assert(
sizeof(
Data) ==
sizeof(quint32));
166 void loadOpacityTiles(
const QRect& tileRect);
167 void loadDistanceTile(
const QPoint& tile,
const QRect& nearbyTilesRect,
int guardBand);
168 void distanceSearchRowInnerLoop(
bool boundsCheck,
int y,
int x1,
int x2);
169 quint16 lazyDistance(
int x,
int y);
174 template<
bool BoundsCheck,
typename CoordinateTransform>
175 void gapDistanceSearch(
int x,
int y, CoordinateTransform op);
179 void updateDistance(
const QPoint& globalPosition, quint16 newDistance);
183 return (*tileFlagsPtr(x / TileSize, y / TileSize) & TILE_DISTANCE_LOADED) != 0;
188 return reinterpret_cast<Data*
>(m_accessor->rawData(x, y));
194 m_accessor->tileRawData(tileX, tileY) + offsetof(
Data, flags));
virtual quint8 * rawData()=0
Q_DISABLE_COPY(KisGapMap)
const QSize m_numTiles
Map size in tiles.
const FillOpacityFunc m_fillOpacityFunc
A callback to get the opacity data from the fill class.
std::unique_ptr< KisTileOptimizedAccessor > m_accessor
An accessor for the paint device.
const int m_gapSize
Gap size in pixels for this map.
ALWAYS_INLINE bool isOpaque(const QPoint &p)
ALWAYS_INLINE bool isOpaque(int x, int y)
ALWAYS_INLINE quint16 distance(int x, int y)
std::function< bool(KisPaintDevice *devicePtr, const QRect &rect) FillOpacityFunc)
const QSize m_size
Size in pixels of the opacity/gap map.
QPoint m_tilePosition
The position of the currently computed tile compared to the whole region.
ALWAYS_INLINE Data * dataPtr(int x, int y)
ALWAYS_INLINE TileFlags * tileFlagsPtr(int tileX, int tileY)
ALWAYS_INLINE int gapSize() const
KisPaintDeviceSP m_deviceSp
A 32-bit per pixel paint device that holds the distance and other data.
ALWAYS_INLINE bool isDistanceAvailable(int x, int y)
Data * m_tileDataPtr
The pointer to the currently computed tile data.
virtual qint32 numContiguousRows(qint32 y) const =0
virtual void moveTo(qint32 x, qint32 y)=0
virtual qint32 numContiguousColumns(qint32 x) const =0
quint8 * tileRawData(int tileX, int tileY)
const quint32 m_pixelSize
KisTileOptimizedAccessor(KisPaintDeviceSP &paintDevice)
static constexpr int TileSize
ALWAYS_INLINE quint8 * rawData(int x, int y)
KisRandomAccessorSP m_accessor