@u4/adbkit
Version:
A Typescript client for the Android Debug Bridge.
101 lines • 3.63 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const child_process_1 = require("child_process");
const rgbtransform_1 = __importDefault(require("../../framebuffer/rgbtransform"));
const command_1 = __importDefault(require("../../command"));
const utils_1 = __importDefault(require("../../utils"));
const debug = utils_1.default.debug('adb:command:framebuffer');
class FrameBufferCommand extends command_1.default {
async execute(format) {
await this._send('framebuffer:');
await this.readOKAY();
const header = await this.parser.readBytes(52);
let stream;
const meta = this._parseHeader(header);
switch (format) {
case 'raw':
stream = this.parser.raw();
stream.meta = meta;
return stream;
default:
stream = this._convert(meta, format);
stream.meta = meta;
return stream;
}
}
_convert(meta, format, raw) {
debug(`Converting raw framebuffer stream into ${format.toUpperCase()}`);
switch (meta.format) {
case 'rgb':
case 'rgba':
break;
default:
// Known to be supported by GraphicsMagick
debug(`Silently transforming '${meta.format}' into 'rgb' for \`gm\``);
const transform = new rgbtransform_1.default(meta);
meta.format = 'rgb';
raw = this.parser.raw().pipe(transform);
}
const proc = (0, child_process_1.spawn)('gm', ['convert', '-size', `${meta.width}x${meta.height}`, `${meta.format}:-`, `${format}:-`]);
if (raw) {
raw.pipe(proc.stdin);
}
return proc.stdout;
}
_parseHeader(header) {
let offset = 0;
const version = header.readUInt32LE(offset);
if (version === 16) {
throw new Error('Old-style raw images are not supported');
}
offset += 4;
const bpp = header.readUInt32LE(offset);
offset += 4;
const size = header.readUInt32LE(offset);
offset += 4;
const width = header.readUInt32LE(offset);
offset += 4;
const height = header.readUInt32LE(offset);
offset += 4;
const red_offset = header.readUInt32LE(offset);
offset += 4;
const red_length = header.readUInt32LE(offset);
offset += 4;
const blue_offset = header.readUInt32LE(offset);
offset += 4;
const blue_length = header.readUInt32LE(offset);
offset += 4;
const green_offset = header.readUInt32LE(offset);
offset += 4;
const green_length = header.readUInt32LE(offset);
offset += 4;
const alpha_offset = header.readUInt32LE(offset);
offset += 4;
const alpha_length = header.readUInt32LE(offset);
let format = blue_offset === 0 ? 'bgr' : 'rgb';
if (bpp === 32 || alpha_length) {
format += 'a';
}
return {
version,
bpp,
size,
width,
height,
red_offset,
red_length,
blue_offset,
blue_length,
green_offset,
green_length,
alpha_offset,
alpha_length,
format: format,
};
}
}
exports.default = FrameBufferCommand;
//# sourceMappingURL=framebuffer.js.map