2024-07-16 08:29:52 -04:00
|
|
|
import { Size, Rect } from './VMDisplay.js';
|
2024-06-20 03:20:56 -04:00
|
|
|
import sharp from 'sharp';
|
2024-06-22 21:14:05 -04:00
|
|
|
import * as cvm from '@cvmts/cvm-rs';
|
2024-04-24 04:18:05 -04:00
|
|
|
|
|
|
|
|
// A good balance. TODO: Configurable?
|
|
|
|
|
let gJpegQuality = 35;
|
|
|
|
|
|
2024-06-20 03:20:56 -04:00
|
|
|
const kThumbnailSize: Size = {
|
|
|
|
|
width: 400,
|
|
|
|
|
height: 300
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// this returns appropiate Sharp options to deal with CVMTS raw framebuffers
|
|
|
|
|
// (which are RGBA bitmaps, essentially. We probably should abstract that out but
|
|
|
|
|
// that'd mean having to introduce that to rfb and oihwekjtgferklds;./tghnredsltg;erhds)
|
|
|
|
|
function GetRawSharpOptions(size: Size): sharp.CreateRaw {
|
|
|
|
|
return {
|
|
|
|
|
width: size.width,
|
|
|
|
|
height: size.height,
|
|
|
|
|
channels: 4
|
|
|
|
|
};
|
|
|
|
|
}
|
2024-04-24 04:18:05 -04:00
|
|
|
|
2024-06-20 03:20:56 -04:00
|
|
|
export class JPEGEncoder {
|
2024-04-24 04:18:05 -04:00
|
|
|
static SetQuality(quality: number) {
|
|
|
|
|
gJpegQuality = quality;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-20 03:20:56 -04:00
|
|
|
static async Encode(canvas: Buffer, displaySize: Size, rect: Rect): Promise<Buffer> {
|
2024-04-24 04:18:05 -04:00
|
|
|
let offset = (rect.y * displaySize.width + rect.x) * 4;
|
2024-06-22 21:14:05 -04:00
|
|
|
return cvm.jpegEncode({
|
2024-04-24 04:18:05 -04:00
|
|
|
width: rect.width,
|
|
|
|
|
height: rect.height,
|
|
|
|
|
stride: displaySize.width,
|
2024-06-20 03:20:56 -04:00
|
|
|
buffer: canvas.subarray(offset)
|
2024-04-24 04:18:05 -04:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-20 03:20:56 -04:00
|
|
|
static async EncodeThumbnail(buffer: Buffer, size: Size): Promise<Buffer> {
|
|
|
|
|
let { data, info } = await sharp(buffer, { raw: GetRawSharpOptions(size) })
|
|
|
|
|
.resize(kThumbnailSize.width, kThumbnailSize.height, { fit: 'fill' })
|
|
|
|
|
.raw()
|
|
|
|
|
.toBuffer({ resolveWithObject: true });
|
|
|
|
|
|
2024-06-22 21:14:05 -04:00
|
|
|
return cvm.jpegEncode({
|
2024-06-20 03:20:56 -04:00
|
|
|
width: kThumbnailSize.width,
|
|
|
|
|
height: kThumbnailSize.height,
|
|
|
|
|
stride: kThumbnailSize.width,
|
|
|
|
|
buffer: data
|
2024-04-24 04:18:05 -04:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|