7#include <QtCore/QIODevice>
8#include <QtCore/QDebug>
9#include <QtCore/QDateTime>
10#include <QtGui/QImageIOHandler>
16 Q_DISABLE_COPY(TgaReader)
18 TgaReader() =
default;
20 virtual ~TgaReader() {}
21 virtual QRgb operator()(QIODevice *s)
const = 0;
24struct Tga16Reader :
public TgaReader
27 QRgb operator()(QIODevice *s)
const override
30 if (s->getChar(&ch1) && s->getChar(&ch2)) {
31 quint16 d = (
int(ch1) & 0xFF) | ((
int(ch2) & 0xFF) << 8);
32 QRgb result = (d & 0x8000) ? 0xFF000000 : 0x00000000;
33 result |= ((d & 0x7C00) << 6) | ((d & 0x03E0) << 3) | (d & 0x001F);
41struct Tga24Reader :
public TgaReader
43 QRgb operator()(QIODevice *s)
const override
46 if (s->getChar(&b) && s->getChar(&g) && s->getChar(&r))
47 return qRgb(uchar(r), uchar(g), uchar(b));
53struct Tga32Reader :
public TgaReader
55 QRgb operator()(QIODevice *s)
const override
58 if (s->getChar(&b) && s->getChar(&g) && s->getChar(&r) && s->getChar(&a))
59 return qRgba(uchar(r), uchar(g), uchar(b), uchar(a));
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
96
97
98
99
100
101
105 ::memset(mHeader, 0, HeaderSize);
106 if (!mDevice->isReadable())
108 mErrorMessage = tr(
"Could not read image data");
111 if (mDevice->isSequential())
113 mErrorMessage = tr(
"Sequential device (eg socket) for image read not supported");
116 if (!mDevice->seek(0))
118 mErrorMessage = tr(
"Seek file/device for image read failed");
122 mErrorMessage = tr(
"Image header read failed");
128 mErrorMessage = tr(
"Image type not supported");
132 bool validDepth = (bitsPerPixel == 16 || bitsPerPixel == 24 || bitsPerPixel == 32);
135 mErrorMessage = tr(
"Image depth not valid");
140 mErrorMessage = tr(
"Image size exceeds limit");
146
147
148
154
155
156
157
158
159
160
161
162
163
164
165
166
180 if (cmapDepth != 16 && cmapDepth != 24 && cmapDepth != 32) {
181 mErrorMessage = tr(
"Invalid color map depth (%1)").arg(cmapDepth);
184 offset += littleEndianInt(&mHeader[CMapLength]) * cmapDepth / 8;
190 for (
int i = 0; i < offset; ++i)
191 mDevice->getChar(&dummy);
199 unsigned char yCorner = desc & 0x20;
202 if (!QImageIOHandler::allocateImage(QSize(imageWidth, imageHeight), QImage::Format_ARGB32, &im))
204 TgaReader *reader = 0;
205 if (bitsPerPixel == 16)
206 reader =
new Tga16Reader();
207 else if (bitsPerPixel == 24)
208 reader =
new Tga24Reader();
209 else if (bitsPerPixel == 32)
210 reader =
new Tga32Reader();
213 TgaReader &read = *reader;
219 for (
int y = 0; y < imageHeight; ++y)
220 for (
int x = 0; x < imageWidth; ++x)
221 im.setPixel(x, y, read(mDevice));
225 for (
int y = imageHeight - 1; y >= 0; --y)
226 for (
int x = 0; x < imageWidth; ++x)
227 im.setPixel(x, y, read(mDevice));
QTgaFile(QIODevice *)
Construct a new QTgaFile object getting data from device.