2023-10-28 21:38:17 +00:00
|
|
|
//! A module for writing intros and outros
|
|
|
|
|
2024-04-10 10:55:00 +00:00
|
|
|
use crate::{time::format_date_long, ProjectLecture, Resolution};
|
2023-10-28 21:38:17 +00:00
|
|
|
use svgwriter::{
|
|
|
|
tags::{Group, Rect, TagWithPresentationAttributes, Text},
|
|
|
|
Graphic
|
|
|
|
};
|
|
|
|
|
|
|
|
#[repr(u16)]
|
|
|
|
enum FontSize {
|
|
|
|
Huge = 72,
|
|
|
|
Large = 56,
|
|
|
|
Big = 44
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(u16)]
|
|
|
|
enum FontWeight {
|
|
|
|
Normal = 400,
|
|
|
|
SemiBold = 500,
|
|
|
|
Bold = 700
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Iotro {
|
|
|
|
res: Resolution,
|
|
|
|
g: Group
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Iotro {
|
|
|
|
fn new(res: Resolution) -> Self {
|
|
|
|
Self {
|
|
|
|
res,
|
|
|
|
g: Group::new()
|
|
|
|
.with_fill("white")
|
|
|
|
.with_text_anchor("middle")
|
|
|
|
.with_dominant_baseline("hanging")
|
|
|
|
.with_font_family("Noto Sans")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn add_text<T: Into<String>>(
|
|
|
|
&mut self,
|
|
|
|
font_size: FontSize,
|
|
|
|
font_weight: FontWeight,
|
|
|
|
y_top: usize,
|
|
|
|
content: T
|
|
|
|
) {
|
|
|
|
let mut text = Text::new()
|
|
|
|
.with_x(960)
|
|
|
|
.with_y(y_top)
|
|
|
|
.with_font_size(font_size as u16)
|
|
|
|
.with_font_weight(font_weight as u16);
|
|
|
|
text.push(content.into());
|
|
|
|
self.g.push(text);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn finish(self) -> Graphic {
|
|
|
|
let mut svg = Graphic::new();
|
|
|
|
svg.set_width(self.res.width());
|
|
|
|
svg.set_height(self.res.height());
|
|
|
|
svg.set_view_box("0 0 1920 1080");
|
|
|
|
svg.push(
|
|
|
|
Rect::new()
|
|
|
|
.with_fill("black")
|
|
|
|
.with_x(0)
|
|
|
|
.with_y(0)
|
|
|
|
.with_width(1920)
|
|
|
|
.with_height(1080)
|
|
|
|
);
|
|
|
|
svg.push(self.g);
|
|
|
|
svg
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-04-10 10:55:00 +00:00
|
|
|
pub(crate) fn intro(res: Resolution, lecture: &ProjectLecture) -> Graphic {
|
2023-10-28 21:38:17 +00:00
|
|
|
use self::{FontSize::*, FontWeight::*};
|
|
|
|
|
|
|
|
let mut intro = Iotro::new(res);
|
2024-04-10 10:55:00 +00:00
|
|
|
intro.add_text(Huge, Bold, 110, &lecture.label);
|
|
|
|
intro.add_text(Huge, SemiBold, 250, &lecture.docent);
|
2023-10-28 21:38:17 +00:00
|
|
|
intro.add_text(
|
|
|
|
Huge,
|
|
|
|
SemiBold,
|
|
|
|
460,
|
2024-04-10 10:55:00 +00:00
|
|
|
format!("Vorlesung vom {}", format_date_long(lecture.date))
|
2023-10-28 21:38:17 +00:00
|
|
|
);
|
|
|
|
intro.add_text(
|
|
|
|
Big,
|
|
|
|
Normal,
|
|
|
|
870,
|
|
|
|
"Video erstellt von der Video AG, Fachschaft I/1"
|
|
|
|
);
|
|
|
|
intro.add_text(Big, Normal, 930, "https://video.fsmpi.rwth-aachen.de");
|
|
|
|
intro.add_text(Big, Normal, 990, "video@fsmpi.rwth-aachen.de");
|
|
|
|
|
|
|
|
intro.finish()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub(crate) fn outro(res: Resolution) -> Graphic {
|
|
|
|
use self::{FontSize::*, FontWeight::*};
|
|
|
|
|
|
|
|
let mut outro = Iotro::new(res);
|
|
|
|
outro.add_text(Large, SemiBold, 50, "Video erstellt von der");
|
|
|
|
outro.add_text(Huge, Bold, 210, "Video AG, Fachschaft I/1");
|
|
|
|
outro.add_text(Large, Normal, 360, "Website der Fachschaft:");
|
|
|
|
outro.add_text(Large, Normal, 430, "https://www.fsmpi.rwth-aachen.de");
|
|
|
|
outro.add_text(Large, Normal, 570, "Videos herunterladen:");
|
|
|
|
outro.add_text(Large, Normal, 640, "https://video.fsmpi.rwth-aachen.de");
|
|
|
|
outro.add_text(Large, Normal, 780, "Fragen, Vorschläge und Feedback:");
|
|
|
|
outro.add_text(Large, Normal, 850, "video@fsmpi.rwth-aachen.de");
|
|
|
|
|
|
|
|
outro.finish()
|
|
|
|
}
|