4#include "QtGui/qimage.h"
6#include <QtCore/qsize.h>
7#include <QtCore/qvarlengtharray.h>
8#include <QtCore/qmap.h>
12Q_LOGGING_CATEGORY(lcQtGuiTextureIO,
"qt.gui.textureio");
43 void ensureSize(
int levels,
int faces,
bool force =
false)
47 if (mode == QTextureFileData::ByteArrayMode) {
48 offsets.resize(numFaces);
49 lengths.resize(numFaces);
51 for (
auto faceList : { &offsets, &lengths })
52 for (
auto &levelList : *faceList)
53 levelList.resize(numLevels);
55 images.resize(numFaces);
56 for (
auto &levelList : images)
57 levelList.resize(numLevels);
63 int getOffset(
int level,
int face)
const {
return offsets[face][level]; }
64 void setOffset(
int value,
int level,
int face) { offsets[face][level] = value; }
65 int getLength(
int level,
int face)
const {
return lengths[face][level]; }
66 void setLength(
int value,
int level,
int face) { lengths[face][level] = value; }
83QTextureFileData::QTextureFileData(Mode mode)
85 d =
new QTextureFileDataPrivate;
89QTextureFileData::QTextureFileData(
const QTextureFileData &other)
94QTextureFileData &QTextureFileData::operator=(
const QTextureFileData &other)
100QTextureFileData::~QTextureFileData()
104bool QTextureFileData::isNull()
const
109bool QTextureFileData::isValid()
const
114 if (d->mode == ImageMode)
117 if (d->data.isEmpty() || d->size.isEmpty() || (!d->format && !d->internalFormat))
120 const int numFacesOffset = d->offsets.size();
121 const int numFacesLength = d->lengths.size();
122 if (numFacesOffset == 0 || numFacesLength == 0 || d->numFaces != numFacesOffset
123 || d->numFaces != numFacesLength)
126 const qint64 dataSize = d->data.size();
129 for (
int face = 0; face < d->numFaces; face++) {
130 const int numLevelsOffset = d->offsets.at(face).size();
131 const int numLevelsLength = d->lengths.at(face).size();
132 if (numLevelsOffset == 0 || numLevelsLength == 0 || d->numLevels != numLevelsOffset
133 || d->numLevels != numLevelsLength)
136 for (
int level = 0; level < d->numLevels; level++) {
137 const qint64 offset = d->getOffset(level, face);
138 const qint64 length = d->getLength(level, face);
139 if (offset < 0 || offset >= dataSize || length <= 0 || (offset + length > dataSize))
146void QTextureFileData::clear()
151QByteArray QTextureFileData::data()
const
153 return d ? d->data : QByteArray();
156void QTextureFileData::setData(
const QByteArray &data)
158 Q_ASSERT(d->mode == ByteArrayMode);
162void QTextureFileData::setData(
const QImage &image,
int level,
int face)
164 Q_ASSERT(d->mode == ImageMode);
165 d->ensureSize(level + 1, face + 1);
166 d->images[face][level] = image;
169int QTextureFileData::dataOffset(
int level,
int face)
const
171 Q_ASSERT(d->mode == ByteArrayMode);
172 return (d && d->isValid(level, face)) ? d->getOffset(level, face) : 0;
175void QTextureFileData::setDataOffset(
int offset,
int level,
int face)
177 Q_ASSERT(d->mode == ByteArrayMode);
178 if (d.constData() && level >= 0) {
179 d->ensureSize(level + 1, face + 1);
180 d->setOffset(offset, level, face);
184int QTextureFileData::dataLength(
int level,
int face)
const
186 Q_ASSERT(d->mode == ByteArrayMode);
187 return (d && d->isValid(level, face)) ? d->getLength(level, face) : 0;
190QByteArrayView QTextureFileData::getDataView(
int level,
int face)
const
192 if (d->mode == ByteArrayMode) {
193 const int dataLength =
this->dataLength(level, face);
194 const int dataOffset =
this->dataOffset(level, face);
196 if (d ==
nullptr || dataLength == 0)
197 return QByteArrayView();
199 return QByteArrayView(d->data.constData() + dataOffset, dataLength);
201 if (!d->isValid(level, face))
202 return QByteArrayView();
203 const QImage &img = d->images[face][level];
204 return img.isNull() ? QByteArrayView() : QByteArrayView(img.constBits(), img.sizeInBytes());
208void QTextureFileData::setDataLength(
int length,
int level,
int face)
210 Q_ASSERT(d->mode == ByteArrayMode);
211 if (d.constData() && level >= 0) {
212 d->ensureSize(level + 1, face + 1);
213 d->setLength(length, level, face);
217int QTextureFileData::numLevels()
const
219 return d ? d->numLevels : 0;
222void QTextureFileData::setNumLevels(
int numLevels)
224 if (d && numLevels >= 0)
225 d->ensureSize(numLevels, d->numFaces,
true);
228int QTextureFileData::numFaces()
const
230 return d ? d->numFaces : 0;
233void QTextureFileData::setNumFaces(
int numFaces)
235 if (d && numFaces >= 0)
236 d->ensureSize(d->numLevels, numFaces,
true);
239QSize QTextureFileData::size()
const
241 return d ? d->size : QSize();
244void QTextureFileData::setSize(
const QSize &size)
250quint32 QTextureFileData::glFormat()
const
252 return d ? d->format : 0;
255void QTextureFileData::setGLFormat(quint32 format)
261quint32 QTextureFileData::glInternalFormat()
const
263 return d ? d->internalFormat : 0;
266void QTextureFileData::setGLInternalFormat(quint32 format)
269 d->internalFormat = format;
272quint32 QTextureFileData::glBaseInternalFormat()
const
274 return d ? d->baseInternalFormat : 0;
277void QTextureFileData::setGLBaseInternalFormat(quint32 format)
280 d->baseInternalFormat = format;
283QByteArray QTextureFileData::logName()
const
285 return d ? d->logName : QByteArray();
288void QTextureFileData::setLogName(
const QByteArray &name)
294QMap<QByteArray, QByteArray> QTextureFileData::keyValueMetadata()
const
296 return d ? d->keyValues : QMap<QByteArray, QByteArray>();
299void QTextureFileData::setKeyValueMetadata(
const QMap<QByteArray, QByteArray> &keyValues)
302 d->keyValues = keyValues;
307 return QByteArray(
"0x" + QByteArray::number(fmt, 16).rightJustified(4,
'0'));
310QDebug operator<<(QDebug dbg,
const QTextureFileData &d)
312 QDebugStateSaver saver(dbg);
314 dbg.nospace() <<
"QTextureFileData(";
316 dbg.space() << d.logName() << d.size();
317 dbg <<
"glFormat:" << glFormatName(d.glFormat());
318 dbg <<
"glInternalFormat:" << glFormatName(d.glInternalFormat());
319 dbg <<
"glBaseInternalFormat:" << glFormatName(d.glBaseInternalFormat());
320 dbg.nospace() <<
"Levels: " << d.numLevels();
321 dbg.nospace() <<
"Faces: " << d.numFaces();
325 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)