MAL to MSL
[fanfix.git] / docs / images.md
CommitLineData
930d75f0 1Terminal Emulator Multimedia Standard - Proposed Design
5a16a542
KL
2=======================================================
3
930d75f0
KL
4Version: 1
5
6
5a16a542
KL
7
8Purpose
9-------
10
930d75f0
KL
11Multiple standards exist to incorporate image data in text-based
12terminals and terminal emulators. Few standards have wide adoption
13despite frequent user requests for these features and hardware support
14for several of the standards.
15
16A group including developers of several widely-used terminal emulators
17has been working on defining the needs and limitations for a standard
18that can be implemented in current-gen terminal emulators. The
19discussion has been primarily captured here:
20https://gitlab.freedesktop.org/terminal-wg/specifications/issues/12
21
22This document collects many of the reported desires and practical
23constraints of that discussion into a proposed standard that
24encompasses three independent new features:
25
261. A method to transfer multimedia data for immediate display within
27 the screen cell grid ("Direct Multimedia").
28
292. A method to transfer multimedia data to a terminal-managed cache,
30 and later display that data within the screen cell grid ("Cached
31 Multimedia").
32
333. A method to assign cell data to different layers with options for
34 both layer and cell transparency ("Layers").
35
36A terminal may implement any combination of these features
37independently of each other. If all features are supported, then all
38of the design goals outlined in this document can be met.
39
40The same mechanisms that can put raster-based images on the screen are
41also readily generalizable to other media types such as vector-based
42images and animations. This document is thus a "multimedia" proposal
43rather than a "simple images" proposal.
5a16a542 44
5a16a542
KL
45
46
47Acknowledgements
48----------------
49
50This proposal has been informed from the following prior work:
51
52* DEC VT300 series sixel graphics standard:
53 https://vt100.net/docs/vt3xx-gp/chapter14.html
54
55* iTerm2 image protocol:
56 https://iterm2.com/documentation-images.html
57
58* Kitty image protocol:
5172fe03 59 https://sw.kovidgoyal.net/kitty/graphics-protocol.html
5a16a542
KL
60
61* Jexer Terminal User Interface:
62 https://gitlab.com/klamonte/jexer
63
64
930d75f0 65
5a16a542
KL
66Design Goals - Core
67-------------------
68
69The core ("must-have") design goals are:
70
71* Be easy to implement in existing terminals and applications:
72
73 - Sacrifice "10%" of potential function to eliminate "90%" of
74 implementation pain. "Less is more."
75
76 - Be a strict superset of the existing iTerm2 and DEC sixel image
77 solutions. One should be able to take an existing terminal or
78 application that emits/consumes iTerm2 or sixel sequences, and
79 only change the control sequence introducer/termination to achieve
80 the same effect as a terminal/application that conforms with this
81 standard.
82
83* Have no ambiguity. If two terminal or application developers can
84 read this document and reach different conclusions on what should be
85 on the screen, then an error exists in this document that must be
930d75f0 86 corrected.
5a16a542 87
895440f3 88 - Every feature must be straightforward to validate via automated
5a16a542
KL
89 unit testing.
90
895440f3
KL
91 - Every conformant terminal must produce the same output (pixels on
92 screen) given the same input (terminal font, terminal sequences).
5a16a542
KL
93
94 - Every option must have a defined default value.
95
96 - Erroneous sequences must have defined expected results.
97
98 - Every operation must act atomically: either everything worked
930d75f0
KL
99 (image is on screen, cursor has moved, terminal state has changed,
100 etc.) or nothing did.
101
102* Integrate with existing ECMA-48 / ANSI X3.64 defined sequences:
103
104 - Operations on Tiles/Cells containing text will have the same
105 effect when applied to Tiles/Cells containing image data.
106
107 - Existing sequences are given new parameters to cover needed
108 features rather than entirely new sequences introduced.
5a16a542
KL
109
110* Be straightforward to implement in non-"physical" terminals,
111 including:
112
113 - Future versions of terminal control libraries such as ncurses and
114 termbox.
115
116 - Terminal multiplexers that support "headless" terminals (no
117 physical screen) and "multi-head" terminals (many different
118 physical screens).
119
120* Be platform-agnostic, and easy to implement on (at the least):
121 POSIX, Windows, and web.
122
123 - All features must be available even if the only means of
124 communication between the application and terminal is control
125 sequences (e.g. no shared disk, no shared memory, no shared DOM,
126 etc.).
127
128* Support graceful fallback:
129
130 - Terminal emulators and physical terminals that do not support this
131 standard should remain usable with no undefined screen artifacts,
132 even when the application blindly emits these sequences to those
133 terminals.
134
135 - This standard must able to be versioned for future enhancements.
136
137 - An application must be able to detect that its terminal supports
138 this standard, and at what version.
139
140* Support secure programming practices:
141
142 - Applications must not be able to obtain unauthorized data from
143 terminal memory, such as: images emitted by other applications
144 still present in the terminal's scrollback buffer, terminal or
145 system memory limits.
146
147 - Applications must not be able to compromise the terminal through
148 denial-of-service such as: excessive memory usage, unterminated
149 control sequences. Similarly, terminals must not be able to
150 compromise application through their responses to application
151 queries.
152
153 - Applications must not be able to manipulate the terminal into
154 performing an insecure operation such as: reading arbitrary shared
155 memory regions, reading arbitrary files on disk, deleting
156 arbitrary files on disk, etc. Similarly, terminals must not be
157 able to manipulate applications into performing insecure
158 operations.
159
160 - This standard must be implementable when the terminal has a fixed
161 maximum memory, such as a kernel-level device driver.
162
163
164
165Design Goals - Secondary
166------------------------
167
5172fe03
KL
168The secondary ("nice-to-have") design goals are listed below. These
169might not all be possible, but will kept in mind:
5a16a542
KL
170
171* Minimal redundant network traffic for on-screen data that is
172 repeated: either on screen in multiple places, or in the same place
173 but refreshed multiple times.
174
175* Asynchronous notification from terminal to application that the
176 screen has been changed by outside or user action. Examples: font
177 change, session detach/attach, user changed image preferences.
178
5172fe03
KL
179* The ability for a multiplexer to "pass-thru" the image drawing
180 sequence to its "outer" terminal, with some support for limited
181 clipping.
182
183
5a16a542
KL
184
185Out Of Scope
186------------
187
930d75f0 188The following items are out of scope:
5a16a542
KL
189
190* Bidirectional output. Applications are expected to generate Tiles
191 and place them on screen where they need. The cursor response to
930d75f0
KL
192 image sequences are defined as left-to-right-top-to-bottom,
193 consistent with ECMA-48 / ANSI X3.64 sequences. An independent BIDI
194 standard is free to apply whatever solution will work for ECMA-48 /
195 ANSI X3.64 sequences to the sequences described in this document.
5a16a542 196
930d75f0
KL
197* Capabilities. This standard defines a limited number of new
198 terminal reports and responses. These are not intended to be used
199 as a general-purpose capabilities model.
5a16a542
KL
200
201
202
203Definitions
204-----------
205
206Terminal - The hardware, or a program that simulates hardware,
207 comprising a keyboard, screen, and mouse.
208
209Application - A program that utilizes the terminal for its
210 input/output with the user.
211
212Multiplexer - A special case of an application that simulates one or
213 more "inner" terminals for other applications to use,
214 and composes these inner terminals into a combined
215 screen to emit to one or more "outer" terminals that
216 obtain input/output from the user. Multiplexers are
217 thus both applications and terminals.
218
5172fe03
KL
219X - The column coordinate of a cell. This standard is 1-based (like
220 ECMA-48): the left-most column of the screen is numbered 1.
5a16a542 221
5172fe03
KL
222Y - The row coordinate of a cell. This standard is 1-based (like
223 ECMA-48): the top-most row of the screen is numbered 1.
5a16a542
KL
224
225Z - The layer that text or multimedia is placed on. This proposal
5172fe03 226 uses a right-hand coordinate system with (X, Y, Z) = (1, 1, 1)
930d75f0 227 defined as the top-left corner on the default layer; positive Z
5a16a542
KL
228 projects "away" from the user and "into" or "behind" the screen.
229 Rendering the Cells on the screen must produce the same result as
930d75f0 230 painter's algorithm (see "Layers - Rendering" section below).
5a16a542
KL
231
232Cell - A fixed-width-and-height rectangle on the screen. The cells of
233 the screen are arranged in a grid of X columns and Y rows. A
930d75f0
KL
234 Cell has dimensions of cellWidth and cellHeight pixels. Every
235 Cell has a coordinate of (X, Y) (or (X, Y, Z) when the terminal
236 supports the layers feature).
5a16a542
KL
237
238Tile - One or more contiguous Cells with data to be displayed. The
239 data can be text or image data, but not both. A Tile has width
240 of 1, 2, or more, and a coordinate of (X, Y, Z) that is the
241 same as its left-most (first) Cell's (X, Y, Z). In practice,
242 Tiles are typically one Cell wide for ASCII and Latin language
243 glyphs, and two Cells wide for "fullwidth" glyphs as used in
244 Asian langauges, emojis, and symbols. This standard does not
245 preclude Tiles from encompassing entire grapheme clusters.
930d75f0
KL
246 Note that ECMA-48 / ANSI X3.64 operations are performed against
247 Tiles, not Cells: if a 2-Cell-wide Tile is deleted via
248 backspace, then the cursor will decrement on screen by two
249 columns.
5a16a542
KL
250
251Layer - A screen-sized grid of Cells that have the same Z coordinate.
252 Layers are drawn to the screen in descending Z order. Layers
253 may have optional additional attributes such as transparency.
930d75f0
KL
254 Layer support is an orthogonal (independent) option to
255 multimedia support. It is acceptable for terminals to support
256 multimedia without layers and vice versa.
257
258
259
260
261All Features - Detection
262------------------------
263
264Applications can detect support for these features using Primary
265Device Attributes (DA) and DECID (ESC Z, or 0x9A).
266
267Terminals that support this standard will repond with additional
268parameter(s): "224" for direct multimedia, "225" for cached
269multimedia, and "226" for layers. A recap of the parameters xterm
270supports is listed below, with these new feature responses included:
271
272| VT220 (and higher) Response | Description |
273|-----------------------------|--------------------------------------------|
274| 1 | 132-columns |
275| 2 | Printer |
276| 3 | ReGIS graphics |
277| 4 | Sixel graphics |
278| 6 | Selective erase |
279| 8 | User-defined keys |
280| 9 | National Replacement Character sets |
281| 1 5 | Technical characters |
282| 1 6 | Locator port |
283| 1 7 | Terminal state interrogation |
284| 1 8 | User windows |
285| 2 1 | Horizontal scrolling |
286| 2 2 | ANSI color, e.g., VT525 |
287| 2 8 | Rectangular editing |
288| 2 9 | ANSI text locator (i.e., DEC Locator mode) |
289| 2 2 4 | Direct Multimedia Version 1 |
290| 2 2 5 | Cached Multimedia Version 1 |
291| 2 2 6 | Layers |
292
293
294
295Direct Multimedia - Summary
296---------------------------
297
298
299
300Direct Multimedia - Required Support For Existing Sequences
301-----------------------------------------------------------
302
303A terminal with direct multimedia feature must support the following
304defined xterm sequences:
305
306| Sequence | Description |
307|----------------|-----------------------------------------------------|
308| CSI 16 t | Responds with CSI 6 ; cellHeight ; cellWidth t |
309| CSI 18 t | Responds with CSI 8 ; rows ; columns t |
310
311
312
313Direct Multimedia - New Sequences
314---------------------------------
315
316
317
318Direct Multimedia - Error Handling
319----------------------------------
320
321
322
323Direct Multimedia - Cursor Position
324-----------------------------------
325
326
327
328Direct Multimedia - Wire Format
329-------------------------------
330
331
332
333Direct Multimedia - Examples
334----------------------------
335
336
337
338Cached Multimedia - Summary
339---------------------------
340
341
342
343
344Pixel data that has scrolled off the displayed screen and into the
345scrollback buffer is required to be persistent even if the cache entry
346containing that image data has been evicted by the terminal or removed
347by the application.
348
349
350
351Cached Multimedia - Required Support For Existing Sequences
352-----------------------------------------------------------
353
354A terminal with cached multimedia feature must support the following
355defined xterm sequences:
356
357| Sequence | Description |
358|----------------|-----------------------------------------------------|
359| CSI 16 t | Responds with CSI 6 ; cellHeight ; cellWidth t |
360| CSI 18 t | Responds with CSI 8 ; rows ; columns t |
361
362
363
364Cached Multimedia - New Sequences
365---------------------------------
366
367
368
369Cached Multimedia - Error Handling
370----------------------------------
371
372
373
374Cached Multimedia - Cursor Position
375-----------------------------------
376
377
378
379Cached Multimedia - Scrollback
380------------------------------
381
5a16a542
KL
382
383
930d75f0
KL
384Cached Multimedia - Wire Format
385-------------------------------
5a16a542 386
930d75f0
KL
387
388
389Cached Multimedia - Examples
390----------------------------
391
392
393
394
395Layers - Summary
396----------------
397
398Layers introduce the concept of a layer "Z" coordinate to the existing
399rows ("Y") by columns ("X") grid. Put another way, the
400two-dimensional grid of columns-by-rows becomes a three-dimensional
401cube of columns-by-rows-by-layers. For this document, the column,
402row, and layer coordinates are referred to as X, Y, and Z. This
403cartesian coordinate system is right-handed, with the Z axis pointing
404"away" from the user "into" the screen.
405
406An application treats the Z coordinate exactly as it does X and Y
407(rows and columns) coordinates:
408
409 * If it attemps to set Z to a value less than 1, then Z is set to 1.
410
411 * If it attempts to set Z to a value greater than the number of
412 layers, then Z is set to the number of layers.
413
414New sequences are provided to set and query Z, Y, X, to set and query
415the screen cube size, and control visibility of Cells in-front-of
416other Cells.
417
418Operations that act on more than one Cell are defined such to act on
419all layers simultaneously by default.
420
421
422
423Layers - Number of Layers
424-------------------------
425
426A terminal is required to provide between 1 and a finite number of
427layers.
428
429The number of layers may be different between the primary and
430alternate screens.
431
432An application may request that the terminal allocate additional
433layers. The terminal is free to honor or ignore such requests as it
434sees fit.
435
436The scrollback buffer is permitted, and recommended, to contain only a
437"flattened" single layer.
438
439
440
441Layers - Terminal State
442-----------------------
443
444The terminal maintains a complex state at all times. This state
445includes variables such as cursor position, foreground/background
446color, attributes to apply to the next displayed character, and so on.
447The layers feature adds more variables to the state, and these
448variables are required to be stored with DECSC (ESC 7) and restored
449with DECRC (ESC 8). The new variables are listed below:
450
203cfc23
KL
451| Mnemonic | Description | Default value |
452|----------|-----------------------------|----------------|
453| Z | Cursor position Z | 1 |
454| MSL | Manipulate single layer | off / disabled |
455| TFT | Text foreground transparent | false |
456| TBT | Text background transparent | false |
930d75f0
KL
457
458
459
460Layers - Required Support For Existing Sequences
461------------------------------------------------
462
463A terminal with layers feature must support the standard VT100/VT102
464sequences defined in their respective manuals.
465
466
467
468Layers - New Sequences
469----------------------
470
471A terminal with layer feature must support the following new
472sequences:
473
474| Sequence | Command | Description |
475|-------------------|-------------|----------------------------------------|
476| CSI ? z ; y ; x H | CUPZ | Move cursor to (x, y, z) |
477| CSI ? z ; y ; x H | SLA | Set layer alpha |
203cfc23
KL
478| CSI ? 3 0 0 1 h | DECSET 3001 | Enable Manupulate Single Layer (MSL) |
479| CSI ? 3 0 0 1 l | DECRST 3001 | Disable Manupulate Single Layer (MSL) |
930d75f0
KL
480| CSI ? l ; h ; w t | RSZCUBE | Resize cube to (layers, height, width) |
481
482Default parameters and ranges are listed below:
483
484| Command | Position / Variable | Default Value | Minumum | Maximum |
485|---------|---------------------|---------------|---------|-----------|
486| CUPZ | 1 / z | 1 | 1 | # layers |
487| CUPZ | 2 / y | 1 | 1 | # rows |
488| CUPZ | 3 / x | 1 | 1 | # columns |
489| SLA | 1 / alpha | 255 | 0 | 255 |
490| RSZCUBE | 1 / l | 1 | 1 | varies |
491| RSZCUBE | 2 / h | 80 | 1 | varies |
492| RSZCUBE | 3 / w | 24 | 1 | varies |
493
494The terminal must also support the following new queries:
495
191ed82c 496| Query | Response | Description |
02c14905 497|-----------------|-----------------------|--------------------------------|
191ed82c 498| CSI ? 1 0 0 n | CSI ? z ; y ; x n | Report cursor Z, Y, X position |
930d75f0
KL
499| CSI ? 1 8 t | CSI ? 8 ; l ; h ; w t | Report the text area cube layers, height, width |
500
501
502The terminal must support the following new Set Graphics Rendition
503(SGR) character attributes commands:
504
505| SGR Parameter | Description |
506|---------------|---------------------------------------------|
507| 230 | Set text foreground color to transparent |
508| 239 | Set text foreground color to solid (opaque) |
509| 240 | Set text background color to transparent |
510| 249 | Set text background color to solid (opaque) |
511
512
513
514
515Layers - Error Handling
516-----------------------
517
518No additional error reporting is provided for layer feature.
519
520
521
522Layers - Rendering
523------------------
524
525A terminal with layer feature will display its Cells such that the
526screen will appear as if it was rendered in the manner of the
527pseudo-code below:
5a16a542
KL
528
529```
530for each layer Z, in descending order from maxZ to minZ:
930d75f0 531
5a16a542 532 for each row Y, in ascending order from minY to maxY:
930d75f0 533
5a16a542 534 for each column X, in ascending order from minX to maxX:
930d75f0
KL
535
536 if tile at (X, Y, Z) background color is solid:
537 draw rectangle of background color with layer alpha
538
539 if tile at (X, Y, Z) foreground color is solid:
540 if tile at (X, Y, Z) is glyph:
541 draw glyph with foreground color with layer alpha
542 else
543 draw pixel data of tile as red/green/blue/alpha pixels with
544 layer alpha
545
5a16a542
KL
546 advance X by tile width
547 next column
930d75f0 548
5a16a542
KL
549 advance Y by 1
550 next row
930d75f0 551
5a16a542
KL
552 decrease Z by 1
553next layer
554```
555
556A terminal is free to optimize its rendering as it sees fit, so long
557as the final screen output looks equivalent to the above method.
558
559
560
930d75f0
KL
561Layers - Integration With Existing Sequences
562--------------------------------------------
563
564Sequences that insert characters/lines, delete characters/lines, or
565modify larger regions are changed to act upon multiple layers as
8af51dab
KL
566defined below. By default, MSL (Manipulate Single Layer) is
567off/unset, and Z is 1, so if the application never changes MSL or Z
568then these sequences will produce the same visible output as a
569terminal without layer support.
930d75f0
KL
570
571A terminal is not required to support all of these sequences; however,
572for those sequences it does support, if it supports the layers feature
573then the sequences must behave as shown below:
574
575| Sequence | Command | Additional behavior |
576|------------|-------------|------------------------------------------|
203cfc23
KL
577| BS (0x08) | Backspace | Only current layer affected if MSL=on |
578| DEL (0x7F) | Delete | Only current layer affected if MSL=on |
579| IND (0x84) | Index | Only current layer affected if MSL=on |
580| RI (0x8D | Reverse Index | Only current layer affected if MSL=on |
930d75f0
KL
581| ESC # 3 | DECDHL | Cells on all layers always affected |
582| ESC # 4 | DECDHL | Cells on all layers always affected |
583| ESC # 5 | DECSWL | Cells on all layers always affected |
584| ESC # 6 | DECDWL | Cells on all layers always affected |
203cfc23
KL
585| ESC # 8 | DECALN | All layers > 1 cleared; Z, MSL, TFT, TBT reset to default |
586| ESC 7 | DECSC | Also store Z, MSL, TFT, TBT |
587| ESC 8 | DECRC | Also restore Z, MSL, TFT, TBT |
588| ESC c | RIS | All layers > 1 cleared; Z, MSL, TFT, TBT reset to default |
589| CSI @ | ICH | Only current layer affected if MSL=on |
590| CSI J | ED | Only current layer affected if MSL=on |
591| CSI K | EL | Only current layer affected if MSL=on |
592| CSI ? K | DECSEL | Only current layer affected if MSL=on |
593| CSI L | IL | Only current layer affected if MSL=on |
594| CSI M | DL | Only current layer affected if MSL=on |
595| CSI X | ECH | Only current layer affected if MSL=on |
596| CSI M | DL | Only current layer affected if MSL=on |
597| CSI P | DCH | Only current layer affected if MSL=on |
930d75f0 598| CSI R | DECSTBM | Cells on all layers always affected |
203cfc23
KL
599| CSI $ t | DECARA | Only current layer affected if MSL=on |
600| CSI $ v | DECCRA | Only current layer affected if MSL=on |
930d75f0 601| CSI x | DECSACE | Cells on all layers always affected |
203cfc23
KL
602| CSI $ x | DECFRA | Only current layer affected if MSL=on |
603| CSI $ z | DECERA | Only current layer affected if MSL=on |
930d75f0
KL
604
605The VT52 sub-mode commands:
606
607| Sequence | Command | Additional behavior |
608|------------|-------------|------------------------------------------|
203cfc23
KL
609| ESC J | ED | Only current layer affected if MSL=on |
610| ESC K | EL | Only current layer affected if MSL=on |
930d75f0
KL
611
612
613
614Layers - Use With Multiplexers
615------------------------------
616
617Layers are inteded to provide a means for multiplexers to pass on the
618job of multimedia support to the "outer" or host terminal. The
619proposed mechanics of that is outlined in the pseudo-code below:
5a16a542 620
930d75f0
KL
621```
622for each inner terminal in descending order from maxZ to minZ:
5a16a542 623
930d75f0 624 emit CUPZ(inner terminal Z, inner terminal Y, inner terminal X)
5a16a542 625
930d75f0 626 draw inner terminal text with standard VT100/VT102/xterm sequences
5a16a542 627
930d75f0
KL
628 for each multimedia sequence emitted by the inner terminal:
629 emit CUP(inner terminal Y, inner terminal X)
630 emit multimedia sequences to outer terminal
631 next multimedia sequence
5a16a542 632
930d75f0
KL
633 decrease Z by 1
634next inner terminal
635```
5a16a542 636
930d75f0
KL
637The method above may not be effective for complex multi-terminal
638screen layouts, but is hoped to work well for many simple cases.
5a16a542 639
5a16a542
KL
640
641
930d75f0
KL
642Layers - Examples
643-----------------
5a16a542
KL
644
645
5a16a542
KL
646
647
930d75f0
KL
648References
649----------
5a16a542 650
930d75f0 651* xterm control sequences:
5a16a542
KL
652
653
930d75f0 654* ECMA-48: