@logitech-mx-creative-console/core
Version:
An npm module for interfacing with the Logitech MX Creative Console
43 lines • 2.16 kB
JavaScript
export function transformImageBuffer(imageBuffer, sourceOptions, targetOptions, destPadding, imageWidth, imageHeight) {
const imageBufferView = uint8ArrayToDataView(imageBuffer);
const byteBuffer = new Uint8Array(destPadding + imageWidth * imageHeight * targetOptions.colorMode.length);
const byteBufferView = uint8ArrayToDataView(byteBuffer);
const flipColours = sourceOptions.format.substring(0, 3) !== targetOptions.colorMode.substring(0, 3);
for (let y = 0; y < imageHeight; y++) {
const rowOffset = destPadding + imageWidth * targetOptions.colorMode.length * y;
for (let x = 0; x < imageWidth; x++) {
// Apply x/y flips
let x2 = targetOptions.xFlip ? imageWidth - x - 1 : x;
let y2 = targetOptions.yFlip ? imageHeight - y - 1 : y;
if (targetOptions.rotate) {
// Swap x and y
const tmpX = x2;
x2 = y2;
y2 = tmpX;
}
const srcOffset = y2 * sourceOptions.stride + sourceOptions.offset + x2 * sourceOptions.format.length;
const red = imageBufferView.getUint8(srcOffset);
const green = imageBufferView.getUint8(srcOffset + 1);
const blue = imageBufferView.getUint8(srcOffset + 2);
const targetOffset = rowOffset + x * targetOptions.colorMode.length;
if (flipColours) {
byteBufferView.setUint8(targetOffset, blue);
byteBufferView.setUint8(targetOffset + 1, green);
byteBufferView.setUint8(targetOffset + 2, red);
}
else {
byteBufferView.setUint8(targetOffset, red);
byteBufferView.setUint8(targetOffset + 1, green);
byteBufferView.setUint8(targetOffset + 2, blue);
}
if (targetOptions.colorMode.length === 4) {
byteBufferView.setUint8(targetOffset + 3, 255);
}
}
}
return byteBuffer;
}
export function uint8ArrayToDataView(buffer) {
return new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
}
//# sourceMappingURL=util.js.map