diff --git a/Cargo.lock b/Cargo.lock index a8d58e0..1eface9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "gd-icon-renderer" -version = "1.0.2" +version = "1.1.0" dependencies = [ "image", "imageproc", diff --git a/Cargo.toml b/Cargo.toml index 8ddccef..da116fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gd-icon-renderer" description = "A tool to render Geometry Dash icons." -version = "1.0.2" +version = "1.1.0" edition = "2021" license-file = "LICENSE" repository = "https://git.reidlab.online/reidlab/gd-icon-renderer" diff --git a/readme.md b/readme.md index 9792140..621708d 100644 --- a/readme.md +++ b/readme.md @@ -42,7 +42,5 @@ Provide your `GJ_GameSheet02-uhd`, `GJ_GameSheetGlow-uhd`, `Robot_AnimDesc2`, an ## Todo - Add examples to the repo. -- Swap to a custom `plist` parser. Current one is kinda slow. -- Stop the fucking cloning. Majority of speed lost from cloning is @ [`./src/renderer.rs:178`](./src/renderer.rs) - Trim extra alpha space on the final result. - I think theres some weird shifting and offsets going on, please investigate 🥺. Really big on `spider_16` for some reason?? Related issue on the inspired project [here](https://github.com/oatmealine/gd-icon-renderer/issues/2). \ No newline at end of file diff --git a/src/assets.rs b/src/assets.rs index fc78488..3b9341e 100644 --- a/src/assets.rs +++ b/src/assets.rs @@ -2,6 +2,7 @@ use plist; use std::collections::HashMap; +use image::GenericImageView; use image::DynamicImage; /// "{1,2}" -> `(1, 2)` @@ -195,11 +196,9 @@ pub fn load_animations(path: &str) -> Animations { } /// Trims out a sprite from an image according to a .plist spritesheet. -pub fn get_sprite(spritesheet: Spritesheet, img: DynamicImage, key: String) -> Option<(DynamicImage, Sprite)> { +pub fn get_sprite(spritesheet: Spritesheet, img: &DynamicImage, key: String) -> Option<(DynamicImage, Sprite)> { let sprite = spritesheet.sprites.get(&key); - let mut canvas = img; - if sprite.is_none() { return None; } @@ -212,7 +211,7 @@ pub fn get_sprite(spritesheet: Spritesheet, img: DynamicImage, key: String) -> O (left, top, width, height) = (left, top, height, width); } - canvas = canvas.crop(left as u32, top as u32, width as u32, height as u32); + let mut canvas: DynamicImage = image::DynamicImage::ImageRgba8(img.view(left as u32, top as u32, width as u32, height as u32).to_image()); if sprite.rotated { canvas = canvas.rotate270(); @@ -225,8 +224,7 @@ pub fn get_sprite(spritesheet: Spritesheet, img: DynamicImage, key: String) -> O } /// Trims out a sprite from an image according to a LoadedSpritesheet object. -pub fn get_sprite_from_loaded(spritesheet: LoadedSpritesheet, key: String) -> Option<(DynamicImage, Sprite)> { - let texture = spritesheet.texture; - let sprite = get_sprite(spritesheet.spritesheet, texture, key); +pub fn get_sprite_from_loaded(spritesheet: &LoadedSpritesheet, key: String) -> Option<(DynamicImage, Sprite)> { + let sprite = get_sprite(spritesheet.spritesheet.clone(), &spritesheet.texture, key); return sprite; } \ No newline at end of file diff --git a/src/renderer.rs b/src/renderer.rs index 4eb8139..bc0421f 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -129,14 +129,14 @@ pub fn render_normal(basename: String, col1: [f32; 3], col2: [f32; 3], glow: boo let layers = vec![ (if glow || (is_black(col1) && is_black(col2)) { - assets::get_sprite_from_loaded(game_sheet_glow, format!("{}_glow_001.png", basename)) + assets::get_sprite_from_loaded(&game_sheet_glow, format!("{}_glow_001.png", basename)) } else { None }), - assets::get_sprite_from_loaded(game_sheet_02.clone(), format!("{}_2_001.png", basename)), - assets::get_sprite_from_loaded(game_sheet_02.clone(), format!("{}_3_001.png", basename)), - assets::get_sprite_from_loaded(game_sheet_02.clone(), format!("{}_001.png", basename)), - assets::get_sprite_from_loaded(game_sheet_02, format!("{}_extra_001.png", basename)) + assets::get_sprite_from_loaded(&game_sheet_02, format!("{}_2_001.png", basename)), + assets::get_sprite_from_loaded(&game_sheet_02, format!("{}_3_001.png", basename)), + assets::get_sprite_from_loaded(&game_sheet_02, format!("{}_001.png", basename)), + assets::get_sprite_from_loaded(&game_sheet_02, format!("{}_extra_001.png", basename)) ]; let colors: Vec> = vec![ @@ -203,7 +203,7 @@ pub fn render_zany(basename: String, col1: [f32; 3], col2: [f32; 3], glow: bool, layers.extend(names.iter().enumerate().map(|(i, v)| { ( - assets::get_sprite_from_loaded(game_sheet_02.clone(), v.clone()), + assets::get_sprite_from_loaded(&game_sheet_02, v.clone()), a.position, flip(a.scale, a.flipped), a.rotation,