use tui_vfx_types::{Grid, Rect};
use crate::renderers::{
BrailleRenderer, GradientRenderer, HalfBlockRenderer, MediumShadeRenderer, SolidRenderer,
};
use crate::types::{ShadowConfig, ShadowStyle};
pub fn render_shadow<G: Grid>(
grid: &mut G,
element_rect: Rect,
config: &ShadowConfig,
progress: f64,
) {
match config.style {
ShadowStyle::HalfBlock => {
HalfBlockRenderer::render(grid, element_rect, config, progress);
}
ShadowStyle::Braille { density } => {
BrailleRenderer::render(grid, element_rect, config, density, progress);
}
ShadowStyle::MediumShade => {
MediumShadeRenderer::render(grid, element_rect, config, progress);
}
ShadowStyle::Solid => {
SolidRenderer::render(grid, element_rect, config, progress);
}
ShadowStyle::Gradient { layers } => {
GradientRenderer::render(grid, element_rect, config, layers, progress);
}
}
}
pub fn render_shadow_simple<G: Grid>(
grid: &mut G,
element_rect: Rect,
shadow_color: tui_vfx_types::Color,
surface_color: Option<tui_vfx_types::Color>,
progress: f64,
) {
let mut config = ShadowConfig::new(shadow_color);
if let Some(surface) = surface_color {
config = config.with_surface_color(surface);
}
render_shadow(grid, element_rect, &config, progress);
}
pub fn render_shadow_gradient_colors<G: Grid>(
grid: &mut G,
element_rect: Rect,
config: &ShadowConfig,
colors: &[tui_vfx_types::Color],
progress: f64,
) {
GradientRenderer::render_with_colors(grid, element_rect, config, colors, progress);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::ShadowEdges;
use tui_vfx_types::{Color, OwnedGrid};
#[test]
fn test_render_shadow_half_block() {
let mut grid = OwnedGrid::new(30, 15);
let rect = Rect::new(5, 2, 10, 6);
let config = ShadowConfig::new(Color::BLACK.with_alpha(200))
.with_style(ShadowStyle::HalfBlock)
.with_offset(2, 1) .with_edges(ShadowEdges::BOTTOM_RIGHT);
render_shadow(&mut grid, rect, &config, 1.0);
let cell = grid.get(15, 4).unwrap();
assert_ne!(cell.fg, Color::TRANSPARENT); let cell = grid.get(16, 4).unwrap();
assert_ne!(cell.fg, Color::TRANSPARENT); }
#[test]
fn test_render_shadow_solid() {
let mut grid = OwnedGrid::new(30, 15);
let rect = Rect::new(5, 2, 10, 6);
let config = ShadowConfig::new(Color::BLACK.with_alpha(200))
.with_style(ShadowStyle::Solid)
.with_edges(ShadowEdges::BOTTOM_RIGHT);
render_shadow(&mut grid, rect, &config, 1.0);
let cell = grid.get(15, 4).unwrap();
assert_ne!(cell.bg, Color::TRANSPARENT);
}
#[test]
fn test_render_shadow_braille() {
let mut grid = OwnedGrid::new(30, 15);
let rect = Rect::new(5, 2, 10, 6);
let config = ShadowConfig::new(Color::BLACK.with_alpha(200))
.with_style(ShadowStyle::braille(0.7))
.with_edges(ShadowEdges::BOTTOM_RIGHT);
render_shadow(&mut grid, rect, &config, 1.0);
let cell = grid.get(15, 4).unwrap();
assert_ne!(cell.ch, ' ');
}
#[test]
fn test_render_shadow_medium_shade() {
let mut grid = OwnedGrid::new(30, 15);
let rect = Rect::new(5, 2, 10, 6);
let config = ShadowConfig::new(Color::BLACK.with_alpha(200))
.with_style(ShadowStyle::MediumShade)
.with_edges(ShadowEdges::BOTTOM_RIGHT);
render_shadow(&mut grid, rect, &config, 1.0);
let cell = grid.get(15, 4).unwrap();
assert_eq!(cell.ch, '▒');
assert_ne!(cell.fg, Color::TRANSPARENT);
}
#[test]
fn test_render_shadow_gradient() {
let mut grid = OwnedGrid::new(30, 15);
let rect = Rect::new(5, 2, 10, 6);
let config = ShadowConfig::new(Color::BLACK.with_alpha(200))
.with_style(ShadowStyle::gradient(3))
.with_edges(ShadowEdges::BOTTOM_RIGHT);
render_shadow(&mut grid, rect, &config, 1.0);
let cell = grid.get(15, 4).unwrap();
assert_ne!(cell.bg, Color::TRANSPARENT);
}
#[test]
fn test_render_shadow_simple() {
let mut grid = OwnedGrid::new(30, 15);
let rect = Rect::new(5, 2, 10, 6);
render_shadow_simple(&mut grid, rect, Color::BLACK.with_alpha(128), None, 1.0);
let cell = grid.get(15, 4).unwrap();
assert_ne!(cell.fg, Color::TRANSPARENT);
}
}