UNPKG

@u4/adbkit

Version:

A Typescript client for the Android Debug Bridge.

101 lines 3.63 kB
"use strict"; 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