use crate::glyph_raster_bin::{GlyphRasterBin, GlyphRect};
use crate::pixfmt_rgba::PixelFormat;
use crate::renderer_base::RendererBase;
pub fn render_raster_htext_solid<PF: PixelFormat>(
ren: &mut RendererBase<PF>,
glyph: &mut GlyphRasterBin,
x: f64,
y: f64,
text: &str,
color: &PF::ColorType,
flip: bool,
) {
let mut x = x;
let mut y = y;
let mut r = GlyphRect::default();
for ch in text.bytes() {
glyph.prepare(&mut r, x, y, ch as u32, flip);
if r.x2 >= r.x1 {
if flip {
for i in r.y1..=r.y2 {
let span = glyph.span((r.y2 - i) as u32);
ren.blend_solid_hspan(r.x1, i, r.x2 - r.x1 + 1, color, span);
}
} else {
for i in r.y1..=r.y2 {
let span = glyph.span((i - r.y1) as u32);
ren.blend_solid_hspan(r.x1, i, r.x2 - r.x1 + 1, color, span);
}
}
}
x += r.dx;
y += r.dy;
}
}
pub fn render_raster_vtext_solid<PF: PixelFormat>(
ren: &mut RendererBase<PF>,
glyph: &mut GlyphRasterBin,
x: f64,
y: f64,
text: &str,
color: &PF::ColorType,
flip: bool,
) {
let mut x = x;
let mut y = y;
let mut r = GlyphRect::default();
for ch in text.bytes() {
glyph.prepare(&mut r, x, y, ch as u32, !flip);
if r.x2 >= r.x1 {
if flip {
for i in r.y1..=r.y2 {
let span = glyph.span((i - r.y1) as u32);
ren.blend_solid_vspan(i, r.x1, r.x2 - r.x1 + 1, color, span);
}
} else {
for i in r.y1..=r.y2 {
let span = glyph.span((r.y2 - i) as u32);
ren.blend_solid_vspan(i, r.x1, r.x2 - r.x1 + 1, color, span);
}
}
}
x += r.dx;
y += r.dy;
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::color::Rgba8;
use crate::pixfmt_rgba::PixfmtRgba32;
use crate::rendering_buffer::RowAccessor;
fn make_test_font() -> Vec<u8> {
let mut font = Vec::new();
font.push(2); font.push(0); font.push(65); font.push(1); font.push(0); font.push(0); font.push(2); font.push(0b1100_0000); font.push(0b1100_0000); font
}
fn make_buffer(w: u32, h: u32) -> (Vec<u8>, RowAccessor) {
let stride = (w * 4) as i32;
let buf = vec![0u8; (h * w * 4) as usize];
let mut ra = RowAccessor::new();
unsafe {
ra.attach(buf.as_ptr() as *mut u8, w, h, stride);
}
(buf, ra)
}
#[test]
fn test_render_htext() {
let font_data = make_test_font();
let mut glyph = GlyphRasterBin::new(&font_data);
let (_buf, mut ra) = make_buffer(20, 20);
let pixf = PixfmtRgba32::new(&mut ra);
let mut ren = RendererBase::new(pixf);
let red = Rgba8::new(255, 0, 0, 255);
render_raster_htext_solid(&mut ren, &mut glyph, 5.0, 5.0, "A", &red, false);
let p = ren.ren().pixel(5, 6);
assert!(p.r > 0 || p.a > 0, "Expected rendered pixel at (5,6)");
}
#[test]
fn test_render_empty_string() {
let font_data = make_test_font();
let mut glyph = GlyphRasterBin::new(&font_data);
let (_buf, mut ra) = make_buffer(20, 20);
let pixf = PixfmtRgba32::new(&mut ra);
let mut ren = RendererBase::new(pixf);
let red = Rgba8::new(255, 0, 0, 255);
render_raster_htext_solid(&mut ren, &mut glyph, 5.0, 5.0, "", &red, false);
}
}