59 return qRgba(uchar(r), uchar(g), uchar(b), uchar(a));
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");
143 int curPos = mDevice->pos();
144 int fileBytes = mDevice->size();
147 mErrorMessage = tr(
"Could not seek to image read footer");
152 mErrorMessage = tr(
"Could not read footer");
156 mErrorMessage = tr(
"Image type (non-TrueVision 2.0) not supported");
158 if (!mDevice->seek(curPos))
160 mErrorMessage = tr(
"Could not reset to read data");
199 if (cmapDepth != 16 && cmapDepth != 24 && cmapDepth != 32) {
200 mErrorMessage = tr(
"Invalid color map depth (%1)").arg(cmapDepth);
203 offset += littleEndianInt(&mHeader[CMapLength]) * cmapDepth / 8;
209 for (
int i = 0; i < offset; ++i)
210 mDevice->getChar(&dummy);
218 unsigned char yCorner = desc & 0x20;
221 if (!QImageIOHandler::allocateImage(QSize(imageWidth, imageHeight), QImage::Format_ARGB32, &im))
223 TgaReader *reader = 0;
224 if (bitsPerPixel == 16)
225 reader =
new Tga16Reader();
226 else if (bitsPerPixel == 24)
227 reader =
new Tga24Reader();
228 else if (bitsPerPixel == 32)
229 reader =
new Tga32Reader();
232 TgaReader &read = *reader;
238 for (
int y = 0; y < imageHeight; ++y)
239 for (
int x = 0; x < imageWidth; ++x)
240 im.setPixel(x, y, read(mDevice));
244 for (
int y = imageHeight - 1; y >= 0; --y)
245 for (
int x = 0; x < imageWidth; ++x)
246 im.setPixel(x, y, read(mDevice));