From b6756277908e1d8e15dd3e35da72c42569494152 Mon Sep 17 00:00:00 2001 From: Sean Harmer Date: Fri, 18 Sep 2015 18:04:22 +0100 Subject: Final batch of file moves for now Change-Id: I0c9e83e3142e6b083feb2cbcabcc4279de64b95b Reviewed-by: Paul Lemire --- src/render/texture/texture.pri | 2 + src/render/texture/texturedata.cpp | 127 +++++++++++++++++++++++++++++++++++++ src/render/texture/texturedata.h | 99 +++++++++++++++++++++++++++++ 3 files changed, 228 insertions(+) create mode 100644 src/render/texture/texturedata.cpp create mode 100644 src/render/texture/texturedata.h (limited to 'src/render/texture') diff --git a/src/render/texture/texture.pri b/src/render/texture/texture.pri index adc07dcd9..9df52c131 100644 --- a/src/render/texture/texture.pri +++ b/src/render/texture/texture.pri @@ -10,6 +10,7 @@ HEADERS += \ $$PWD/qtextureproviders.h \ $$PWD/qwrapmode.h \ $$PWD/texture_p.h \ + $$PWD/texturedata.h \ $$PWD/texturedatamanager_p.h \ $$PWD/textureimage_p.h @@ -20,5 +21,6 @@ SOURCES += \ $$PWD/qtextureproviders.cpp \ $$PWD/qwrapmode.cpp \ $$PWD/texture.cpp \ + $$PWD/texturedata.cpp \ $$PWD/texturedatamanager.cpp \ $$PWD/textureimage.cpp diff --git a/src/render/texture/texturedata.cpp b/src/render/texture/texturedata.cpp new file mode 100644 index 000000000..b54c526f9 --- /dev/null +++ b/src/render/texture/texturedata.cpp @@ -0,0 +1,127 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later 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 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "texturedata.h" + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +namespace Qt3DRender { + +TexImageData::TexImageData() + : m_width(-1) + , m_height(-1) + , m_depth(-1) + , m_isCompressed(false) + , m_format(QOpenGLTexture::RGBA8_UNorm) +{ +} + +TexImageData::~TexImageData() +{ +} + +void TexImageData::cleanup() +{ + m_width = -1; + m_height = -1; + m_depth = -1; + m_isCompressed = false; + m_data.clear(); +} + +void TexImageData::setImage(const QImage &image) +{ + m_width = image.width(); + m_height = image.height(); + m_depth = 1; + + QImage glImage = image.convertToFormat(QImage::Format_RGBA8888); + Q_ASSERT_X(glImage.bytesPerLine() == (glImage.width() * glImage.depth() + 7) / 8, "TexImageData::setImage", "glImage is not packed"); // QTBUG-48330 + QByteArray imageBytes((const char*) glImage.constBits(), glImage.byteCount()); + setData(imageBytes, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8); + m_format = QOpenGLTexture::RGBA8_UNorm; +} + +void TexImageData::setData(const QByteArray &data, QOpenGLTexture::PixelFormat fmt, QOpenGLTexture::PixelType ptype) +{ + m_isCompressed = false; + m_data = data; + m_pixelFormat = fmt; + m_pixelType = ptype; +} + +bool TexImageData::setCompressedFile(const QString &source) +{ + const bool isPkm = QFileInfo(source).suffix() == QStringLiteral("pkm"); + if (!isPkm) + return false; + + QFile f(source); + if (!f.open(QIODevice::ReadOnly)) { + qWarning() << "Failed to open" << source; + return false; + } + + // ETC1 in PKM, as generated by f.ex. Android's etc1tool + static const char pkmMagic[] = { 'P', 'K', 'M', ' ', '1', '0' }; + const int pkmHeaderSize = 6 + 2 + 4 * 2; + QByteArray header = f.read(pkmHeaderSize); + if (header.size() >= pkmHeaderSize && !qstrncmp(header.constData(), pkmMagic, 6)) { + m_format = QOpenGLTexture::RGB8_ETC1; // may get changed to RGB8_ETC2 later on + // get the extended (multiple of 4) width and height + m_width = qFromBigEndian(*(reinterpret_cast(header.constData() + 6 + 2))); + m_height = qFromBigEndian(*(reinterpret_cast(header.constData() + 6 + 2 + 2))); + m_depth = 1; + QByteArray data = f.readAll(); + if (data.size() < (m_width / 4) * (m_height / 4) * 8) + qWarning() << "Unexpected end of ETC1 data in" << source; + setData(data, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8); + m_isCompressed = true; + return true; + } + + return false; +} + +} // namespace Qt3DRender + +QT_END_NAMESPACE diff --git a/src/render/texture/texturedata.h b/src/render/texture/texturedata.h new file mode 100644 index 000000000..2f3fdb9a9 --- /dev/null +++ b/src/render/texture/texturedata.h @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later 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 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QT3DRENDER_TEXTUREDATA_H +#define QT3DRENDER_TEXTUREDATA_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +namespace Qt3DRender { + +class QT3DRENDERERSHARED_EXPORT TexImageData +{ +public: + TexImageData(); + ~TexImageData(); + + void cleanup(); + + bool isCompressed() const + { return m_isCompressed; } + + inline int width() const { return m_width; } + inline int height() const { return m_height; } + inline int depth() const { return m_depth; } + inline QOpenGLTexture::TextureFormat format() const { return m_format; } + + void setImage(const QImage &); + + void setData(const QByteArray &data, + QOpenGLTexture::PixelFormat fmt, + QOpenGLTexture::PixelType ptype); + + bool setCompressedFile(const QString &source); + + QByteArray data() const + { return m_data; } + + QOpenGLTexture::PixelFormat pixelFormat() const + { return m_pixelFormat; } + + QOpenGLTexture::PixelType pixelType() const + { return m_pixelType; } + +private: + int m_width, m_height, m_depth; + QOpenGLTexture::PixelFormat m_pixelFormat; + QOpenGLTexture::PixelType m_pixelType; + + bool m_isCompressed; + QByteArray m_data; + QOpenGLTexture::TextureFormat m_format; +}; + +typedef QSharedPointer TexImageDataPtr; + +} // namespace Qt3DRender + + +QT_END_NAMESPACE + +#endif // QT3DRENDER_TEXTUREDATA_H -- cgit v1.2.3