use crate::encoding::{Encoding, WIN_ANSI_ENCODING};
use crate::fontref::FontRef;
use crate::graphicsstate::Color;
use std::io::{self, Write};
pub struct TextObject<'a> {
output: &'a mut dyn Write,
encoding: Encoding,
}
impl<'a> TextObject<'a> {
pub(crate) fn new(output: &'a mut dyn Write) -> Self {
TextObject {
output,
encoding: WIN_ANSI_ENCODING.clone(),
}
}
pub fn set_font(&mut self, font: &FontRef, size: f32) -> io::Result<()> {
self.encoding = font.get_encoding().clone();
writeln!(self.output, "{} {} Tf", font, size)
}
pub fn set_leading(&mut self, leading: f32) -> io::Result<()> {
writeln!(self.output, "{} TL", leading)
}
pub fn set_rise(&mut self, rise: f32) -> io::Result<()> {
writeln!(self.output, "{} Ts", rise)
}
pub fn set_char_spacing(&mut self, a_c: f32) -> io::Result<()> {
writeln!(self.output, "{} Tc", a_c)
}
pub fn set_word_spacing(&mut self, a_w: f32) -> io::Result<()> {
writeln!(self.output, "{} Tw", a_w)
}
pub fn set_stroke_color(&mut self, color: Color) -> io::Result<()> {
let norm = |c| f32::from(c) / 255.0;
match color {
Color::RGB { red, green, blue } => writeln!(
self.output,
"{} {} {} SC",
norm(red),
norm(green),
norm(blue),
),
Color::Gray { gray } => writeln!(self.output, "{} G", norm(gray)),
}
}
pub fn set_fill_color(&mut self, color: Color) -> io::Result<()> {
let norm = |c| f32::from(c) / 255.0;
match color {
Color::RGB { red, green, blue } => writeln!(
self.output,
"{} {} {} sc",
norm(red),
norm(green),
norm(blue),
),
Color::Gray { gray } => writeln!(self.output, "{} g", norm(gray)),
}
}
pub fn pos(&mut self, x: f32, y: f32) -> io::Result<()> {
writeln!(self.output, "{} {} Td", x, y)
}
pub fn show(&mut self, text: &str) -> io::Result<()> {
write!(self.output, "(")?;
self.output.write_all(&self.encoding.encode_string(text))?;
writeln!(self.output, ") Tj")
}
pub fn show_adjusted(&mut self, param: &[(&str, i32)]) -> io::Result<()> {
write!(self.output, "[")?;
for &(text, offset) in param {
write!(self.output, "(")?;
self.output.write_all(&self.encoding.encode_string(text))?;
write!(self.output, ") {} ", offset)?
}
writeln!(self.output, "] TJ")
}
pub fn show_line(&mut self, text: &str) -> io::Result<()> {
write!(self.output, "(")?;
self.output.write_all(&self.encoding.encode_string(text))?;
writeln!(self.output, ") '")
}
pub fn gsave(&mut self) -> io::Result<()> {
writeln!(self.output, "q")
}
pub fn grestore(&mut self) -> io::Result<()> {
writeln!(self.output, "Q")
}
}