5#include "QtGui/qimage.h"
7#include <QtCore/qsize.h>
8#include <QtCore/qvarlengtharray.h>
9#include <QtCore/qmap.h>
13Q_LOGGING_CATEGORY(lcQtGuiTextureIO,
"qt.gui.textureio");
44 void ensureSize(
int levels,
int faces,
bool force =
false)
48 if (mode == QTextureFileData::ByteArrayMode) {
49 offsets.resize(numFaces);
50 lengths.resize(numFaces);
52 for (
auto faceList : { &offsets, &lengths })
53 for (
auto &levelList : *faceList)
54 levelList.resize(numLevels);
56 images.resize(numFaces);
57 for (
auto &levelList : images)
58 levelList.resize(numLevels);
64 int getOffset(
int level,
int face)
const {
return offsets[face][level]; }
65 void setOffset(
int value,
int level,
int face) { offsets[face][level] = value; }
66 int getLength(
int level,
int face)
const {
return lengths[face][level]; }
67 void setLength(
int value,
int level,
int face) { lengths[face][level] = value; }
84QT_DEFINE_QSDP_SPECIALIZATION_DTOR(QTextureFileDataPrivate)
86QTextureFileData::QTextureFileData(Mode mode)
88 d =
new QTextureFileDataPrivate;
92QTextureFileData::QTextureFileData(
const QTextureFileData &other)
97QTextureFileData &QTextureFileData::operator=(
const QTextureFileData &other)
103QTextureFileData::~QTextureFileData()
107bool QTextureFileData::isNull()
const
112bool QTextureFileData::isValid()
const
117 if (d->mode == ImageMode)
120 if (d->data.isEmpty() || d->size.isEmpty() || (!d->format && !d->internalFormat))
123 const int numFacesOffset = d->offsets.size();
124 const int numFacesLength = d->lengths.size();
125 if (numFacesOffset == 0 || numFacesLength == 0 || d->numFaces != numFacesOffset
126 || d->numFaces != numFacesLength)
129 const qint64 dataSize = d->data.size();
132 for (
int face = 0; face < d->numFaces; face++) {
133 const int numLevelsOffset = d->offsets.at(face).size();
134 const int numLevelsLength = d->lengths.at(face).size();
135 if (numLevelsOffset == 0 || numLevelsLength == 0 || d->numLevels != numLevelsOffset
136 || d->numLevels != numLevelsLength)
139 for (
int level = 0; level < d->numLevels; level++) {
140 const qint64 offset = d->getOffset(level, face);
141 const qint64 length = d->getLength(level, face);
142 if (offset < 0 || offset >= dataSize || length <= 0 || (offset + length > dataSize))
149void QTextureFileData::clear()
154QByteArray QTextureFileData::data()
const
156 return d ? d->data : QByteArray();
159void QTextureFileData::setData(
const QByteArray &data)
161 Q_ASSERT(d->mode == ByteArrayMode);
165void QTextureFileData::setData(
const QImage &image,
int level,
int face)
167 Q_ASSERT(d->mode == ImageMode);
168 d->ensureSize(level + 1, face + 1);
169 d->images[face][level] = image;
172int QTextureFileData::dataOffset(
int level,
int face)
const
174 Q_ASSERT(d->mode == ByteArrayMode);
175 return (d && d->isValid(level, face)) ? d->getOffset(level, face) : 0;
178void QTextureFileData::setDataOffset(
int offset,
int level,
int face)
180 Q_ASSERT(d->mode == ByteArrayMode);
181 if (d.constData() && level >= 0) {
182 d->ensureSize(level + 1, face + 1);
183 d->setOffset(offset, level, face);
187int QTextureFileData::dataLength(
int level,
int face)
const
189 Q_ASSERT(d->mode == ByteArrayMode);
190 return (d && d->isValid(level, face)) ? d->getLength(level, face) : 0;
193QByteArrayView QTextureFileData::getDataView(
int level,
int face)
const
195 if (d->mode == ByteArrayMode) {
196 const int dataLength =
this->dataLength(level, face);
197 const int dataOffset =
this->dataOffset(level, face);
199 if (d ==
nullptr || dataLength == 0)
200 return QByteArrayView();
202 return QByteArrayView(d->data.constData() + dataOffset, dataLength);
204 if (!d->isValid(level, face))
205 return QByteArrayView();
206 const QImage &img = d->images[face][level];
207 return img.isNull() ? QByteArrayView() : QByteArrayView(img.constBits(), img.sizeInBytes());
211void QTextureFileData::setDataLength(
int length,
int level,
int face)
213 Q_ASSERT(d->mode == ByteArrayMode);
214 if (d.constData() && level >= 0) {
215 d->ensureSize(level + 1, face + 1);
216 d->setLength(length, level, face);
220int QTextureFileData::numLevels()
const
222 return d ? d->numLevels : 0;
225void QTextureFileData::setNumLevels(
int numLevels)
227 if (d && numLevels >= 0)
228 d->ensureSize(numLevels, d->numFaces,
true);
231int QTextureFileData::numFaces()
const
233 return d ? d->numFaces : 0;
236void QTextureFileData::setNumFaces(
int numFaces)
238 if (d && numFaces >= 0)
239 d->ensureSize(d->numLevels, numFaces,
true);
242QSize QTextureFileData::size()
const
244 return d ? d->size : QSize();
247void QTextureFileData::setSize(
const QSize &size)
253quint32 QTextureFileData::glFormat()
const
255 return d ? d->format : 0;
258void QTextureFileData::setGLFormat(quint32 format)
264quint32 QTextureFileData::glInternalFormat()
const
266 return d ? d->internalFormat : 0;
269void QTextureFileData::setGLInternalFormat(quint32 format)
272 d->internalFormat = format;
275quint32 QTextureFileData::glBaseInternalFormat()
const
277 return d ? d->baseInternalFormat : 0;
280void QTextureFileData::setGLBaseInternalFormat(quint32 format)
283 d->baseInternalFormat = format;
286QByteArray QTextureFileData::logName()
const
288 return d ? d->logName : QByteArray();
291void QTextureFileData::setLogName(
const QByteArray &name)
297QMap<QByteArray, QByteArray> QTextureFileData::keyValueMetadata()
const
299 return d ? d->keyValues : QMap<QByteArray, QByteArray>();
302void QTextureFileData::setKeyValueMetadata(
const QMap<QByteArray, QByteArray> &keyValues)
305 d->keyValues = keyValues;
310 return QByteArray(
"0x" + QByteArray::number(fmt, 16).rightJustified(4,
'0'));
313QDebug operator<<(QDebug dbg,
const QTextureFileData &d)
315 QDebugStateSaver saver(dbg);
317 dbg.nospace() <<
"QTextureFileData(";
319 dbg.space() << d.logName() << d.size();
320 dbg <<
"glFormat:" << glFormatName(d.glFormat());
321 dbg <<
"glInternalFormat:" << glFormatName(d.glInternalFormat());
322 dbg <<
"glBaseInternalFormat:" << glFormatName(d.glBaseInternalFormat());
323 dbg.nospace() <<
"Levels: " << d.numLevels();
324 dbg.nospace() <<
"Faces: " << d.numFaces();
328 dbg << (d.d->mode ?
"[bytearray-based]" :
"[image-based]");
void setLength(int value, int level, int face)
QTextureFileDataPrivate(const QTextureFileDataPrivate &other)
QVarLengthArray< QList< int >, MAX_FACES > lengths
bool isValid(int level, int face) const
quint32 baseInternalFormat
~QTextureFileDataPrivate()
QVarLengthArray< QList< QImage >, MAX_FACES > images
int getLength(int level, int face) const
void ensureSize(int levels, int faces, bool force=false)
void setOffset(int value, int level, int face)
QVarLengthArray< QList< int >, MAX_FACES > offsets
QMap< QByteArray, QByteArray > keyValues
QTextureFileDataPrivate()
int getOffset(int level, int face) const
Combined button and popup list for selecting options.
constexpr size_t MAX_FACES
static QByteArray glFormatName(quint32 fmt)