This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

๐Ÿ’š Don't use rand/thread_rng in web build

+82 -48
+1 -1
.github/workflows/deploy.yml
··· 1 - on: [push] 1 + on: { push: { branches: [main] } } 2 2 3 3 jobs: 4 4 deploy:
+13 -2
Cargo.toml
··· 31 31 32 32 [features] 33 33 default = ["cli", "vst", "mp4"] 34 - vst = ["cli", "dep:env_logger", "dep:nih_plug", "dep:ws", "dep:tungstenite"] 34 + vst = [ 35 + "cli", 36 + "rand/thread_rng", 37 + "dep:env_logger", 38 + "dep:nih_plug", 39 + "dep:ws", 40 + "dep:tungstenite", 41 + ] 35 42 cli = [ 36 43 "dep:cargo", 37 44 "dep:watchexec", ··· 53 60 indicatif = "0.17.2" 54 61 itertools = "0.12.1" 55 62 midly = "0.5.3" 56 - rand = { version = "0.9.0" } 63 + rand = { version = "0.9.0", default-features = false, features = [ 64 + "small_rng", 65 + "std", 66 + "std_rng", 67 + ] } 57 68 serde_cbor = "0.11.2" 58 69 serde_json = "1.0.91" 59 70 svg = "0.17.0"
-1
src/cli/mod.rs
··· 5 5 use crate::{enabled_features, Canvas, ColorMapping}; 6 6 use docopt::Docopt; 7 7 use measure_time::debug_time; 8 - use rand::Rng; 9 8 use serde::Deserialize; 10 9 11 10 const USAGE: &str = "
-1
src/random/mod.rs
··· 6 6 pub mod objects; 7 7 pub mod point; 8 8 pub mod region; 9 -
+34 -16
src/random/objects.rs
··· 1 - use rand::{Rng, distr::uniform::SampleRange}; 1 + use rand::{distr::uniform::SampleRange, Rng}; 2 2 3 3 use crate::{LineSegment, Object, Point, Region}; 4 4 ··· 15 15 2 => Self::BigCircle(start), 16 16 3 => Self::SmallCircle(start), 17 17 4 => Self::Dot(start), 18 - 5 => Self::CurveInward(start, region.random_end(rng, start), line_width), 19 - 6 => Self::CurveOutward(start, region.random_end(rng, start), line_width), 18 + 5 => Self::CurveInward( 19 + start, 20 + region.random_end(rng, start), 21 + line_width, 22 + ), 23 + 6 => Self::CurveOutward( 24 + start, 25 + region.random_end(rng, start), 26 + line_width, 27 + ), 20 28 7 => Self::Line( 21 - Point::random(region), 22 - Point::random(region), 29 + Point::random(rng, region), 30 + Point::random(rng, region), 23 31 line_width, 24 32 ), 25 33 _ => unreachable!(), ··· 32 40 vertices_range: impl SampleRange<usize>, 33 41 ) -> Object { 34 42 let number_of_anchors = rng.random_range(vertices_range); 35 - let start = Point::random(region); 43 + let start = Point::random(rng, region); 36 44 let mut lines: Vec<LineSegment> = vec![]; 37 45 for _ in 0..number_of_anchors { 38 - let next_anchor = Point::random(region); 46 + let next_anchor = Point::random(rng, region); 39 47 lines.push(Self::random_line_segment(rng, next_anchor)); 40 48 } 41 49 Object::Polygon(start, lines) ··· 59 67 line_width: f32, 60 68 polygon_vertices_range: impl SampleRange<usize>, 61 69 ) -> Object { 62 - let start = Point::random(region); 70 + let start = Point::random(rng, region); 63 71 Object::random_starting_at( 64 72 rng, 65 73 start, ··· 69 77 ) 70 78 } 71 79 72 - pub fn random_curve_within(rng: &mut impl Rng, region: &Region, line_width: f32) -> Object { 73 - let start = region.random_point(); 80 + pub fn random_curve_within( 81 + rng: &mut impl Rng, 82 + region: &Region, 83 + line_width: f32, 84 + ) -> Object { 85 + let start = region.random_point(rng); 74 86 match rng.random_range(1..=3) { 75 - 1 => Object::CurveInward(start, region.random_end(rng, start), line_width), 76 - 2 => { 77 - Object::CurveOutward(start, region.random_end(rng, start), line_width) 78 - } 87 + 1 => Object::CurveInward( 88 + start, 89 + region.random_end(rng, start), 90 + line_width, 91 + ), 92 + 2 => Object::CurveOutward( 93 + start, 94 + region.random_end(rng, start), 95 + line_width, 96 + ), 79 97 3 => Object::Line( 80 - Point::random(region), 81 - Point::random(region), 98 + Point::random(rng, region), 99 + Point::random(rng, region), 82 100 line_width, 83 101 ), 84 102 _ => unreachable!(),
+3 -3
src/random/point.rs
··· 3 3 use crate::{Point, Region}; 4 4 5 5 impl Point { 6 - pub fn random(within: &Region) -> Self { 6 + pub fn random(rng: &mut impl Rng, within: &Region) -> Self { 7 7 within.ensure_nonempty().unwrap(); 8 8 Self( 9 - rand::rng().random_range(within.x_range()), 10 - rand::rng().random_range(within.y_range()), 9 + rng.random_range(within.x_range()), 10 + rng.random_range(within.y_range()), 11 11 ) 12 12 } 13 13 }
+13 -12
src/random/region.rs
··· 1 1 use crate::{Containable, Point, Region}; 2 - use rand::{Rng, distr::uniform::SampleRange}; 2 + use rand::{distr::uniform::SampleRange, seq::IteratorRandom, Rng}; 3 3 4 4 impl Region { 5 5 pub fn random_end(&self, rng: &mut impl Rng, start: Point) -> Point { ··· 33 33 } 34 34 35 35 pub fn random(rng: &mut impl Rng, within: &Region) -> Self { 36 - let start = Point::random(within); 36 + let start = Point::random(rng, within); 37 37 let end = within.random_end(rng, start); 38 38 Region::from(if start.0 > end.0 { 39 39 (end, start) ··· 42 42 }) 43 43 } 44 44 45 - pub fn random_point(&self) -> Point { 46 - Point::random(self) 45 + pub fn random_point(&self, rng: &mut impl Rng) -> Point { 46 + Point::random(rng, self) 47 47 } 48 48 49 - pub fn random_point_except(&self, except: &Region) -> Point { 50 - // XXX this is probably not a good idea lmao 51 - loop { 52 - let point = self.random_point(); 53 - if !except.contains(&point) { 54 - return point; 55 - } 56 - } 49 + pub fn random_point_except( 50 + &self, 51 + rng: &mut impl Rng, 52 + except: &Region, 53 + ) -> Point { 54 + self.iter() 55 + .filter(|p| !except.contains(p)) 56 + .choose(rng) 57 + .unwrap() 57 58 } 58 59 } 59 60
+2 -4
src/rendering/fonts.rs
··· 1 - use std::path::PathBuf; 2 - 3 - use anyhow::anyhow; 4 1 use itertools::Itertools; 5 - use resvg::usvg::{self, fontdb::Query}; 2 + use resvg::usvg; 3 + use std::path::PathBuf; 6 4 7 5 use crate::Canvas; 8 6
+2 -3
src/video/engine.rs
··· 3 3 use crate::synchronization::audio::MusicalDurationUnit; 4 4 use crate::synchronization::midi::MidiSynchronizer; 5 5 use crate::synchronization::sync::{SyncData, Syncable}; 6 - use crate::ui::{self, Log as _, setup_progress_bar}; 6 + use crate::ui::{self, setup_progress_bar, Log as _}; 7 7 use crate::{Canvas, ColoredObject}; 8 8 use anyhow::Result; 9 9 use chrono::{DateTime, NaiveDateTime}; 10 10 use indicatif::ProgressBar; 11 11 use measure_time::debug_time; 12 - use rand::Rng; 13 - #[allow(unused)] 12 + #[cfg(feature = "mp4")] 14 13 use std::sync::{Arc, Mutex}; 15 14 use std::{fmt::Formatter, panic, path::PathBuf}; 16 15
+5 -3
src/wasm/layer.rs
··· 1 1 use super::canvas; 2 2 use crate::{ 3 - wasm::{append_new_div_inside, render_canvas, replace_content_with}, 3 + wasm::{append_new_div_inside, render_canvas, replace_content_with, RNG}, 4 4 Color, Fill, Filter, Layer, Object, Point, 5 5 }; 6 6 use wasm_bindgen::prelude::wasm_bindgen; ··· 40 40 } 41 41 42 42 pub fn random(name: &str) -> Self { 43 - let layer = canvas().random_layer(name); 44 - canvas().add_or_replace_layer(layer); 43 + unsafe { 44 + #[allow(static_mut_refs)] 45 + canvas().random_layer(&mut RNG, name); 46 + } 45 47 LayerWeb { 46 48 name: name.to_string(), 47 49 }
+9 -2
src/wasm/web.rs
··· 3 3 use std::sync::Mutex; 4 4 5 5 use once_cell::sync::Lazy; 6 + use rand::rngs::SmallRng; 7 + use rand::SeedableRng; 6 8 use wasm_bindgen::prelude::wasm_bindgen; 7 9 use wasm_bindgen::{JsValue, UnwrapThrowExt}; 8 10 ··· 15 17 16 18 static WEB_CANVAS: Lazy<Mutex<Canvas>> = 17 19 Lazy::new(|| Mutex::new(Canvas::default_settings())); 20 + 21 + pub(super) static mut RNG: Lazy<SmallRng> = 22 + Lazy::new(|| SmallRng::seed_from_u64(0xCAFE)); 18 23 19 24 pub(super) fn canvas() -> std::sync::MutexGuard<'static, Canvas> { 20 25 WEB_CANVAS.lock().unwrap() ··· 161 166 162 167 #[wasm_bindgen] 163 168 pub fn random_linelikes(name: &str) -> LayerWeb { 164 - let layer = canvas().random_linelikes(name); 165 - canvas().add_or_replace_layer(layer); 169 + unsafe { 170 + #[allow(static_mut_refs)] 171 + let layer = canvas().random_linelikes(&mut RNG, name); 172 + } 166 173 LayerWeb { 167 174 name: name.to_string(), 168 175 }