feat(renderer): port the generic renderer, renderer thread and state
Ports renderer/{generic,cell,row,link,State,Overlay,image,Thread}.zig:
- generic.rs builds GPU cell buffers from terminal RenderState each
frame: backgrounds, shaped text runs with glyph atlases and nerd font
constraints, all cursor styles, decorations via sprites, selection and
search colors, min-contrast, bold/faint/blink handling, preedit,
padding extension, background image, custom shader uniforms, link
hover underlines, scrollbar and health reporting.
- The renderer thread updates CPU-side state only and asks the host to
redraw; the app runtime calls draw_frame from the GLArea render signal
(the GL context lives on the GTK thread, as in Ghostty).
- ghostty_renderer::state::{State, SharedState} is the canonical shared
renderer state (termio's interim copy will switch to it).
Deviations: overlay uses a direct RGBA rasterizer instead of z2d; bg
images decode with png/jpeg-decoder instead of wuffs; zero-length link
matches advance by one char (Zig would loop forever).
Kitty image rendering is implemented in image::State but not yet called
from generic::update_kitty (raced with the terminal-side wiring).
Test Plan:
- cargo test -p ghostty-renderer (69 unit + 9 headless EGL tests that
render a Terminal through the full pipeline and check pixels)
This commit is contained in:
1 parent
687752c650
commit
871c301713
16 files changed
+7491
-128
No files matched your search
@@ -51,23 +51,7 @@ pub const MIN_VERSION_MAJOR: u32 = 4;
|
||||
pub const MIN_VERSION_MINOR: u32 = 3;
|
||||
|
||||
/// `config.AlphaBlending`.
|
||||
// TODO(integration): replace with ghostty_config's AlphaBlending.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
|
||||
pub enum AlphaBlending {
|
||||
#[default]
|
||||
Native,
|
||||
Linear,
|
||||
LinearCorrected,
|
||||
}
|
||||
|
||||
impl AlphaBlending {
|
||||
pub fn is_linear(self) -> bool {
|
||||
match self {
|
||||
AlphaBlending::Native => false,
|
||||
AlphaBlending::Linear | AlphaBlending::LinearCorrected => true,
|
||||
}
|
||||
}
|
||||
}
|
||||
pub use ghostty_config::types_b::AlphaBlending;
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
pub enum Error {
|
||||
@@ -296,6 +280,12 @@ impl OpenGL {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// The most recently presented target, if any (also set when the blit to
|
||||
/// the default framebuffer is a no-op, e.g. on a surfaceless context).
|
||||
pub fn last_target(&self) -> Option<&Arc<Target>> {
|
||||
self.last_target.as_ref()
|
||||
}
|
||||
|
||||
/// Drop the remembered last-presented target (call when the target it
|
||||
/// refers to is being replaced, e.g. on resize).
|
||||
pub fn clear_last_target(&mut self) {
|
||||
|
||||
Reference in new issue
Block a user