feat: add full custom image and gif support for G835L

This commit is contained in:
Ghoul
2026-01-22 21:29:36 +05:00
parent 4db901ce17
commit bf0ea88f01

View File

@@ -276,8 +276,8 @@ impl AnimeImage {
// 33.0 = Longest row LED count (physical) plus half-pixel offset // 33.0 = Longest row LED count (physical) plus half-pixel offset
AnimeType::GA401 => (33.0 + 0.5) * Self::scale_x(anime_type), AnimeType::GA401 => (33.0 + 0.5) * Self::scale_x(anime_type),
AnimeType::GU604 => (38.0 + 0.5) * Self::scale_x(anime_type), AnimeType::GU604 => (38.0 + 0.5) * Self::scale_x(anime_type),
// G835L: max 15 LEDs wide + rectangle shift (~20 pixels) + stagger // G835L: max X span is 33.5 LEDs (-0.5..33.0)
AnimeType::G835L => (35.0 + 0.5) * Self::scale_x(anime_type), AnimeType::G835L => (33.0 + 0.5) * Self::scale_x(anime_type),
_ => (35.0 + 0.5) * Self::scale_x(anime_type), _ => (35.0 + 0.5) * Self::scale_x(anime_type),
} }
} }
@@ -448,13 +448,35 @@ impl AnimeImage {
let transform = let transform =
Mat3::from_scale_angle_translation(self.scale, self.angle, self.translation); Mat3::from_scale_angle_translation(self.scale, self.angle, self.translation);
let pos_in_leds = Mat3::from_translation(Vec2::new(20.0, 20.0)); let pos_in_leds = Mat3::from_translation(self.led_center());
// Get LED-to-image coords // Get LED-to-image coords
let led_from_px = pos_in_leds * led_from_cm * transform * cm_from_px * center; let led_from_px = pos_in_leds * led_from_cm * transform * cm_from_px * center;
led_from_px.inverse() led_from_px.inverse()
} }
fn led_center(&self) -> Vec2 {
if self.anime_type != AnimeType::G835L {
return Vec2::new(20.0, 20.0);
}
let mut min = Vec2::splat(f32::INFINITY);
let mut max = Vec2::splat(f32::NEG_INFINITY);
for led in self.led_pos.iter().flatten() {
let pos = Vec2::new(led.x(), led.y());
min = min.min(pos);
max = max.max(pos);
}
if min.x.is_finite() {
let mut center = (min + max) * 0.5;
center.y += 1.0;
center
} else {
Vec2::new(20.0, 20.0)
}
}
/// Generate the base image from inputs. The result can be displayed as is /// Generate the base image from inputs. The result can be displayed as is
/// or updated via scale, position, or angle then displayed again after /// or updated via scale, position, or angle then displayed again after
/// `update()`. /// `update()`.