AssetStudio/Texture2DDecoder/Texture2DDecoder.cpp

149 lines
5.7 KiB
C++

#include <string.h>
#include "Texture2DDecoder.h"
#include "bcn.h"
#include "pvrtc.h"
#include "etc.h"
#include "atc.h"
#include "astc.h"
#include "crunch.h"
#include "unitycrunch.h"
namespace Texture2DDecoder {
bool TextureDecoder::DecodeDXT1(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_bc1(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeDXT5(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_bc3(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodePVRTC(array<Byte>^ data, long w, long h, array<Byte>^ image, bool is2bpp) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_pvrtc(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin), is2bpp ? 1 : 0);
}
bool TextureDecoder::DecodeETC1(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_etc1(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeETC2(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_etc2(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeETC2A1(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_etc2a1(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeETC2A8(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_etc2a8(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeEACR(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_eacr(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeEACRSigned(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_eacr_signed(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeEACRG(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_eacrg(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeEACRGSigned(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_eacrg_signed(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeBC4(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_bc4(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeBC5(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_bc5(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeBC6(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_bc6(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeBC7(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_bc7(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeATCRGB4(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_atc_rgb4(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeATCRGBA8(array<Byte>^ data, long w, long h, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_atc_rgba8(dataPin, w, h, reinterpret_cast<uint32_t*>(imagePin));
}
bool TextureDecoder::DecodeASTC(array<Byte>^ data, long w, long h, int bw, int bh, array<Byte>^ image) {
pin_ptr<unsigned char> dataPin = &data[0];
pin_ptr<unsigned char> imagePin = &image[0];
return decode_astc(dataPin, w, h, bw, bh, reinterpret_cast<uint32_t*>(imagePin));
}
array<Byte>^ TextureDecoder::UnpackCrunch(array<Byte>^ data) {
pin_ptr<unsigned char> dataPin = &data[0];
void* ret;
uint32_t retSize;
if (!crunch_unpack_level(dataPin, data->Length, 0, &ret, &retSize)) {
return nullptr;
}
auto buff = gcnew array<Byte>(retSize);
pin_ptr<unsigned char> buffPin = &buff[0];
memcpy(buffPin, ret, retSize);
delete ret;
return buff;
}
array<Byte>^ TextureDecoder::UnpackUnityCrunch(array<Byte>^ data) {
pin_ptr<unsigned char> dataPin = &data[0];
void* ret;
uint32_t retSize;
if (!unity_crunch_unpack_level(dataPin, data->Length, 0, &ret, &retSize)) {
return nullptr;
}
auto buff = gcnew array<Byte>(retSize);
pin_ptr<unsigned char> buffPin = &buff[0];
memcpy(buffPin, ret, retSize);
delete ret;
return buff;
}
}