diff options
Diffstat (limited to 'src/renderer/mod.rs')
-rw-r--r-- | src/renderer/mod.rs | 106 |
1 files changed, 31 insertions, 75 deletions
diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 2d466f79..585bea10 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -28,9 +28,8 @@ use gl; use index::{Line, Column, RangeInclusive}; use notify::{Watcher as WatcherApi, RecommendedWatcher as Watcher, op}; -use ansi::{Color, NamedColor}; -use config::{Config, ColorList}; -use term::{self, cell, IndexedCell, Cell}; +use config::Config; +use term::{self, cell, RenderableCell}; use window::{Size, Pixels}; use Rgb; @@ -313,7 +312,6 @@ pub struct QuadRenderer { atlas: Vec<Atlas>, active_tex: GLuint, batch: Batch, - draw_bold_text_with_bright_colors: bool, rx: mpsc::Receiver<Msg>, } @@ -323,8 +321,8 @@ pub struct RenderApi<'a> { batch: &'a mut Batch, atlas: &'a mut Vec<Atlas>, program: &'a mut ShaderProgram, - colors: &'a ColorList, - visual_bell: f32, + config: &'a Config, + visual_bell_intensity: f32 } #[derive(Debug)] @@ -343,58 +341,26 @@ pub struct PackedVertex { pub struct Batch { tex: GLuint, instances: Vec<InstanceData>, - draw_bold_text_with_bright_colors: bool, } impl Batch { #[inline] - pub fn new(config: &Config) -> Batch { + pub fn new() -> Batch { Batch { tex: 0, instances: Vec::with_capacity(BATCH_MAX), - draw_bold_text_with_bright_colors: config.draw_bold_text_with_bright_colors(), } } pub fn add_item( &mut self, - cell: &IndexedCell, + cell: &RenderableCell, glyph: &Glyph, - colors: &ColorList ) { if self.is_empty() { self.tex = glyph.tex_id; } - let fg = match cell.fg { - Color::Spec(rgb) => rgb, - Color::Named(ansi) => { - if self.draw_bold_text_with_bright_colors && cell.bold() { - colors[ansi.to_bright()] - } else { - colors[ansi] - } - }, - Color::Indexed(idx) => { - let idx = if self.draw_bold_text_with_bright_colors - && cell.bold() - && idx < 8 - { - idx + 8 - } else { - idx - }; - - colors[idx] - } - }; - - let bg = match cell.bg { - Color::Spec(rgb) => rgb, - Color::Named(ansi) => colors[ansi], - Color::Indexed(idx) => colors[idx], - }; - self.instances.push(InstanceData { col: cell.column.0 as f32, row: cell.line.0 as f32, @@ -409,13 +375,13 @@ impl Batch { uv_width: glyph.uv_width, uv_height: glyph.uv_height, - r: fg.r as f32, - g: fg.g as f32, - b: fg.b as f32, + r: cell.fg.r as f32, + g: cell.fg.g as f32, + b: cell.fg.b as f32, - bg_r: bg.r as f32, - bg_g: bg.g as f32, - bg_b: bg.b as f32, + bg_r: cell.bg.r as f32, + bg_g: cell.bg.g as f32, + bg_b: cell.bg.b as f32, }); } @@ -456,7 +422,7 @@ const ATLAS_SIZE: i32 = 1024; impl QuadRenderer { // TODO should probably hand this a transform instead of width/height - pub fn new(config: &Config, size: Size<Pixels<u32>>) -> Result<QuadRenderer, Error> { + pub fn new(size: Size<Pixels<u32>>) -> Result<QuadRenderer, Error> { let program = ShaderProgram::new(size)?; let mut vao: GLuint = 0; @@ -600,9 +566,8 @@ impl QuadRenderer { vbo_instance: vbo_instance, atlas: Vec::new(), active_tex: 0, - batch: Batch::new(config), + batch: Batch::new(), rx: msg_rx, - draw_bold_text_with_bright_colors: config.draw_bold_text_with_bright_colors(), }; let atlas = Atlas::new(ATLAS_SIZE); @@ -611,14 +576,11 @@ impl QuadRenderer { Ok(renderer) } - pub fn update_config(&mut self, config: &Config) { - self.batch.draw_bold_text_with_bright_colors = config.draw_bold_text_with_bright_colors(); - } - pub fn with_api<F, T>( &mut self, config: &Config, props: &term::SizeInfo, + visual_bell_intensity: f64, func: F ) -> T where F: FnOnce(RenderApi) -> T @@ -637,6 +599,7 @@ impl QuadRenderer { unsafe { self.program.activate(); self.program.set_term_uniforms(props); + self.program.set_visual_bell(visual_bell_intensity as _); gl::BindVertexArray(self.vao); gl::BindBuffer(gl::ELEMENT_ARRAY_BUFFER, self.ebo); @@ -649,8 +612,8 @@ impl QuadRenderer { batch: &mut self.batch, atlas: &mut self.atlas, program: &mut self.program, - colors: config.color_list(), - visual_bell: 0.0, + visual_bell_intensity: visual_bell_intensity as _, + config: config, }); unsafe { @@ -713,18 +676,13 @@ impl QuadRenderer { } impl<'a> RenderApi<'a> { - pub fn set_visual_bell(&mut self, visual_bell: f32) { - self.visual_bell = visual_bell; - self.program.set_visual_bell(visual_bell); - } - pub fn clear(&self) { - let color = self.colors[NamedColor::Background]; + let color = self.config.colors().primary.background; unsafe { gl::ClearColor( - (self.visual_bell + color.r as f32 / 255.0).min(1.0), - (self.visual_bell + color.g as f32 / 255.0).min(1.0), - (self.visual_bell + color.b as f32 / 255.0).min(1.0), + (self.visual_bell_intensity + color.r as f32 / 255.0).min(1.0), + (self.visual_bell_intensity + color.g as f32 / 255.0).min(1.0), + (self.visual_bell_intensity + color.b as f32 / 255.0).min(1.0), 1.0 ); gl::Clear(gl::COLOR_BUFFER_BIT); @@ -764,22 +722,20 @@ impl<'a> RenderApi<'a> { &mut self, string: &str, glyph_cache: &mut GlyphCache, - color: &Color, + color: Rgb, ) { let line = Line(23); let col = Column(0); let cells = string.chars() .enumerate() - .map(|(i, c)| IndexedCell { + .map(|(i, c)| RenderableCell { line: line, column: col + i, - inner: Cell { - c: c, - bg: *color, - fg: Color::Spec(Rgb { r: 0, g: 0, b: 0}), - flags: cell::Flags::empty(), - } + c: c, + bg: color, + fg: Rgb { r: 0, g: 0, b: 0 }, + flags: cell::Flags::empty(), }) .collect::<Vec<_>>(); @@ -787,13 +743,13 @@ impl<'a> RenderApi<'a> { } #[inline] - fn add_render_item(&mut self, cell: &IndexedCell, glyph: &Glyph) { + fn add_render_item(&mut self, cell: &RenderableCell, glyph: &Glyph) { // Flush batch if tex changing if !self.batch.is_empty() && self.batch.tex != glyph.tex_id { self.render_batch(); } - self.batch.add_item(cell, glyph, self.colors); + self.batch.add_item(cell, glyph); // Render batch and clear if it's full if self.batch.full() { @@ -806,7 +762,7 @@ impl<'a> RenderApi<'a> { cells: I, glyph_cache: &mut GlyphCache ) - where I: Iterator<Item=::term::IndexedCell> + where I: Iterator<Item=RenderableCell> { for cell in cells { // Get font key for cell |