My library for building complex, vibrant textual user interfaces (TUIs) on modern terminal emulators. It does not use Ncurses (though it does make use of libtinfo from that package), nor is it an X/Open Curses source-compatible replacement. It is written in C, with C++-safe headers.
Source and issue-tracking live at Github.
- Optional use of "alternate screen" where available (smcup/rmcup terminfo capabilities)
- All APIs use 24-bit 8bpc RGB color natively
- Color is quantized down for indexed palette terminals
- Transparency/semi-transparency plus dynamic high-contrast text
- Lower planes can affect color of higher translucent ones
- Full support for Unicode, including wide glyphs and bidirectional text
- Composed keys (number pad, etc.) are mapped into Private Supplementary Area B
- Image/video support via ffmpeg
- Subregion fade in/out
- Linear interpolation for coloring geometric objects
It is not obvious what "transparency" or "alpha blending" means in a character context. I have assigned my own meanings. Each of the foreground and background channel of an ncplane's cell have two bits dedicated to alpha. Channels are always initialized to 0, and thus the default alpha setting is CELL_ALPHA_OPAQUE. It is important to note that glyph selection is independent of alpha. The first glyph found while descending the planes intersecting a cell will be the glyph used. Only presentation of the glyph is modified by alpha.
|00||CELL_ALPHA_OPAQUE||Use the fg color unchanged.||Use the bg color unchanged.|
|01||CELL_ALPHA_BLEND||Blend the fg color down.||Blend the bg color down.|
|10||CELL_ALPHA_TRANSPARENT||Select the next fg color.||Select the next bg color.|
|11||CELL_ALPHA_HIGHCONTRAST||Complement bg color computed through this plane.||Forbidden.|
The value 11 is currently forbidden| 00 for a bg alpha setting, but might be used in the future. To "blend the color down" means to average the colors encountered until hitting an opaque channel, or running out of planes. To "select the next color" means to ignore this color, and instead take the color as computed by lower planes.
High-contrast text is not strictly defined. notcurses will attempt to make the glyph as readable as possible, given the background color computed at the plane.
Note that a cell with the zero glyph will not have its channels considered. The containing plane's default channels will instead be factored into any color/transparency calculations (if a default glyph has been defined for the plane). A cell containing a zero glyph on a plane with a default zero glyph cannot impact the rendered scene; any associated channels will be ignored.
If loaded multimedia supports transparency (e.g. PNGs), transparent pixels will be considered as if CELL_ALPHA_TRANSPARENT was used.
notcurses can color lines via linear interpolation between the two endpoints. This is done with ncplane_hline_interp() and ncplane_vline_interp(). If provided two endpoints of the same color, the line will be that single color.
|0.9.0||2019-12-18||Recognize COLORTERM, damage map, quantized colors, _yx API extensions, alignment|
|0.4.0||2019-12-05||Cell API, input, resize handling|
|0.3.0||2019-12-02||Video support, transparent planes, fades|
|0.2.0||2019-12-02||Panelreels, image support|
|0.1.0||2019-11-30||Ncplanes, basic output|