Small rendering optimization
This commit is contained in:
parent
fbdf897d48
commit
c72eb65ebf
109
src/ui.rs
109
src/ui.rs
@ -15,7 +15,7 @@ use gdk_sys;
|
|||||||
use glib;
|
use glib;
|
||||||
use neovim_lib::{Neovim, NeovimApi, Value, Integer};
|
use neovim_lib::{Neovim, NeovimApi, Value, Integer};
|
||||||
|
|
||||||
use ui_model::{UiModel, Attrs, Color, COLOR_BLACK, COLOR_WHITE, COLOR_RED};
|
use ui_model::{UiModel, Cell, Attrs, Color, COLOR_BLACK, COLOR_WHITE, COLOR_RED};
|
||||||
use nvim::{RedrawEvents, GuiApi, ErrorReport};
|
use nvim::{RedrawEvents, GuiApi, ErrorReport};
|
||||||
|
|
||||||
use input::{convert_key, keyval_to_input_string};
|
use input::{convert_key, keyval_to_input_string};
|
||||||
@ -142,6 +142,25 @@ impl Ui {
|
|||||||
fn set_font_desc(&mut self, desc: &str) {
|
fn set_font_desc(&mut self, desc: &str) {
|
||||||
self.font_desc = FontDescription::from_string(desc);
|
self.font_desc = FontDescription::from_string(desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn colors<'a>(&'a self, cell: &'a Cell) -> (&'a Color, &'a Color) {
|
||||||
|
let bg = if let Some(ref bg) = cell.attrs.background {
|
||||||
|
bg
|
||||||
|
} else {
|
||||||
|
&self.bg_color
|
||||||
|
};
|
||||||
|
let fg = if let Some(ref fg) = cell.attrs.foreground {
|
||||||
|
fg
|
||||||
|
} else {
|
||||||
|
&self.fg_color
|
||||||
|
};
|
||||||
|
|
||||||
|
if cell.attrs.reverse {
|
||||||
|
(fg, bg)
|
||||||
|
} else {
|
||||||
|
(bg, fg)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn gtk_button_press(_: &DrawingArea, ev: &EventButton) -> Inhibit {
|
fn gtk_button_press(_: &DrawingArea, ev: &EventButton) -> Inhibit {
|
||||||
@ -291,6 +310,26 @@ fn gtk_configure_event(_: &DrawingArea, ev: &EventConfigure) -> bool {
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn draw_joined_rect(ui: &Ui,
|
||||||
|
ctx: &cairo::Context,
|
||||||
|
from_col_idx: usize,
|
||||||
|
col_idx: usize,
|
||||||
|
char_width: f64,
|
||||||
|
line_height: f64,
|
||||||
|
color: &Color) {
|
||||||
|
let current_point = ctx.get_current_point();
|
||||||
|
let rect_width = char_width * (col_idx - from_col_idx) as f64;
|
||||||
|
|
||||||
|
if &ui.bg_color != color {
|
||||||
|
ctx.set_source_rgb(color.0, color.1, color.2);
|
||||||
|
ctx.rectangle(current_point.0, current_point.1, rect_width, line_height);
|
||||||
|
ctx.fill();
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.move_to(current_point.0 + rect_width, current_point.1);
|
||||||
|
}
|
||||||
|
|
||||||
fn draw(ui: &Ui, ctx: &cairo::Context) {
|
fn draw(ui: &Ui, ctx: &cairo::Context) {
|
||||||
ctx.set_source_rgb(ui.bg_color.0, ui.bg_color.1, ui.bg_color.2);
|
ctx.set_source_rgb(ui.bg_color.0, ui.bg_color.1, ui.bg_color.2);
|
||||||
ctx.paint();
|
ctx.paint();
|
||||||
@ -308,35 +347,45 @@ fn draw(ui: &Ui, ctx: &cairo::Context) {
|
|||||||
|
|
||||||
for (line_idx, line) in ui.model.model().iter().enumerate() {
|
for (line_idx, line) in ui.model.model().iter().enumerate() {
|
||||||
ctx.move_to(0.0, line_y);
|
ctx.move_to(0.0, line_y);
|
||||||
|
|
||||||
|
// first draw background
|
||||||
|
// here we join same bg color for given line
|
||||||
|
// this gives less drawing primitives
|
||||||
|
let mut from_col_idx = 0;
|
||||||
|
let mut from_bg = None;
|
||||||
|
for (col_idx, cell) in line.iter().enumerate() {
|
||||||
|
let (bg, _) = ui.colors(cell);
|
||||||
|
|
||||||
|
if from_bg.is_none() {
|
||||||
|
from_bg = Some(bg);
|
||||||
|
from_col_idx = col_idx;
|
||||||
|
} else if from_bg != Some(bg) {
|
||||||
|
draw_joined_rect(ui,
|
||||||
|
ctx,
|
||||||
|
from_col_idx,
|
||||||
|
col_idx,
|
||||||
|
char_width,
|
||||||
|
line_height,
|
||||||
|
from_bg.take().unwrap());
|
||||||
|
from_bg = Some(bg);
|
||||||
|
from_col_idx = col_idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
draw_joined_rect(ui,
|
||||||
|
ctx,
|
||||||
|
from_col_idx,
|
||||||
|
line.len(),
|
||||||
|
char_width,
|
||||||
|
line_height,
|
||||||
|
from_bg.take().unwrap());
|
||||||
|
|
||||||
|
ctx.move_to(0.0, line_y);
|
||||||
|
|
||||||
for (col_idx, cell) in line.iter().enumerate() {
|
for (col_idx, cell) in line.iter().enumerate() {
|
||||||
|
|
||||||
let current_point = ctx.get_current_point();
|
let current_point = ctx.get_current_point();
|
||||||
|
|
||||||
let mut bg = if let Some(ref bg) = cell.attrs.background {
|
let (bg, fg) = ui.colors(cell);
|
||||||
bg
|
|
||||||
} else {
|
|
||||||
&ui.bg_color
|
|
||||||
};
|
|
||||||
let mut fg = if let Some(ref fg) = cell.attrs.foreground {
|
|
||||||
fg
|
|
||||||
} else {
|
|
||||||
&ui.fg_color
|
|
||||||
};
|
|
||||||
|
|
||||||
if cell.attrs.reverse {
|
|
||||||
let tmp = fg;
|
|
||||||
fg = bg;
|
|
||||||
bg = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if cell.attrs.background.is_some() || cell.attrs.reverse {
|
|
||||||
ctx.set_source_rgb(bg.0, bg.1, bg.2);
|
|
||||||
ctx.rectangle(current_point.0, line_y, char_width, line_height);
|
|
||||||
ctx.fill();
|
|
||||||
|
|
||||||
ctx.move_to(current_point.0, current_point.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if row == line_idx && col == col_idx {
|
if row == line_idx && col == col_idx {
|
||||||
ctx.set_source_rgba(1.0 - bg.0, 1.0 - bg.1, 1.0 - bg.2, 0.5);
|
ctx.set_source_rgba(1.0 - bg.0, 1.0 - bg.1, 1.0 - bg.2, 0.5);
|
||||||
@ -400,8 +449,6 @@ fn draw(ui: &Ui, ctx: &cairo::Context) {
|
|||||||
|
|
||||||
line_y += line_height;
|
line_y += line_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -493,17 +540,17 @@ impl RedrawEvents for Ui {
|
|||||||
if let &Value::Integer(Integer::U64(fg)) = val {
|
if let &Value::Integer(Integer::U64(fg)) = val {
|
||||||
model_attrs.foreground = Some(split_color(fg));
|
model_attrs.foreground = Some(split_color(fg));
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"background" => {
|
"background" => {
|
||||||
if let &Value::Integer(Integer::U64(bg)) = val {
|
if let &Value::Integer(Integer::U64(bg)) = val {
|
||||||
model_attrs.background = Some(split_color(bg));
|
model_attrs.background = Some(split_color(bg));
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"special" => {
|
"special" => {
|
||||||
if let &Value::Integer(Integer::U64(bg)) = val {
|
if let &Value::Integer(Integer::U64(bg)) = val {
|
||||||
model_attrs.special = Some(split_color(bg));
|
model_attrs.special = Some(split_color(bg));
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"reverse" => model_attrs.reverse = true,
|
"reverse" => model_attrs.reverse = true,
|
||||||
"bold" => model_attrs.bold = true,
|
"bold" => model_attrs.bold = true,
|
||||||
"italic" => model_attrs.italic = true,
|
"italic" => model_attrs.italic = true,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone, PartialEq)]
|
||||||
pub struct Color(pub f64, pub f64, pub f64);
|
pub struct Color(pub f64, pub f64, pub f64);
|
||||||
|
|
||||||
pub const COLOR_BLACK: Color = Color(0.0, 0.0, 0.0);
|
pub const COLOR_BLACK: Color = Color(0.0, 0.0, 0.0);
|
||||||
|
Loading…
Reference in New Issue
Block a user