Start adding ktx file support.

pull/216/head
castano 13 years ago
parent 765a0e394a
commit ad7a618222

@ -5,11 +5,12 @@ SET(IMAGE_SRCS
BlockDXT.h BlockDXT.cpp BlockDXT.h BlockDXT.cpp
ColorBlock.h ColorBlock.cpp ColorBlock.h ColorBlock.cpp
DirectDrawSurface.h DirectDrawSurface.cpp DirectDrawSurface.h DirectDrawSurface.cpp
ErrorMetric.h ErrorMetric.cpp
Filter.h Filter.cpp Filter.h Filter.cpp
FloatImage.h FloatImage.cpp FloatImage.h FloatImage.cpp
ErrorMetric.h ErrorMetric.cpp
Image.h Image.cpp Image.h Image.cpp
ImageIO.h ImageIO.cpp ImageIO.h ImageIO.cpp
#KtxFile.h KtxFile.cpp
NormalMap.h NormalMap.cpp NormalMap.h NormalMap.cpp
PixelFormat.h PixelFormat.h
PsdFile.h PsdFile.h

@ -0,0 +1,83 @@
// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
#include "KtxFile.h"
using namespace nv;
static const uint8 fileIdentifier[12] = {
0xAB, 0x4B, 0x54, 0x58,
0x20, 0x31, 0x31, 0xBB,
0x0D, 0x0A, 0x1A, 0x0A
};
KtxHeader::KtxHeader() {
memcpy(identifier, fileIdentifier, 12);
endianness = 0x04030201;
glType = 0;
glTypeSize = 1;
glFormat = 0;
glInternalFormat = KTX_RGBA;
glBaseInternalFormat = KTX_RGBA;
pixelWidth = 0;
pixelHeight = 0;
pixelDepth = 0;
numberOfArrayElements = 0;
numberOfFaces = 1;
numberOfMipmapLevels = 0;
bytesOfKeyValueData = 0;
}
Stream & operator<< (Stream & s, DDSHeader & header) {
s.serialize(header.identifier, 12);
s << header.endiannes << header.glType << header.glTypeSize << header.glFormat << header.glInternalFormat << header.glBaseInternalFormat;
s << header.pixelWidth << header.pixelHeight << header.pixelDepth;
s << header.numberOfArrayElements << header.numberOfFaces << header.numberOfMipmapLevels;
s << header.bytesOfKeyValueData;
return s;
}
KtxFile::KtxFile() {
}
KtxFile::~KtxFile() {
}
void KtxFile::addKeyValue(const char * key, const char * value) {
keyArray.append(key);
valueArray.append(value);
bytesOfKeyValueData += strlen(key) + 1 + strlen(value) + 1;
}
Stream & operator<< (Stream & s, KtxFile & file) {
s << header;
if (s.isSaving()) {
int keyValueCount = keyArray.count();
for (int i = 0; i < keyValueCount; i++) {
const String & key = keyArray[i];
const String & value = valueArray[i];
uint keySize = key.length() + 1;
uint valueSize = value.length() + 1;
uint keyValueSize = keySize + valueSize;
s << keyValueSize;
s.serialize(key.str(), keySize);
s.serialize(value.str(), valueSize);
}
}
else {
// @@ Read key value pairs.
}
return s;
}

@ -0,0 +1,102 @@
// This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
#pragma once
#ifndef NV_IMAGE_KTXFILE_H
#define NV_IMAGE_KTXFILE_H
#include "nvimage.h"
#include "nvcore/StrLib.h"
// KTX File format specification:
// http://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/#key
namespace nv
{
class Stream;
// GL types (Table 3.2)
const uint KTX_UNSIGNED_BYTE;
const uint KTX_UNSIGNED_SHORT_5_6_5;
// ...
// GL formats (Table 3.3)
// ...
// GL internal formats (Table 3.12, 3.13)
// ...
// GL base internal format. (Table 3.11)
const uint KTX_RGB;
const uint KTX_RGBA;
const uint KTX_ALPHA;
// ...
struct KtxHeader {
uint8 identifier[12];
uint32 endianness;
uint32 glType;
uint32 glTypeSize;
uint32 glFormat;
uint32 glInternalFormat;
uint32 glBaseInternalFormat;
uint32 pixelWidth;
uint32 pixelHeight;
uint32 pixelDepth;
uint32 numberOfArrayElements;
uint32 numberOfFaces;
uint32 numberOfMipmapLevels;
uint32 bytesOfKeyValueData;
KtxHeader();
};
NVIMAGE_API Stream & operator<< (Stream & s, DDSHeader & header);
struct KtxFile {
KtxFile();
~KtxFile();
void addKeyValue(const char * key, const char * value);
private:
KtxHeader header;
Array<String> keyArray;
Array<String> valueArray;
};
NVIMAGE_API Stream & operator<< (Stream & s, KtxFile & file);
/*
for each keyValuePair that fits in bytesOfKeyValueData
UInt32 keyAndValueByteSize
Byte keyAndValue[keyAndValueByteSize]
Byte valuePadding[3 - ((keyAndValueByteSize + 3) % 4)]
end
for each mipmap_level in numberOfMipmapLevels*
UInt32 imageSize;
for each array_element in numberOfArrayElements*
for each face in numberOfFaces
for each z_slice in pixelDepth*
for each row or row_of_blocks in pixelHeight*
for each pixel or block_of_pixels in pixelWidth
Byte data[format-specific-number-of-bytes]**
end
end
end
Byte cubePadding[0-3]
end
end
Byte mipPadding[3 - ((imageSize + 3) % 4)]
end
*/
} // nv namespace
#endif // NV_IMAGE_KTXFILE_H
Loading…
Cancel
Save