import { loadKTX2 } from "../../Source/Cesium.js";
|
import { KTX2Transcoder } from "../../Source/Cesium.js";
|
import { PixelFormat } from "../../Source/Cesium.js";
|
import { Resource } from "../../Source/Cesium.js";
|
import { RuntimeError } from "../../Source/Cesium.js";
|
|
describe("Core/loadKTX2", function () {
|
it("throws with no url", function () {
|
expect(function () {
|
loadKTX2();
|
}).toThrowDeveloperError();
|
});
|
|
it("throws with unknown supported formats", function () {
|
expect(function () {
|
KTX2Transcoder.transcode(new Uint8Array());
|
}).toThrowDeveloperError();
|
});
|
|
it("throws if loadKTX2 is called with invalid url", function () {
|
var testUrl = "http://example.invalid/testuri";
|
var promise = loadKTX2(testUrl);
|
return promise
|
.then(function (value) {
|
fail();
|
})
|
.otherwise(function (error) {
|
expect(error).toBeDefined();
|
});
|
});
|
|
function expectKTX2TranscodeResult(
|
url,
|
supportedFormats,
|
width,
|
height,
|
isCompressed
|
) {
|
var resource = Resource.createIfNeeded(url);
|
var loadPromise = resource.fetchArrayBuffer();
|
return loadPromise.then(function (buffer) {
|
var promise = KTX2Transcoder.transcode(buffer, supportedFormats);
|
return promise.then(function (result) {
|
expect(result).toBeDefined();
|
expect(result.width).toEqual(width);
|
expect(result.height).toEqual(height);
|
expect(PixelFormat.isCompressedFormat(result.internalFormat)).toEqual(
|
isCompressed
|
);
|
expect(result.bufferView).toBeDefined();
|
});
|
});
|
}
|
|
it("transcodes ETC1S ktx2 to etc", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Green4x4_ETC1S.ktx2",
|
{ etc: true },
|
4,
|
4,
|
true
|
);
|
});
|
|
it("transcodes UASTC ktx2 to etc", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Logo32x32_UASTC_Zstd.ktx2",
|
{ etc: true },
|
32,
|
32,
|
true
|
);
|
});
|
|
it("transcodes ETC1S ktx2 to etc1", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Green4x4_ETC1S.ktx2",
|
{ etc1: true },
|
4,
|
4,
|
true
|
);
|
});
|
|
it("transcodes UASTC ktx2 to etc1", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Logo32x32_UASTC_Zstd.ktx2",
|
{ etc1: true },
|
32,
|
32,
|
true
|
);
|
});
|
|
it("transcodes ETC1S ktx2 to astc", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Green4x4_ETC1S.ktx2",
|
{ astc: true },
|
4,
|
4,
|
true
|
);
|
});
|
|
it("transcodes UASTC ktx2 to astc", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Logo32x32_UASTC_Zstd.ktx2",
|
{ astc: true },
|
32,
|
32,
|
true
|
);
|
});
|
|
it("transcodes ETC1S ktx2 to pvrtc", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Green4x4_ETC1S.ktx2",
|
{ pvrtc: true },
|
4,
|
4,
|
true
|
);
|
});
|
|
it("transcodes UASTC ktx2 to pvrtc", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Logo32x32_UASTC_Zstd.ktx2",
|
{ pvrtc: true },
|
32,
|
32,
|
true
|
);
|
});
|
|
it("transcodes ETC1S ktx2 to s3tc", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Green4x4_ETC1S.ktx2",
|
{ s3tc: true },
|
4,
|
4,
|
true
|
);
|
});
|
|
it("transcodes UASTC ktx2 to s3tc", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Logo32x32_UASTC_Zstd.ktx2",
|
{ s3tc: true },
|
32,
|
32,
|
true
|
);
|
});
|
|
it("transcodes ETC1S ktx2 to bc7", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Green4x4_ETC1S.ktx2",
|
{ bc7: true },
|
4,
|
4,
|
true
|
);
|
});
|
|
it("transcodes UASTC ktx2 to bc7", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Logo32x32_UASTC_Zstd.ktx2",
|
{ bc7: true },
|
32,
|
32,
|
true
|
);
|
});
|
|
it("returns a promise that resolves to an uncompressed texture", function () {
|
return expectKTX2TranscodeResult(
|
"./Data/Images/Green4x4.ktx2",
|
{ s3tc: true },
|
4,
|
4,
|
false
|
);
|
});
|
|
it("returns a promise that resolves to an uncompressed texture containing all mip levels of the original texture", function () {
|
var resource = Resource.createIfNeeded("./Data/Images/Green4x4Mipmap.ktx2");
|
var loadPromise = resource.fetchArrayBuffer();
|
return loadPromise.then(function (buffer) {
|
var promise = KTX2Transcoder.transcode(buffer, {});
|
return promise.then(function (resolvedValue) {
|
expect(resolvedValue).toBeDefined();
|
expect(resolvedValue.length).toEqual(3);
|
var dims = [4, 2, 1];
|
for (var i = 0; i < resolvedValue.length; ++i) {
|
expect(resolvedValue[i].width).toEqual(dims[i]);
|
expect(resolvedValue[i].height).toEqual(dims[i]);
|
expect(
|
PixelFormat.isCompressedFormat(resolvedValue[i].internalFormat)
|
).toEqual(false);
|
expect(resolvedValue[i].bufferView).toBeDefined();
|
}
|
});
|
});
|
});
|
|
it("returns a promise that resolves to a compressed texture containing all mip levels of the original texture", function () {
|
var resource = Resource.createIfNeeded(
|
"./Data/Images/Green4x4Mipmap_ETC1S.ktx2"
|
);
|
var loadPromise = resource.fetchArrayBuffer();
|
return loadPromise.then(function (buffer) {
|
var promise = KTX2Transcoder.transcode(buffer, { etc1: true });
|
return promise.then(function (resolvedValue) {
|
expect(resolvedValue).toBeDefined();
|
expect(resolvedValue.length).toEqual(3);
|
var dims = [4, 2, 1];
|
for (var i = 0; i < resolvedValue.length; ++i) {
|
expect(resolvedValue[i].width).toEqual(dims[i]);
|
expect(resolvedValue[i].height).toEqual(dims[i]);
|
expect(
|
PixelFormat.isCompressedFormat(resolvedValue[i].internalFormat)
|
).toEqual(true);
|
expect(resolvedValue[i].bufferView).toBeDefined();
|
}
|
});
|
});
|
});
|
|
it("cannot parse invalid KTX2 buffer", function () {
|
var invalidKTX = new Uint8Array([0, 1, 2, 3, 4, 5]);
|
var resolvedValue;
|
var rejectedError;
|
var promise = loadKTX2(invalidKTX.buffer);
|
return promise
|
.then(function (value) {
|
fail();
|
})
|
.otherwise(function (error) {
|
rejectedError = error;
|
expect(resolvedValue).toBeUndefined();
|
expect(rejectedError).toBeInstanceOf(RuntimeError);
|
expect(rejectedError.message).toEqual("Invalid KTX2 file.");
|
});
|
});
|
|
it("3D textures are unsupported", function () {
|
var resource = Resource.createIfNeeded("./Data/Images/Green4x4.ktx2");
|
var loadPromise = resource.fetchArrayBuffer();
|
return loadPromise.then(function (buffer) {
|
var invalidKTX = new Uint32Array(buffer);
|
invalidKTX[7] = 2; // Uint32 pixelDepth
|
|
var resolvedValue;
|
var rejectedError;
|
var promise = loadKTX2(invalidKTX.buffer);
|
return promise
|
.then(function (value) {
|
fail();
|
})
|
.otherwise(function (error) {
|
rejectedError = error;
|
expect(resolvedValue).toBeUndefined();
|
expect(rejectedError).toBeInstanceOf(RuntimeError);
|
expect(rejectedError.message).toEqual(
|
"KTX2 3D textures are unsupported."
|
);
|
});
|
});
|
});
|
|
it("texture arrays are unsupported", function () {
|
var resource = Resource.createIfNeeded("./Data/Images/Green4x4.ktx2");
|
var loadPromise = resource.fetchArrayBuffer();
|
return loadPromise.then(function (buffer) {
|
var invalidKTX = new Uint32Array(buffer);
|
invalidKTX[8] = 15; // Uint32 layerCount
|
|
var resolvedValue;
|
var rejectedError;
|
var promise = loadKTX2(invalidKTX.buffer);
|
return promise
|
.then(function (value) {
|
fail();
|
})
|
.otherwise(function (error) {
|
rejectedError = error;
|
expect(resolvedValue).toBeUndefined();
|
expect(rejectedError).toBeInstanceOf(RuntimeError);
|
expect(rejectedError.message).toEqual(
|
"KTX2 texture arrays are not supported."
|
);
|
});
|
});
|
});
|
});
|