summaryrefslogtreecommitdiffstats
path: root/src/plugins/imageformats/tga/qtgafile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/imageformats/tga/qtgafile.cpp')
-rw-r--r--src/plugins/imageformats/tga/qtgafile.cpp266
1 files changed, 0 insertions, 266 deletions
diff --git a/src/plugins/imageformats/tga/qtgafile.cpp b/src/plugins/imageformats/tga/qtgafile.cpp
deleted file mode 100644
index 092ce0a6f..000000000
--- a/src/plugins/imageformats/tga/qtgafile.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the Qt3D module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qtgafile.h"
-
-#include <QtCore/qiodevice.h>
-#include <QtCore/qdebug.h>
-#include <QtCore/qdatetime.h>
-
-struct TgaReader
-{
- virtual ~TgaReader() {}
- virtual QRgb operator()(QIODevice *s) const = 0;
-};
-
-struct Tga16Reader : public TgaReader
-{
- ~Tga16Reader() {}
- QRgb operator()(QIODevice *s) const
- {
- char ch1, ch2;
- if (s->getChar(&ch1) && s->getChar(&ch2)) {
- quint16 d = (int(ch1) & 0xFF) | ((int(ch2) & 0xFF) << 8);
- QRgb result = (d & 0x8000) ? 0xFF000000 : 0x00000000;
- result |= (d & 0x7C00 << 6) | (d & 0x03E0 << 3) | (d & 0x001F);
- return result;
- } else {
- return 0;
- }
- }
-};
-
-struct Tga24Reader : public TgaReader
-{
- QRgb operator()(QIODevice *s) const
- {
- char r, g, b;
- if (s->getChar(&b) && s->getChar(&g) && s->getChar(&r))
- return qRgb(uchar(r), uchar(g), uchar(b));
- else
- return 0;
- }
-};
-
-struct Tga32Reader : public TgaReader
-{
- QRgb operator()(QIODevice *s) const
- {
- char r, g, b, a;
- if (s->getChar(&b) && s->getChar(&g) && s->getChar(&r) && s->getChar(&a))
- return qRgba(uchar(r), uchar(g), uchar(b), uchar(a));
- else
- return 0;
- }
-};
-
-/*!
- \class QTgaFile
- \since 4.8
- \internal
-
- File data container for a TrueVision Graphics format file.
-
- Format is as described here:
- http://local.wasp.uwa.edu.au/~pbourke/dataformats/tga/
- http://netghost.narod.ru/gff2/graphics/summary/tga.htm
-
- Usage is:
- \code
- QTgaFile tga(myFile);
- QImage tgaImage;
- if (tga.isValid())
- tgaImage = tga.readImage();
- \endcode
-
- The class is designed to handle sequential and non-sequential
- sources, so during construction the mHeader is read. Then during
- the readImage() call the rest of the data is read.
-
- After passing myFile to the constructor, if the QIODevice *myFile
- is read, or has seek() called, the results are undefined - so don't
- do that.
-*/
-
-/*!
- Construct a new QTgaFile object getting data from \a device.
-
- The object does not take ownership of the \a device, but until the
- object is destroyed do not do any non-const operations, eg seek or
- read on the device.
-*/
-QTgaFile::QTgaFile(QIODevice *device)
- : mDevice(device)
-{
- ::memset(mHeader, 0, HeaderSize);
- if (!mDevice->isReadable())
- {
- mErrorMessage = QObject::tr("Could not read image data");
- return;
- }
- if (mDevice->isSequential())
- {
- mErrorMessage = QObject::tr("Sequential device (eg socket) for image read not supported");
- return;
- }
- if (!mDevice->seek(0))
- {
- mErrorMessage = QObject::tr("Seek file/device for image read failed");
- return;
- }
- int bytes = device->read((char*)mHeader, HeaderSize);
- if (bytes != HeaderSize)
- {
- mErrorMessage = QObject::tr("Image mHeader read failed");
- return;
- }
- if (mHeader[ImageType] != 2)
- {
- // TODO: should support other image types
- mErrorMessage = QObject::tr("Image type not supported");
- return;
- }
- int bitsPerPixel = mHeader[PixelDepth];
- bool validDepth = (bitsPerPixel == 16 || bitsPerPixel == 24 || bitsPerPixel == 32);
- if (!validDepth)
- {
- mErrorMessage = QObject::tr("Image dpeth not valid");
- }
- int curPos = mDevice->pos();
- int fileBytes = mDevice->size();
- if (!mDevice->seek(fileBytes - FooterSize))
- {
- mErrorMessage = QObject::tr("Could not seek to image read footer");
- return;
- }
- char footer[FooterSize];
- bytes = mDevice->read((char*)footer, FooterSize);
- if (bytes != FooterSize)
- {
- mErrorMessage = QObject::tr("Could not read footer");
- }
- if (qstrncmp(&footer[SignatureOffset], "TRUEVISION-XFILE", 16) != 0)
- {
- mErrorMessage = QObject::tr("Image type (non-TrueVision 2.0) not supported");
- }
- if (!mDevice->seek(curPos))
- {
- mErrorMessage = QObject::tr("Could not reset to read data");
- }
-}
-
-/*!
- \internal
- Destroy the device, recovering any resources.
-*/
-QTgaFile::~QTgaFile()
-{
-}
-
-/*!
- \internal
- Reads an image file from the QTgaFile's device, and returns it.
-
- This method seeks to the absolute position of the image data in the file,
- so no assumptions are made about where the devices read pointer is when this
- method is called. For this reason only random access devices are supported.
-
- If the constructor completed successfully, such that isValid() returns true,
- then this method is likely to succeed, unless the file is somehow corrupted.
-
- In the case that the read fails, the QImage returned will be null, such that
- QImage::isNull() will be true.
-*/
-QImage QTgaFile::readImage()
-{
- if (!isValid())
- return QImage();
-
- int offset = mHeader[IdLength]; // Mostly always zero
-
- // Even in TrueColor files a color pallette may be present
- if (mHeader[ColorMapType] == 1)
- offset += littleEndianInt(&mHeader[CMapLength]) * littleEndianInt(&mHeader[CMapDepth]);
-
- mDevice->seek(HeaderSize + offset);
-
- char dummy;
- for (int i = 0; i < offset; ++i)
- mDevice->getChar(&dummy);
-
- int bitsPerPixel = mHeader[PixelDepth];
- int imageWidth = width();
- int imageHeight = height();
-
- unsigned char desc = mHeader[ImageDescriptor];
- //unsigned char xCorner = desc & 0x10; // 0 = left, 1 = right
- unsigned char yCorner = desc & 0x20; // 0 = lower, 1 = upper
-
- QImage im(imageWidth, imageHeight, QImage::Format_ARGB32);
- TgaReader *reader = 0;
- if (bitsPerPixel == 16)
- reader = new Tga16Reader();
- else if (bitsPerPixel == 24)
- reader = new Tga24Reader();
- else if (bitsPerPixel == 32)
- reader = new Tga32Reader();
- TgaReader &read = *reader;
-
- // For now only deal with yCorner, since no one uses xCorner == 1
- // Also this is upside down, since Qt has the origin flipped
- if (yCorner)
- {
- for (int y = 0; y < imageHeight; ++y)
- for (int x = 0; x < imageWidth; ++x)
- im.setPixel(x, y, read(mDevice));
- }
- else
- {
- for (int y = imageHeight - 1; y >= 0; --y)
- for (int x = 0; x < imageWidth; ++x)
- im.setPixel(x, y, read(mDevice));
- }
-
- delete reader;
-
- // TODO: add processing of TGA extension information - ie TGA 2.0 files
- return im;
-}