| Index: third_party/ktx/ktx.h
|
| diff --git a/third_party/ktx/ktx.h b/third_party/ktx/ktx.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0e4ed9b9900721b3c9700ee8af2b9e57b15b9097
|
| --- /dev/null
|
| +++ b/third_party/ktx/ktx.h
|
| @@ -0,0 +1,129 @@
|
| +
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +
|
| +#ifndef SkKTXFile_DEFINED
|
| +#define SkKTXFile_DEFINED
|
| +
|
| +#include "SkData.h"
|
| +#include "SkTypes.h"
|
| +#include "SkTDArray.h"
|
| +#include "SkString.h"
|
| +#include "SkRefCnt.h"
|
| +
|
| +class SkStreamRewindable;
|
| +
|
| +// KTX Image File
|
| +// ---
|
| +// KTX is a general texture data storage file format ratified by the Khronos Group. As an
|
| +// overview, a KTX file contains all of the appropriate values needed to fully specify a
|
| +// texture in an OpenGL application, including the use of compressed data.
|
| +//
|
| +// A full format specification can be found here:
|
| +// http://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/
|
| +
|
| +class SkKTXFile {
|
| +public:
|
| + // The ownership of the data remains with the caller. This class is intended
|
| + // to be used as a logical wrapper around the data in order to properly
|
| + // access the pixels.
|
| + SkKTXFile(SkData* data)
|
| + : fData(data), fSwapBytes(false)
|
| + {
|
| + data->ref();
|
| + fValid = this->readKTXFile(fData->bytes(), fData->size());
|
| + }
|
| +
|
| + bool valid() const { return fValid; }
|
| +
|
| + int width() const { return static_cast<int>(fHeader.fPixelWidth); }
|
| + int height() const { return static_cast<int>(fHeader.fPixelHeight); }
|
| +
|
| + const uint8_t *pixelData(int mipmap = 0) const {
|
| + SkASSERT(!this->valid() || mipmap < fPixelData.count());
|
| + return this->valid() ? fPixelData[mipmap].data() : NULL;
|
| + }
|
| +
|
| + int numMipmaps() const { return static_cast<int>(fHeader.fNumberOfMipmapLevels); }
|
| +
|
| + bool isETC1() const;
|
| + bool isRGBA8() const;
|
| + bool isRGB8() const;
|
| +
|
| + static bool is_ktx(const uint8_t *data);
|
| + static bool is_ktx(SkStreamRewindable* stream);
|
| +
|
| +private:
|
| +
|
| + // The blob holding the file data.
|
| + SkAutoTUnref<SkData> fData;
|
| +
|
| + // This header captures all of the data that describes the format
|
| + // of the image data in a KTX file.
|
| + struct Header {
|
| + uint32_t fGLType;
|
| + uint32_t fGLTypeSize;
|
| + uint32_t fGLFormat;
|
| + uint32_t fGLInternalFormat;
|
| + uint32_t fGLBaseInternalFormat;
|
| + uint32_t fPixelWidth;
|
| + uint32_t fPixelHeight;
|
| + uint32_t fPixelDepth;
|
| + uint32_t fNumberOfArrayElements;
|
| + uint32_t fNumberOfFaces;
|
| + uint32_t fNumberOfMipmapLevels;
|
| + uint32_t fBytesOfKeyValueData;
|
| +
|
| + Header() { memset(this, 0, sizeof(*this)); }
|
| + } fHeader;
|
| +
|
| + // A Key Value pair stored in the KTX file. There may be
|
| + // arbitrarily many of these.
|
| + class KeyValue {
|
| + public:
|
| + KeyValue(size_t size) : fDataSz(size) { }
|
| + bool readKeyAndValue(const uint8_t *data);
|
| +
|
| + private:
|
| + const size_t fDataSz;
|
| + SkString fKey;
|
| + SkString fValue;
|
| + };
|
| +
|
| + // The pixel data for a single mipmap level in an image. Based on how
|
| + // the rest of the data is stored, this may be compressed, a cubemap, etc.
|
| + // The header will describe the format of this data.
|
| + class PixelData {
|
| + public:
|
| + PixelData(const uint8_t *ptr, size_t sz) : fDataSz(sz), fDataPtr(ptr) { }
|
| + const uint8_t *data() const { return fDataPtr; }
|
| + size_t dataSize() const { return fDataSz; }
|
| + private:
|
| + const size_t fDataSz;
|
| + const uint8_t *fDataPtr;
|
| + };
|
| +
|
| + // This function is only called once from the constructor. It loads the data
|
| + // and populates the appropriate fields of this class
|
| + // (fKeyValuePairs, fPixelData, fSwapBytes)
|
| + bool readKTXFile(const uint8_t *data, size_t dataLen);
|
| +
|
| + SkTArray<KeyValue> fKeyValuePairs;
|
| + SkTDArray<PixelData> fPixelData;
|
| + bool fValid;
|
| +
|
| + // If the endianness of the platform is different than the file,
|
| + // then we need to do proper byte swapping.
|
| + bool fSwapBytes;
|
| +
|
| + // Read an integer from a buffer, advance the buffer, and swap
|
| + // bytes if fSwapBytes is set
|
| + uint32_t readInt(const uint8_t** buf, size_t* bytesLeft) const;
|
| +};
|
| +
|
| +#endif // SkKTXFile_DEFINED
|
|
|