Repaint speed optimization
This commit is contained in:
parent
cd55351042
commit
e9839b641d
@ -84,7 +84,6 @@ impl Cursor {
|
|||||||
double_width: bool,
|
double_width: bool,
|
||||||
bg: &Color) {
|
bg: &Color) {
|
||||||
|
|
||||||
|
|
||||||
let current_point = ctx.get_current_point();
|
let current_point = ctx.get_current_point();
|
||||||
let state = self.state.lock().unwrap();
|
let state = self.state.lock().unwrap();
|
||||||
ctx.set_source_rgba(1.0 - bg.0, 1.0 - bg.1, 1.0 - bg.2, 0.6 * state.alpha.0);
|
ctx.set_source_rgba(1.0 - bg.0, 1.0 - bg.1, 1.0 - bg.2, 0.6 * state.alpha.0);
|
||||||
|
@ -144,7 +144,7 @@ impl UiModel {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clip_model<'a> (&'a self, clip: &'a ModelRect) -> ClipRowIterator<'a> {
|
pub fn clip_model<'a>(&'a self, clip: &'a ModelRect) -> ClipRowIterator<'a> {
|
||||||
ClipRowIterator::new(self, clip)
|
ClipRowIterator::new(self, clip)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,7 +302,33 @@ impl ModelRect {
|
|||||||
(self.bot - self.top + 1) as i32 * line_height as i32)
|
(self.bot - self.top + 1) as i32 * line_height as i32)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_area(line_height: f64, char_width: f64, x1: f64, y1: f64, x2: f64, y2: f64) -> ModelRect {
|
pub fn from_area(line_height: f64,
|
||||||
|
char_width: f64,
|
||||||
|
x1: f64,
|
||||||
|
y1: f64,
|
||||||
|
x2: f64,
|
||||||
|
y2: f64)
|
||||||
|
-> ModelRect {
|
||||||
|
let x1 = if x1 > 0.0 {
|
||||||
|
x1 - 1.0
|
||||||
|
} else {
|
||||||
|
x1
|
||||||
|
};
|
||||||
|
let x2 = if x2 > 0.0 {
|
||||||
|
x2 - 1.0
|
||||||
|
} else {
|
||||||
|
x2
|
||||||
|
};
|
||||||
|
let y1 = if y1 > 0.0 {
|
||||||
|
y1 - 1.0
|
||||||
|
} else {
|
||||||
|
y1
|
||||||
|
};
|
||||||
|
let y2 = if y2 > 0.0 {
|
||||||
|
y2 - 1.0
|
||||||
|
} else {
|
||||||
|
y2
|
||||||
|
};
|
||||||
let left = (x1 / char_width) as usize;
|
let left = (x1 / char_width) as usize;
|
||||||
let right = (x2 / char_width) as usize;
|
let right = (x2 / char_width) as usize;
|
||||||
let top = (y1 / line_height) as usize;
|
let top = (y1 / line_height) as usize;
|
||||||
@ -318,9 +344,9 @@ pub struct ClipRowIterator<'a> {
|
|||||||
iter: Iter<'a, Vec<Cell>>,
|
iter: Iter<'a, Vec<Cell>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl <'a> ClipRowIterator<'a> {
|
impl<'a> ClipRowIterator<'a> {
|
||||||
pub fn new(model: &'a UiModel, rect: &'a ModelRect) -> ClipRowIterator<'a> {
|
pub fn new(model: &'a UiModel, rect: &'a ModelRect) -> ClipRowIterator<'a> {
|
||||||
ClipRowIterator {
|
ClipRowIterator {
|
||||||
rect: rect,
|
rect: rect,
|
||||||
pos: 0,
|
pos: 0,
|
||||||
iter: model.model()[rect.top..rect.bot + 1].iter(),
|
iter: model.model()[rect.top..rect.bot + 1].iter(),
|
||||||
@ -328,23 +354,21 @@ impl <'a> ClipRowIterator<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl <'a> Iterator for ClipRowIterator<'a> {
|
impl<'a> Iterator for ClipRowIterator<'a> {
|
||||||
type Item = (usize, ClipLine<'a>);
|
type Item = (usize, ClipLine<'a>);
|
||||||
|
|
||||||
fn next(&mut self) -> Option<(usize, ClipLine<'a>)> {
|
fn next(&mut self) -> Option<(usize, ClipLine<'a>)> {
|
||||||
self.pos += 1;
|
self.pos += 1;
|
||||||
self.iter.next().map(|line| {
|
self.iter.next().map(|line| (self.rect.top + self.pos - 1, ClipLine::new(line, self.rect)))
|
||||||
(self.rect.top + self.pos - 1, ClipLine::new(line, self.rect))
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ClipLine <'a> {
|
pub struct ClipLine<'a> {
|
||||||
rect: &'a ModelRect,
|
rect: &'a ModelRect,
|
||||||
line: &'a Vec<Cell>,
|
line: &'a Vec<Cell>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl <'a> ClipLine<'a> {
|
impl<'a> ClipLine<'a> {
|
||||||
pub fn new(model: &'a Vec<Cell>, rect: &'a ModelRect) -> ClipLine<'a> {
|
pub fn new(model: &'a Vec<Cell>, rect: &'a ModelRect) -> ClipLine<'a> {
|
||||||
ClipLine {
|
ClipLine {
|
||||||
line: model,
|
line: model,
|
||||||
@ -367,25 +391,22 @@ pub struct ClipColIterator<'a> {
|
|||||||
iter: Iter<'a, Cell>,
|
iter: Iter<'a, Cell>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl <'a> ClipColIterator<'a> {
|
impl<'a> ClipColIterator<'a> {
|
||||||
pub fn new(model: &'a Vec<Cell>, rect: &'a ModelRect) -> ClipColIterator<'a> {
|
pub fn new(model: &'a Vec<Cell>, rect: &'a ModelRect) -> ClipColIterator<'a> {
|
||||||
ClipColIterator {
|
ClipColIterator {
|
||||||
rect: rect,
|
rect: rect,
|
||||||
pos: 0,
|
pos: 0,
|
||||||
iter: model[rect.left..rect.right + 1].iter(),
|
iter: model[rect.left..rect.right + 1].iter(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl <'a>Iterator for ClipColIterator<'a> {
|
impl<'a> Iterator for ClipColIterator<'a> {
|
||||||
type Item = (usize, &'a Cell);
|
type Item = (usize, &'a Cell);
|
||||||
|
|
||||||
fn next(&mut self) -> Option<(usize, &'a Cell)> {
|
fn next(&mut self) -> Option<(usize, &'a Cell)> {
|
||||||
self.pos += 1;
|
self.pos += 1;
|
||||||
self.iter.next().map(|line| {
|
self.iter.next().map(|line| (self.rect.left + self.pos - 1, line))
|
||||||
(self.rect.left + self.pos - 1, line)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -431,12 +452,20 @@ mod tests {
|
|||||||
assert_eq!(1, rect.right);
|
assert_eq!(1, rect.right);
|
||||||
|
|
||||||
|
|
||||||
let rect = ModelRect::from_area(10.0, 5.0, 0.0, 0.0, 9.0, 19.0);
|
let rect = ModelRect::from_area(10.0, 5.0, 0.0, 0.0, 10.0, 20.0);
|
||||||
|
|
||||||
assert_eq!(0, rect.top);
|
assert_eq!(0, rect.top);
|
||||||
assert_eq!(0, rect.left);
|
assert_eq!(0, rect.left);
|
||||||
assert_eq!(1, rect.bot);
|
assert_eq!(1, rect.bot);
|
||||||
assert_eq!(1, rect.right);
|
assert_eq!(1, rect.right);
|
||||||
|
|
||||||
|
|
||||||
|
let rect = ModelRect::from_area(10.0, 5.0, 0.0, 0.0, 11.0, 21.0);
|
||||||
|
|
||||||
|
assert_eq!(0, rect.top);
|
||||||
|
assert_eq!(0, rect.left);
|
||||||
|
assert_eq!(2, rect.bot);
|
||||||
|
assert_eq!(2, rect.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
Reference in New Issue
Block a user