File indexing completed on 2024-06-09 04:22:22

0001 /* 
0002  *  SPDX-FileCopyrightText: 2010 Lukáš Tvrdý <lukast.dev@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef _KIS_HLINE_ITERATOR_H_
0008 #define _KIS_HLINE_ITERATOR_H_
0009 
0010 #include "kis_base_iterator.h"
0011 #include "kritaimage_export.h"
0012 #include "kis_iterator_ng.h"
0013 
0014 class KRITAIMAGE_EXPORT KisHLineIterator2 : public KisHLineIteratorNG, public KisBaseIterator {
0015     KisHLineIterator2(const KisHLineIterator2&);
0016     KisHLineIterator2& operator=(const KisHLineIterator2&);
0017 
0018 public:
0019     struct KisTileInfo {
0020         KisTileSP tile;
0021         KisTileSP oldtile;
0022         quint8* data {nullptr};
0023         quint8* oldData {nullptr};
0024     };
0025 
0026 
0027 public:    
0028     KisHLineIterator2(KisDataManager *dataManager, qint32 x, qint32 y, qint32 w, qint32 offsetX, qint32 offsetY, bool writable, KisIteratorCompleteListener *listener);
0029     ~KisHLineIterator2() override;
0030     
0031     bool nextPixel() override;
0032     void nextRow() override;
0033     const quint8* oldRawData() const override;
0034     const quint8* rawDataConst() const override;
0035     quint8* rawData() override;
0036     qint32 nConseqPixels() const override;
0037     bool nextPixels(qint32 n) override;
0038     qint32 x() const override;
0039     qint32 y() const override;
0040 
0041     void resetPixelPos() override;
0042     void resetRowPos() override;
0043 
0044 private:
0045     qint32 m_offsetX {0};
0046     qint32 m_offsetY {0};
0047 
0048     qint32 m_x {0};        // current x position
0049     qint32 m_y {0};        // current y position
0050     qint32 m_row {0};    // current row in tilemgr
0051     quint32 m_index {0};    // current col in tilemgr
0052     quint32 m_tileWidth {0};
0053     quint8 *m_data {nullptr};
0054     quint8 *m_oldData {nullptr};
0055     bool m_havePixels {false};
0056     
0057     qint32 m_right {0};
0058     qint32 m_left {0};
0059     qint32 m_top {0};
0060     qint32 m_leftCol {0};
0061     qint32 m_rightCol {0};
0062 
0063     qint32 m_rightmostInTile {0}; // limited by the current tile border only
0064 
0065     qint32 m_leftInLeftmostTile {0};
0066     qint32 m_yInTile {0};
0067 
0068     QVector<KisTileInfo> m_tilesCache;
0069     quint32 m_tilesCacheSize {0};
0070     
0071 private:
0072 
0073     void switchToTile(qint32 xInTile);
0074     void fetchTileDataForCache(KisTileInfo& kti, qint32 col, qint32 row);
0075     void preallocateTiles();
0076 };
0077 #endif