From 668f3f9aaf414e6d47b7024600f234f5245d158e Mon Sep 17 00:00:00 2001 From: keith Date: Thu, 24 Sep 2020 01:14:29 -0700 Subject: [PATCH] more stable with 3 threads --- Cargo.lock | 89 +++++++++++++++++---------------- Cargo.toml | 4 +- src/editor/mod.rs | 7 +-- src/editor/window.rs | 8 +-- src/renderer/mod.rs | 3 +- src/renderer/rendered_window.rs | 61 +++++++++++++++------- 6 files changed, 99 insertions(+), 73 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d3e4f0f..9f562bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -196,9 +196,9 @@ checksum = "7b02b629252fe8ef6460461409564e2c21d0c8e77e0944f3d189ff06c4e932ad" [[package]] name = "cc" -version = "1.0.59" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66120af515773fb005778dc07c261bd201ec8ce50bd6e7144c927753fe013381" +checksum = "ef611cc68ff783f18535d77ddd080185275713d852c4f5cbb6122c462a7a825c" [[package]] name = "cexpr" @@ -329,11 +329,11 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b5ed8e7e76c45974e15e41bfa8d5b0483cd90191639e01d8f5f1e606299d3fb" +checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" dependencies = [ - "core-foundation-sys 0.8.0", + "core-foundation-sys 0.8.1", "libc", ] @@ -345,9 +345,9 @@ checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" [[package]] name = "core-foundation-sys" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a21fa21941700a3cd8fcb4091f361a6a712fac632f85d9f487cc892045d55c6" +checksum = "c0af3b5e4601de3837c9332e29e0aae47a0d46ebfa246d12b82f564bac233393" [[package]] name = "core-graphics" @@ -363,12 +363,12 @@ dependencies = [ [[package]] name = "core-graphics" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6082396a349fa49674ba1bda4077332a18bf150e8fa75745ece07085e29a113" +checksum = "fc239bba52bab96649441699533a68de294a101533b0270b2d65aa402b29a7f9" dependencies = [ "bitflags", - "core-foundation 0.9.0", + "core-foundation 0.9.1", "core-graphics-types", "foreign-types", "libc", @@ -376,24 +376,24 @@ dependencies = [ [[package]] name = "core-graphics-types" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e92f5d519093a4178296707dbaa3880eae85a5ef5386675f361a1cf25376e93c" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" dependencies = [ "bitflags", - "core-foundation 0.9.0", + "core-foundation 0.9.1", "foreign-types", "libc", ] [[package]] name = "core-text" -version = "19.0.0" +version = "19.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dfae50af11e72657fe7174cddb1ecddc5398037f7f6f39533ad69207c9a4e2" +checksum = "d2c7f46e8b820fd5f4b28528104b28b0a91cbe9e9c5bde8017087fb44bc93a60" dependencies = [ - "core-foundation 0.9.0", - "core-graphics 0.22.0", + "core-foundation 0.9.1", + "core-graphics 0.22.1", "foreign-types", "libc", ] @@ -515,7 +515,7 @@ checksum = "cb582b60359da160a9477ee80f15c8d784c477e69c217ef2cdd4169c24ea380f" dependencies = [ "proc-macro2 1.0.21", "quote 1.0.7", - "syn 1.0.40", + "syn 1.0.41", ] [[package]] @@ -526,7 +526,7 @@ checksum = "71f31892cd5c62e414316f2963c5689242c43d8e7bbcaaeca97e5e28c95d91d9" dependencies = [ "proc-macro2 1.0.21", "quote 1.0.7", - "syn 1.0.40", + "syn 1.0.41", ] [[package]] @@ -597,9 +597,9 @@ dependencies = [ [[package]] name = "either" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56b59865bce947ac5958779cfa508f6c3b9497cc762b7e24a12d11ccde2c4f" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "encoding_rs" @@ -701,8 +701,8 @@ checksum = "1f9042cb45150fb2b2a012fc03d0f1d2071f18e90397b9d2a5ec8ade8464bf20" dependencies = [ "bitflags", "byteorder", - "core-foundation 0.9.0", - "core-graphics 0.22.0", + "core-foundation 0.9.1", + "core-graphics 0.22.1", "core-text", "dirs", "dwrote", @@ -819,7 +819,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf8c27ca13930dc4ffe474880040fe9e0f03c2121600dc9c95423624cab3e467" dependencies = [ "cc", - "core-graphics 0.22.0", + "core-graphics 0.22.1", "core-text", "foreign-types", "freetype", @@ -847,9 +847,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" +checksum = "4c30f6d0bc6b00693347368a67d41b58f2fb851215ff1da49e90fe2c5c667151" dependencies = [ "libc", ] @@ -891,9 +891,12 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b141fdc7836c525d4d594027d318c84161ca17aaf8113ab1f81ab93ae897485" +checksum = "63312a18f7ea8760cdd0a7c5aac1a619752a246b833545e3e36d1f81f7cd9e66" +dependencies = [ + "cfg-if", +] [[package]] name = "iovec" @@ -1061,9 +1064,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c198b026e1bbf08a937e94c6c60f9ec4a2267f5b0d2eec9c1b21b061ce2be55f" +checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" dependencies = [ "autocfg 1.0.1", ] @@ -1160,7 +1163,7 @@ dependencies = [ "cfg-if", "proc-macro2 1.0.21", "quote 1.0.7", - "syn 1.0.40", + "syn 1.0.41", ] [[package]] @@ -1357,7 +1360,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2 1.0.21", "quote 1.0.7", - "syn 1.0.40", + "syn 1.0.41", ] [[package]] @@ -1636,9 +1639,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91739a34c4355b5434ce54c9086c5895604a9c278586d1f1aa95e04f66b525a0" +checksum = "e8c4fec834fb6e6d2dd5eece3c7b432a52f0ba887cf40e595190c4107edc08bf" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -1735,7 +1738,7 @@ checksum = "7903c2cf599db8f310b392332f38367ca4acc84420fa1aee3536299f433c10d5" dependencies = [ "quote 1.0.7", "rust-embed-utils", - "syn 1.0.40", + "syn 1.0.41", "walkdir", ] @@ -1959,7 +1962,7 @@ dependencies = [ [[package]] name = "skulpin" version = "0.10.0" -source = "git+https://github.com/aclysma/skulpin?branch=master#e4abfe06f10565bcf17c57c79ad6bf626033cf9c" +source = "git+https://github.com/aclysma/skulpin?branch=master#fd476242e176383faf0db127cde0408d0b20cfd0" dependencies = [ "log", "skulpin-app-winit", @@ -1971,7 +1974,7 @@ dependencies = [ [[package]] name = "skulpin-app-winit" version = "0.4.0" -source = "git+https://github.com/aclysma/skulpin?branch=master#e4abfe06f10565bcf17c57c79ad6bf626033cf9c" +source = "git+https://github.com/aclysma/skulpin?branch=master#fd476242e176383faf0db127cde0408d0b20cfd0" dependencies = [ "log", "skulpin-renderer", @@ -1981,7 +1984,7 @@ dependencies = [ [[package]] name = "skulpin-renderer" version = "0.4.0" -source = "git+https://github.com/aclysma/skulpin?branch=master#e4abfe06f10565bcf17c57c79ad6bf626033cf9c" +source = "git+https://github.com/aclysma/skulpin?branch=master#fd476242e176383faf0db127cde0408d0b20cfd0" dependencies = [ "ash", "log", @@ -1992,7 +1995,7 @@ dependencies = [ [[package]] name = "skulpin-renderer-sdl2" version = "0.4.0" -source = "git+https://github.com/aclysma/skulpin?branch=master#e4abfe06f10565bcf17c57c79ad6bf626033cf9c" +source = "git+https://github.com/aclysma/skulpin?branch=master#fd476242e176383faf0db127cde0408d0b20cfd0" dependencies = [ "log", "sdl2", @@ -2002,7 +2005,7 @@ dependencies = [ [[package]] name = "skulpin-renderer-winit" version = "0.4.0" -source = "git+https://github.com/aclysma/skulpin?branch=master#e4abfe06f10565bcf17c57c79ad6bf626033cf9c" +source = "git+https://github.com/aclysma/skulpin?branch=master#fd476242e176383faf0db127cde0408d0b20cfd0" dependencies = [ "cocoa", "log", @@ -2082,9 +2085,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963f7d3cc59b59b9325165add223142bbf1df27655d07789f109896d353d8350" +checksum = "6690e3e9f692504b941dc6c3b188fd28df054f7fb8469ab40680df52fdcc842b" dependencies = [ "proc-macro2 1.0.21", "quote 1.0.7", @@ -2138,7 +2141,7 @@ checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" dependencies = [ "proc-macro2 1.0.21", "quote 1.0.7", - "syn 1.0.40", + "syn 1.0.41", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 216d3ea..14a43f8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,10 +46,10 @@ winapi = "0.3.8" [target.'cfg(windows)'.build-dependencies] winres = "0.1.11" -sdl2-sys = { version = "0.34", default-features = false, features = ["bundled", "static-link"] } +sdl2-sys = { version = "0.34.3", default-features = false, features = ["bundled", "static-link"] } [target.'cfg(macos)'.build-dependencies] -sdl2-sys = { version = "0.34", default-features = false, features = ["bundled", "static-link"] } +sdl2-sys = { version = "0.34.3", default-features = false, features = ["bundled", "static-link"] } [profile.release] debug = true diff --git a/src/editor/mod.rs b/src/editor/mod.rs index 8bffdb4..1da3f57 100644 --- a/src/editor/mod.rs +++ b/src/editor/mod.rs @@ -80,7 +80,6 @@ pub struct Editor { pub windows: HashMap, pub cursor: Cursor, pub defined_styles: HashMap>, - pub previous_style: Option>, pub mode_list: Vec, pub current_mode: EditorMode, pub draw_command_sender: Sender, @@ -93,7 +92,6 @@ impl Editor { windows: HashMap::new(), cursor: Cursor::new(), defined_styles: HashMap::new(), - previous_style: None, mode_list: Vec::new(), current_mode: EditorMode::Unknown(String::from("")), draw_command_sender, @@ -158,17 +156,14 @@ impl Editor { cells, } => { let defined_styles = &self.defined_styles; - let mut previous_style = self.previous_style.clone(); self.windows.get_mut(&grid).map(|window| { window.draw_grid_line( row, column_start, cells, - defined_styles, - &mut previous_style, + defined_styles ) }); - self.previous_style = previous_style; } RedrawEvent::Clear { grid } => { self.windows diff --git a/src/editor/window.rs b/src/editor/window.rs index edf3f48..989643d 100644 --- a/src/editor/window.rs +++ b/src/editor/window.rs @@ -102,7 +102,7 @@ impl Window { grid_top: self.grid_top, width: self.grid.width, height: self.grid.height, - floating: self.anchor_info.is_some() + floating: self.anchor_info.is_some(), }); } @@ -228,9 +228,9 @@ impl Window { row: u64, column_start: u64, cells: Vec, - defined_styles: &HashMap>, - previous_style: &mut Option>, + defined_styles: &HashMap> ) { + let mut previous_style = None; if row < self.grid.height { let mut column_pos = column_start; for cell in cells { @@ -239,7 +239,7 @@ impl Window { &mut column_pos, cell, defined_styles, - previous_style, + &mut previous_style, ); } } else { diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 99b1222..65ae48b 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -148,8 +148,9 @@ impl Renderer { let region = self.compute_text_region(grid_pos, cell_width); canvas.clip_rect(region, None, Some(false)); + self.paint.set_blend_mode(BlendMode::Src); - let transparent = Color::from_argb(0, 255, 255, 255); + let transparent = Color::from_argb(0, 0, 0, 0); self.paint.set_color(transparent); canvas.draw_rect(region, &self.paint); diff --git a/src/renderer/rendered_window.rs b/src/renderer/rendered_window.rs index d668a25..0fdbddc 100644 --- a/src/renderer/rendered_window.rs +++ b/src/renderer/rendered_window.rs @@ -1,6 +1,6 @@ use skulpin::skia_safe::gpu::SurfaceOrigin; use skulpin::skia_safe::{ - Budgeted, Canvas, ImageInfo, Rect, Surface, Point, Paint, Color, image_filters::blur + Budgeted, Canvas, ImageInfo, Rect, Surface, Point, Paint, Color, BlendMode, image_filters::blur }; use skulpin::skia_safe::canvas::{ SaveLayerRec, @@ -146,11 +146,12 @@ impl RenderedWindow { paint.set_color(Color::from_argb(a, 255, 255, 255)); } - let background_snapshot = self.background_surface.image_snapshot(); - root_canvas.draw_image(background_snapshot, (current_pixel_position.x, current_pixel_position.y), Some(&paint)); + self.background_surface.draw(root_canvas.as_mut(), (current_pixel_position.x, current_pixel_position.y), Some(&paint)); - let foreground_snapshot = self.foreground_surface.image_snapshot(); - root_canvas.draw_image(foreground_snapshot, (current_pixel_position.x, current_pixel_position.y), None); + let mut paint = Paint::default(); + paint.set_blend_mode(BlendMode::SrcOver); + + self.foreground_surface.draw(root_canvas.as_mut(), (current_pixel_position.x, current_pixel_position.y), Some(&paint)); if self.floating { root_canvas.restore(); @@ -174,25 +175,44 @@ impl RenderedWindow { let new_destination: Point = (grid_left as f32, grid_top as f32).into(); if self.grid_destination != new_destination { - self.t = 0.0; // Reset animation as we have a new destination. - self.grid_start_position = self.grid_current_position; - self.grid_destination = new_destination; + if self.grid_start_position.x.abs() > f32::EPSILON || self.grid_start_position.y.abs() > f32::EPSILON { + self.t = 0.0; // Reset animation as we have a new destination. + self.grid_start_position = self.grid_current_position; + self.grid_destination = new_destination; + } else { + // We don't want to animate since the window is animating out of the start location, + // so we set t to 2.0 to stop animations. + self.t = 2.0; + self.grid_start_position = new_destination; + self.grid_destination = new_destination; + } } if grid_width != self.grid_width || grid_height != self.grid_height { - let mut old_background = self.background_surface; - self.background_surface = build_window_surface(old_background.canvas(), &renderer, grid_width, grid_height); - old_background.draw(self.background_surface.canvas(), (0.0, 0.0), None); - - let mut old_foreground = self.foreground_surface; - self.foreground_surface = build_window_surface(old_foreground.canvas(), &renderer, grid_width, grid_height); - old_foreground.draw(self.foreground_surface.canvas(), (0.0, 0.0), None); + { + let mut old_background = self.background_surface; + self.background_surface = build_window_surface(old_background.canvas(), &renderer, grid_width, grid_height); + old_background.draw(self.background_surface.canvas(), (0.0, 0.0), None); + } + + { + let mut old_foreground = self.foreground_surface; + self.foreground_surface = build_window_surface(old_foreground.canvas(), &renderer, grid_width, grid_height); + old_foreground.draw(self.foreground_surface.canvas(), (0.0, 0.0), None); + } self.grid_width = grid_width; self.grid_height = grid_height; } self.floating = floating; + + if self.hidden { + self.hidden = false; + self.t = 2.0; // We don't want to animate since the window is becoming visible, so we set t to 2.0 to stop animations. + self.grid_start_position = new_destination; + self.grid_destination = new_destination; + } }, WindowDrawCommand::Cell { text, cell_width, window_left, window_top, style @@ -217,7 +237,7 @@ impl RenderedWindow { grid_position, cell_width, &style, - ); + ); } }, WindowDrawCommand::Scroll { @@ -266,7 +286,14 @@ impl RenderedWindow { let foreground_canvas = self.foreground_surface.canvas(); self.foreground_surface = build_window_surface(foreground_canvas, &renderer, self.grid_width, self.grid_height); }, - WindowDrawCommand::Show => self.hidden = false, + WindowDrawCommand::Show => { + if self.hidden { + self.hidden = false; + self.t = 2.0; // We don't want to animate since the window is becoming visible, so we set t to 2.0 to stop animations. + self.grid_start_position = self.grid_destination; + self.grid_destination = self.grid_destination; + } + }, WindowDrawCommand::Hide => self.hidden = true, _ => {} };