OpenTUI 0.5.10
Added
- core:
NativeImage.fromPixels(pixels, width, height, options?)creates an image from raw pixels.PixelImportOptionssetsformat,stride,alpha, andcolorSpace. See NativeImage. (#1467) - core:
NativeImagePoolreuses native image buffers for frames of a fixed size. UsepublishPixels()orpublishRgba()to publish a frame anddispose()to release the pool. See NativeImage. (#1467) - core:
CliRendererConfig.kittyImageTransportandrenderer.kittyImageTransportselect the Kitty image transport:"raw","zlib", or"file". Raw is the default. File transport is opt-in and is used only on terminals that acknowledge image uploads. See Image. (#1467) - core:
renderer.kittyImageTransportStatusreports the requested and effective transport, the file transport state, the fallback reason, and the pending bytes and files.renderer.cancelKittyImageTransport()cancels pending file transport. See Image. (#1467) - native: Release builds now publish
.debug,.dSYM, and.pdbsymbol files as separate GitHub Release assets. See Native crash debugging. (#1437)
Changed
- core: Image streaming uses less CPU for frame preparation and transport. Pending frames are bounded when terminal output stalls. See Image. (#1467)
- core: The renderer shows Kitty and Sixel images in scrollback before the footer is pinned, if the images fit above the pinned footer. They no longer fall back to blocks during startup and after a resize. See Renderer. (#1470)
- core:
ImageErrorCodeincludes"busy". See NativeImage. (#1467) - native: The npm packages ship stripped native libraries. The Linux library shrinks from about 26 MB to about 6 MB. Debug builds are unchanged. See Native crash debugging. (#1437)
Fixed
- core:
MarkdownRenderablekeeps its response visible whenstreamingchanges fromtruetofalse. Compatible top-level blocks are refreshed in place, not destroyed and recreated. See Markdown. (#1469) - core: The renderer retries the final automatic animation frame when threaded output rejects it under backpressure. Before, the previous frame stayed on screen. See Renderer. (#1457)
- core: Image rendering no longer grows GPU resources on every frame or retains native handles during sustained rendering. See Image. (#1467)
API changes#
@opentui/core#
Added
class NativeImagePoolconstructor NativeImagePool(options: NativeImagePoolOptions)interface KittyImageTransportStatusinterface NativeImagePoolOptionsinterface PixelImportOptionsmethod CliRenderer.cancelKittyImageTransport(): voidstatic method NativeImage.fromPixels(pixels: Uint8Array, width: number, height: number, options?: PixelImportOptions): NativeImageproperty CliRenderer.kittyImageTransport: KittyImageTransportreadonly property CliRenderer.kittyImageTransportStatus: KittyImageTransportStatusproperty CliRendererConfig.kittyImageTransport?: KittyImageTransportproperty RenderLib.cancelKittyImageTransport: (renderer: RendererHandle, failed: boolean) => voidproperty RenderLib.getKittyImageTransport: (renderer: RendererHandle) => Uint32Arrayproperty RenderLib.imageCreateFromPixels: (pixels: Uint8Array, width: number, height: number, stride: number, format: number, alpha: number) => { status: number; handle: ImageHandle | null; }property RenderLib.imageUpdatePixels: (image: ImageHandle, pixels: Uint8Array, stride: number, format: number, alpha: number) => numberproperty RenderLib.pollKittyImageTransport: (renderer: RendererHandle) => booleanproperty RenderLib.processKittyImageReply: (renderer: RendererHandle, response: string) => numberproperty RenderLib.setKittyImageTransport: (renderer: RendererHandle, mode: number) => booleantype KittyImageTransport = "raw" | "zlib" | "file"
Changed
property RenderLib.commitSplitFooterSnapshot: (renderer: RendererHandle, snapshot: OptimizedBuffer, rowColumns: number, startOnNewLine: boolean, trailingNewline: boolean, pinnedRenderOffset: number, force: boolean, beginFrame?: boolean, finalizeFrame?: boolean) => NativeRenderOperationResultproperty RenderLib.commitSplitFooterSnapshot: (renderer: RendererHandle, snapshot: OptimizedBuffer, rowColumns: number, startOnNewLine: boolean, trailingNewline: boolean, pinnedRenderOffset: number, force: boolean, beginFrame?: boolean, finalizeFrame?: boolean, controlOutput?: boolean) => NativeRenderOperationResulttype ImageErrorCode = "invalid-handle" | "unsupported-format" | "unsupported-color-space" | "malformed-data" | "dimension-limit" | "memory-limit" | "invalid-argument" | "out-of-memory" | "output-too-small" | "internal-error" | "unsupported-feature"type ImageErrorCode = "invalid-handle" | "unsupported-format" | "unsupported-color-space" | "malformed-data" | "dimension-limit" | "memory-limit" | "invalid-argument" | "out-of-memory" | "output-too-small" | "internal-error" | "unsupported-feature" | "busy"