image-in-browser
Version:
Package for encoding / decoding images, transforming images, applying filters, drawing primitives on images on the client side (no need for server Node.js)
327 lines • 12.5 kB
JavaScript
import { MathUtils } from '../common/math-utils.js';
import { LibError } from '../error/lib-error.js';
export var Format;
(function (Format) {
Format[Format["uint1"] = 0] = "uint1";
Format[Format["uint2"] = 1] = "uint2";
Format[Format["uint4"] = 2] = "uint4";
Format[Format["uint8"] = 3] = "uint8";
Format[Format["uint16"] = 4] = "uint16";
Format[Format["uint32"] = 5] = "uint32";
Format[Format["int8"] = 6] = "int8";
Format[Format["int16"] = 7] = "int16";
Format[Format["int32"] = 8] = "int32";
Format[Format["float16"] = 9] = "float16";
Format[Format["float32"] = 10] = "float32";
Format[Format["float64"] = 11] = "float64";
})(Format || (Format = {}));
export var FormatType;
(function (FormatType) {
FormatType[FormatType["uint"] = 0] = "uint";
FormatType[FormatType["int"] = 1] = "int";
FormatType[FormatType["float"] = 2] = "float";
})(FormatType || (FormatType = {}));
export const FormatToFormatType = new Map([
[Format.uint1, FormatType.uint],
[Format.uint2, FormatType.uint],
[Format.uint4, FormatType.uint],
[Format.uint8, FormatType.uint],
[Format.uint16, FormatType.uint],
[Format.uint32, FormatType.uint],
[Format.int8, FormatType.int],
[Format.int16, FormatType.int],
[Format.int32, FormatType.int],
[Format.float16, FormatType.float],
[Format.float32, FormatType.float],
[Format.float64, FormatType.float],
]);
export const FormatSize = new Map([
[Format.uint1, 1],
[Format.uint2, 1],
[Format.uint4, 1],
[Format.uint8, 1],
[Format.uint16, 2],
[Format.uint32, 4],
[Format.int8, 1],
[Format.int16, 2],
[Format.int32, 4],
[Format.float16, 2],
[Format.float32, 4],
[Format.float64, 8],
]);
export const FormatMaxValue = new Map([
[Format.uint1, 0x1],
[Format.uint2, 0x3],
[Format.uint4, 0xf],
[Format.uint8, 0xff],
[Format.uint16, 0xffff],
[Format.uint32, 0xffffffff],
[Format.int8, 0x7f],
[Format.int16, 0x7fff],
[Format.int32, 0x7fffffff],
[Format.float16, 1],
[Format.float32, 1],
[Format.float64, 1],
]);
export function getRowStride(width, numChannels, format) {
return format === Format.uint1
? Math.ceil((width * numChannels) / 8)
: format === Format.uint2
? Math.ceil((width * numChannels) / 4)
: format === Format.uint4
? Math.ceil((width * numChannels) / 2)
: width * numChannels * FormatSize.get(format);
}
export function convertFormatValue(value, from, to) {
if (from === to) {
return value;
}
switch (from) {
case Format.uint1:
return value === 0 ? 0 : FormatMaxValue.get(to);
case Format.uint2:
switch (to) {
case Format.uint1:
return value === 0 ? 0 : 1;
case Format.uint2:
return value;
case Format.uint4:
return value * 5;
case Format.uint8:
return value * 75;
case Format.uint16:
return value * 21845;
case Format.uint32:
return value * 1431655765;
case Format.int8:
return value * 42;
case Format.int16:
return value * 10922;
case Format.int32:
return value * 715827882;
case Format.float16:
case Format.float32:
case Format.float64:
return value / 3;
}
break;
case Format.uint4:
switch (to) {
case Format.uint1:
return value === 0 ? 0 : 1;
case Format.uint2:
return Math.trunc(value) >>> 1;
case Format.uint4:
return value;
case Format.uint8:
return value * 17;
case Format.uint16:
return value * 4369;
case Format.uint32:
return value * 286331153;
case Format.int8:
return value * 8;
case Format.int16:
return value * 2184;
case Format.int32:
return value * 143165576;
case Format.float16:
case Format.float32:
case Format.float64:
return value / 3;
}
break;
case Format.uint8:
switch (to) {
case Format.uint1:
return value === 0 ? 0 : 1;
case Format.uint2:
return Math.trunc(value) >>> 6;
case Format.uint4:
return Math.trunc(value) >>> 4;
case Format.uint8:
return value;
case Format.uint16:
return value * 257;
case Format.uint32:
return value * 16843009;
case Format.int8:
return Math.trunc(value) >>> 1;
case Format.int16:
return value * 128;
case Format.int32:
return value * 8421504;
case Format.float16:
case Format.float32:
case Format.float64:
return value / 255;
}
break;
case Format.uint16:
switch (to) {
case Format.uint1:
return value === 0 ? 0 : 1;
case Format.uint2:
return Math.trunc(value) >>> 14;
case Format.uint4:
return Math.trunc(value) >>> 12;
case Format.uint8:
return Math.trunc(value) >>> 8;
case Format.uint16:
return value;
case Format.uint32:
return Math.trunc(value) << 8;
case Format.int8:
return Math.trunc(value) >>> 9;
case Format.int16:
return Math.trunc(value) >>> 1;
case Format.int32:
return value * 524296;
case Format.float16:
case Format.float32:
case Format.float64:
return value / 0xffff;
}
break;
case Format.uint32:
switch (to) {
case Format.uint1:
return value === 0 ? 0 : 1;
case Format.uint2:
return Math.trunc(value) >>> 30;
case Format.uint4:
return Math.trunc(value) >>> 28;
case Format.uint8:
return Math.trunc(value) >>> 24;
case Format.uint16:
return Math.trunc(value) >>> 16;
case Format.uint32:
return value;
case Format.int8:
return Math.trunc(value) >>> 25;
case Format.int16:
return Math.trunc(value) >>> 17;
case Format.int32:
return Math.trunc(value) >>> 1;
case Format.float16:
case Format.float32:
case Format.float64:
return value / 0xffffffff;
}
break;
case Format.int8:
switch (to) {
case Format.uint1:
return value === 0 ? 0 : 1;
case Format.uint2:
return value <= 0 ? 0 : Math.trunc(value) >>> 5;
case Format.uint4:
return value <= 0 ? 0 : Math.trunc(value) >>> 3;
case Format.uint8:
return value <= 0 ? 0 : Math.trunc(value) << 1;
case Format.uint16:
return value <= 0 ? 0 : Math.trunc(value) * 516;
case Format.uint32:
return value <= 0 ? 0 : Math.trunc(value) * 33818640;
case Format.int8:
return value;
case Format.int16:
return value * 258;
case Format.int32:
return value * 16909320;
case Format.float16:
case Format.float32:
case Format.float64:
return value / 127;
}
break;
case Format.int16:
switch (to) {
case Format.uint1:
return value === 0 ? 0 : 1;
case Format.uint2:
return value <= 0 ? 0 : Math.trunc(value) >>> 15;
case Format.uint4:
return value <= 0 ? 0 : Math.trunc(value) >>> 11;
case Format.uint8:
return value <= 0 ? 0 : Math.trunc(value) >>> 7;
case Format.uint16:
return value <= 0 ? 0 : Math.trunc(value) << 1;
case Format.uint32:
return value <= 0 ? 0 : Math.trunc(value) * 131076;
case Format.int8:
return Math.trunc(value) >>> 8;
case Format.int16:
return value;
case Format.int32:
return Math.trunc(value) * 65538;
case Format.float16:
case Format.float32:
case Format.float64:
return value / 0x7fff;
}
break;
case Format.int32:
switch (to) {
case Format.uint1:
return value === 0 ? 0 : 1;
case Format.uint2:
return value <= 0 ? 0 : Math.trunc(value) >>> 29;
case Format.uint4:
return value <= 0 ? 0 : Math.trunc(value) >>> 27;
case Format.uint8:
return value <= 0 ? 0 : Math.trunc(value) >>> 23;
case Format.uint16:
return value <= 0 ? 0 : Math.trunc(value) >>> 16;
case Format.uint32:
return value <= 0 ? 0 : Math.trunc(value) << 1;
case Format.int8:
return Math.trunc(value) >>> 24;
case Format.int16:
return Math.trunc(value) >>> 16;
case Format.int32:
return value;
case Format.float16:
case Format.float32:
case Format.float64:
return value / 0x7fffffff;
}
break;
case Format.float16:
case Format.float32:
case Format.float64:
switch (to) {
case Format.uint1:
return value === 0 ? 0 : 1;
case Format.uint2:
return Math.trunc(MathUtils.clamp(value, 0, 1) * 3);
case Format.uint4:
return Math.trunc(MathUtils.clamp(value, 0, 1) * 15);
case Format.uint8:
return Math.trunc(MathUtils.clamp(value, 0, 1) * 255);
case Format.uint16:
return Math.trunc(MathUtils.clamp(value, 0, 1) * 0xffff);
case Format.uint32:
return Math.trunc(MathUtils.clamp(value, 0, 1) * 0xffffffff);
case Format.int8:
return Math.trunc(value < 0
? MathUtils.clamp(value, -1, 1) * 128
: MathUtils.clamp(value, -1, 1) * 127);
case Format.int16:
return Math.trunc(value < 0
? MathUtils.clamp(value, -1, 1) * 32768
: MathUtils.clamp(value, -1, 1) * 32767);
case Format.int32:
return Math.trunc(value < 0
? MathUtils.clamp(value, -1, 1) * 2147483648
: MathUtils.clamp(value, -1, 1) * 2147483647);
case Format.float16:
case Format.float32:
case Format.float64:
return value;
}
break;
}
throw new LibError('Unknown format.');
}
//# sourceMappingURL=format.js.map