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

#include <kis_tile_compressor_2.h>

+ Inheritance diagram for KisTileCompressor2:

Public Member Functions

void compressTileData (KisTileData *tileData, quint8 *buffer, qint32 bufferSize, qint32 &bytesWritten) override
 
bool decompressTileData (quint8 *buffer, qint32 bufferSize, KisTileData *tileData) override
 
 KisTileCompressor2 ()
 
bool readTile (QIODevice *io, KisTiledDataManager *dm) override
 
qint32 tileDataBufferSize (KisTileData *tileData) override
 
bool writeTile (KisTileSP tile, KisPaintDeviceWriter &store) override
 
 ~KisTileCompressor2 () override
 
- Public Member Functions inherited from KisAbstractTileCompressor
 KisAbstractTileCompressor ()
 
virtual ~KisAbstractTileCompressor ()
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Private Member Functions

QString getHeader (KisTileSP tile, qint32 compressedSize)
 
qint32 maxHeaderLength ()
 
void prepareStreamingBuffer (qint32 tileDataSize)
 
void prepareWorkBuffers (qint32 tileDataSize)
 

Private Attributes

KisAbstractCompressionm_compression
 
QByteArray m_compressionBuffer
 
QByteArray m_linearizationBuffer
 
QByteArray m_streamingBuffer
 

Static Private Attributes

static const qint8 COMPRESSED_DATA_FLAG = 1
 
static const QString m_compressionName = "LZF"
 
static const qint8 RAW_DATA_FLAG = 0
 

Additional Inherited Members

- Protected Member Functions inherited from KisAbstractTileCompressor
qint32 pixelSize (KisTiledDataManager *dm)
 
qint32 xToCol (KisTiledDataManager *dm, qint32 x)
 
qint32 yToRow (KisTiledDataManager *dm, qint32 y)
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Detailed Description

Definition at line 14 of file kis_tile_compressor_2.h.

Constructor & Destructor Documentation

◆ KisTileCompressor2()

KisTileCompressor2::KisTileCompressor2 ( )

Definition at line 16 of file kis_tile_compressor_2.cpp.

References m_compression.

◆ ~KisTileCompressor2()

KisTileCompressor2::~KisTileCompressor2 ( )
override

Definition at line 21 of file kis_tile_compressor_2.cpp.

22{
23 delete m_compression;
24}

References m_compression.

Member Function Documentation

◆ compressTileData()

void KisTileCompressor2::compressTileData ( KisTileData * tileData,
quint8 * buffer,
qint32 bufferSize,
qint32 & bytesWritten )
overridevirtual

Compresses a tileData and writes it into the buffer. The buffer must be at least tileDataBufferSize() bytes long. Actual number of bytes written is returned using out-parameter bytesWritten

Parameters
tileDataan existing tile data. It should be created and acquired by the caller.
bufferthe buffer
bufferSizethe size of the buffer
bytesWrittenthe number of written bytes
See also
tileDataBufferSize()

Implements KisAbstractTileCompressor.

Definition at line 105 of file kis_tile_compressor_2.cpp.

109{
110 const qint32 pixelSize = tileData->pixelSize();
111 const qint32 tileDataSize = TILE_DATA_SIZE(pixelSize);
112 qint32 compressedBytes;
113
114 Q_UNUSED(bufferSize);
115 Q_ASSERT(bufferSize >= tileDataSize + 1);
116
117 prepareWorkBuffers(tileDataSize);
118
120 tileDataSize, pixelSize);
121
122 compressedBytes = m_compression->compress((quint8*)m_linearizationBuffer.data(), tileDataSize,
123 (quint8*)m_compressionBuffer.data(), m_compressionBuffer.size());
124
125 if(compressedBytes < tileDataSize) {
126 buffer[0] = COMPRESSED_DATA_FLAG;
127 memcpy(buffer + 1, m_compressionBuffer.data(), compressedBytes);
128 bytesWritten = compressedBytes + 1;
129 }
130 else {
131 buffer[0] = RAW_DATA_FLAG;
132 memcpy(buffer + 1, tileData->data(), tileDataSize);
133 bytesWritten = tileDataSize + 1;
134 }
135}
static void linearizeColors(quint8 *input, quint8 *output, qint32 dataSize, qint32 pixelSize)
virtual qint32 compress(const quint8 *input, qint32 inputLength, quint8 *output, qint32 outputLength)=0
qint32 pixelSize(KisTiledDataManager *dm)
void prepareWorkBuffers(qint32 tileDataSize)
static const qint8 RAW_DATA_FLAG
static const qint8 COMPRESSED_DATA_FLAG
quint32 pixelSize() const
quint8 * data() const
#define TILE_DATA_SIZE(pixelSize)

References KisAbstractCompression::compress(), COMPRESSED_DATA_FLAG, KisTileData::data(), KisAbstractCompression::linearizeColors(), m_compression, m_compressionBuffer, m_linearizationBuffer, KisTileData::pixelSize(), KisAbstractTileCompressor::pixelSize(), prepareWorkBuffers(), RAW_DATA_FLAG, and TILE_DATA_SIZE.

◆ decompressTileData()

bool KisTileCompressor2::decompressTileData ( quint8 * buffer,
qint32 bufferSize,
KisTileData * tileData )
overridevirtual

Decompresses a tileData from a given buffer.

Parameters
bufferthe buffer
bufferSizethe size of the buffer
tileDataan existing tile data where the result will be written to. It should be created and acquired by the caller.

Implements KisAbstractTileCompressor.

Definition at line 137 of file kis_tile_compressor_2.cpp.

140{
141 const qint32 pixelSize = tileData->pixelSize();
142 const qint32 tileDataSize = TILE_DATA_SIZE(pixelSize);
143
144 if(buffer[0] == COMPRESSED_DATA_FLAG) {
145 prepareWorkBuffers(tileDataSize);
146
147 qint32 bytesWritten;
148 bytesWritten = m_compression->decompress(buffer + 1, bufferSize - 1,
149 (quint8*)m_linearizationBuffer.data(), tileDataSize);
150 if (bytesWritten == tileDataSize) {
152 tileData->data(),
153 tileDataSize, pixelSize);
154 return true;
155 }
156 return false;
157 }
158 else {
159 memcpy(tileData->data(), buffer + 1, tileDataSize);
160 return true;
161 }
162 return false;
163
164}
virtual qint32 decompress(const quint8 *input, qint32 inputLength, quint8 *output, qint32 outputLength)=0
static void delinearizeColors(quint8 *input, quint8 *output, qint32 dataSize, qint32 pixelSize)

References COMPRESSED_DATA_FLAG, KisTileData::data(), KisAbstractCompression::decompress(), KisAbstractCompression::delinearizeColors(), m_compression, m_linearizationBuffer, KisTileData::pixelSize(), KisAbstractTileCompressor::pixelSize(), prepareWorkBuffers(), and TILE_DATA_SIZE.

◆ getHeader()

QString KisTileCompressor2::getHeader ( KisTileSP tile,
qint32 compressedSize )
inlineprivate

Definition at line 180 of file kis_tile_compressor_2.cpp.

182{
183 qint32 x, y;
184 qint32 width, height;
185 tile->extent().getRect(&x, &y, &width, &height);
186
187 return QString("%1,%2,%3,%4\n").arg(x).arg(y).arg(m_compressionName).arg(compressedSize);
188}
static const QString m_compressionName
QRect extent() const
Definition kis_tile.h:99

References KisTile::extent(), and m_compressionName.

◆ maxHeaderLength()

qint32 KisTileCompressor2::maxHeaderLength ( )
inlineprivate

Quite self describing

Definition at line 171 of file kis_tile_compressor_2.cpp.

172{
173 static const qint32 QINT32_LENGTH = 11;
174 static const qint32 COMPRESSION_NAME_LENGTH = 5;
175 static const qint32 SEPARATORS_LENGTH = 4;
176
177 return 3 * QINT32_LENGTH + COMPRESSION_NAME_LENGTH + SEPARATORS_LENGTH;
178}

◆ prepareStreamingBuffer()

void KisTileCompressor2::prepareStreamingBuffer ( qint32 tileDataSize)
private

TODO: delete this buffer! It is better to use one of other two buffers to store streams

Definition at line 83 of file kis_tile_compressor_2.cpp.

84{
89 m_streamingBuffer.resize(tileDataSize + 1);
90}

References m_streamingBuffer.

◆ prepareWorkBuffers()

void KisTileCompressor2::prepareWorkBuffers ( qint32 tileDataSize)
private

Definition at line 92 of file kis_tile_compressor_2.cpp.

93{
94 const qint32 bufferSize = m_compression->outputBufferSize(tileDataSize);
95
96 if (m_linearizationBuffer.size() < tileDataSize) {
97 m_linearizationBuffer.resize(tileDataSize);
98 }
99
100 if (m_compressionBuffer.size() < bufferSize) {
101 m_compressionBuffer.resize(bufferSize);
102 }
103}
virtual qint32 outputBufferSize(qint32 dataSize)=0

References m_compression, m_compressionBuffer, m_linearizationBuffer, and KisAbstractCompression::outputBufferSize().

◆ readTile()

bool KisTileCompressor2::readTile ( QIODevice * stream,
KisTiledDataManager * dm )
overridevirtual

Decompresses the tile from the stream. Used by datamanager in load/save routines

See also
decompressTile()

Implements KisAbstractTileCompressor.

Definition at line 51 of file kis_tile_compressor_2.cpp.

52{
53 const qint32 tileDataSize = TILE_DATA_SIZE(pixelSize(dm));
54 prepareStreamingBuffer(tileDataSize);
55
56 QByteArray header = stream->readLine(maxHeaderLength());
57
58 QList<QByteArray> headerItems = header.trimmed().split(',');
59 if (headerItems.size() == 4) {
60 qint32 x = headerItems.takeFirst().toInt();
61 qint32 y = headerItems.takeFirst().toInt();
62 QString compressionName = headerItems.takeFirst();
63 qint32 dataSize = headerItems.takeFirst().toInt();
64
65 Q_ASSERT(headerItems.isEmpty());
66 Q_ASSERT(compressionName == m_compressionName);
67
68 qint32 row = yToRow(dm, y);
69 qint32 col = xToCol(dm, x);
70
71 KisTileSP tile = dm->getTile(col, row, true);
72
73 stream->read(m_streamingBuffer.data(), dataSize);
74
75 tile->lockForWrite();
76 bool res = decompressTileData((quint8*)m_streamingBuffer.data(), dataSize, tile->tileData());
77 tile->unlockForWrite();
78 return res;
79 }
80 return false;
81}
qint32 xToCol(KisTiledDataManager *dm, qint32 x)
qint32 yToRow(KisTiledDataManager *dm, qint32 y)
void prepareStreamingBuffer(qint32 tileDataSize)
bool decompressTileData(quint8 *buffer, qint32 bufferSize, KisTileData *tileData) override
void lockForWrite()
Definition kis_tile.cc:221
KisTileData * tileData() const
Definition kis_tile.h:118
void unlockForWrite()
Definition kis_tile.cc:264
KisTileSP getTile(qint32 col, qint32 row, bool writable)

References decompressTileData(), KisTiledDataManager::getTile(), KisTile::lockForWrite(), m_compressionName, m_streamingBuffer, maxHeaderLength(), KisAbstractTileCompressor::pixelSize(), prepareStreamingBuffer(), TILE_DATA_SIZE, KisTile::tileData(), KisTile::unlockForWrite(), KisAbstractTileCompressor::xToCol(), and KisAbstractTileCompressor::yToRow().

◆ tileDataBufferSize()

qint32 KisTileCompressor2::tileDataBufferSize ( KisTileData * tileData)
overridevirtual

Return the number of bytes needed for compressing one tile

Implements KisAbstractTileCompressor.

Definition at line 166 of file kis_tile_compressor_2.cpp.

167{
168 return TILE_DATA_SIZE(tileData->pixelSize()) + 1;
169}

References KisTileData::pixelSize(), and TILE_DATA_SIZE.

◆ writeTile()

bool KisTileCompressor2::writeTile ( KisTileSP tile,
KisPaintDeviceWriter & store )
overridevirtual

Compresses the tile and writes it into the stream. Used by datamanager in load/save routines

See also
compressTile()

Implements KisAbstractTileCompressor.

Definition at line 26 of file kis_tile_compressor_2.cpp.

27{
28 const qint32 tileDataSize = TILE_DATA_SIZE(tile->pixelSize());
29 prepareStreamingBuffer(tileDataSize);
30
31 qint32 bytesWritten;
32
33 tile->lockForRead();
34 compressTileData(tile->tileData(), (quint8*)m_streamingBuffer.data(),
35 m_streamingBuffer.size(), bytesWritten);
36 tile->unlockForRead();
37
38 QString header = getHeader(tile, bytesWritten);
39 bool retval = true;
40 retval = store.write(header.toLatin1());
41 if (!retval) {
42 warnFile << "Failed to write the tile header";
43 }
44 retval = store.write(m_streamingBuffer.data(), bytesWritten);
45 if (!retval) {
46 warnFile << "Failed to write the tile data";
47 }
48 return retval;
49}
virtual bool write(const QByteArray &data)=0
QString getHeader(KisTileSP tile, qint32 compressedSize)
void compressTileData(KisTileData *tileData, quint8 *buffer, qint32 bufferSize, qint32 &bytesWritten) override
void lockForRead() const
Definition kis_tile.cc:208
void unlockForRead() const
Definition kis_tile.cc:275
qint32 pixelSize() const
Definition kis_tile.h:113
#define warnFile
Definition kis_debug.h:95

References compressTileData(), getHeader(), KisTile::lockForRead(), m_streamingBuffer, KisTile::pixelSize(), prepareStreamingBuffer(), TILE_DATA_SIZE, KisTile::tileData(), KisTile::unlockForRead(), warnFile, and KisPaintDeviceWriter::write().

Member Data Documentation

◆ COMPRESSED_DATA_FLAG

const qint8 KisTileCompressor2::COMPRESSED_DATA_FLAG = 1
staticprivate

Definition at line 42 of file kis_tile_compressor_2.h.

◆ m_compression

KisAbstractCompression* KisTileCompressor2::m_compression
private

Definition at line 48 of file kis_tile_compressor_2.h.

◆ m_compressionBuffer

QByteArray KisTileCompressor2::m_compressionBuffer
private

Definition at line 46 of file kis_tile_compressor_2.h.

◆ m_compressionName

const QString KisTileCompressor2::m_compressionName = "LZF"
staticprivate

Definition at line 49 of file kis_tile_compressor_2.h.

◆ m_linearizationBuffer

QByteArray KisTileCompressor2::m_linearizationBuffer
private

Definition at line 45 of file kis_tile_compressor_2.h.

◆ m_streamingBuffer

QByteArray KisTileCompressor2::m_streamingBuffer
private

Definition at line 47 of file kis_tile_compressor_2.h.

◆ RAW_DATA_FLAG

const qint8 KisTileCompressor2::RAW_DATA_FLAG = 0
staticprivate

Definition at line 41 of file kis_tile_compressor_2.h.


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