use crate::backend::render::ShapeHandle; use crate::color_transform::ColorTransform; use crate::display_object::{DisplayObjectBase, DisplayObjectImpl, DisplayObjectUpdate}; use crate::matrix::Matrix; use crate::player::{RenderContext, UpdateContext}; use bacon_rajan_cc::{Trace, Tracer}; #[derive(Clone)] pub struct Text { base: DisplayObjectBase, text_blocks: Vec, } impl Text { pub fn from_swf_tag(tag: &swf::Text) -> Self { Self { base: Default::default(), text_blocks: tag.records.clone(), } } } impl_display_object!(Text, base); impl DisplayObjectUpdate for Text { fn run_frame(&mut self, _context: &mut UpdateContext) { // Noop } fn render(&self, context: &mut RenderContext) { context.transform_stack.push(self.transform()); let mut x = 0.0; let mut y = 0.0; let mut color = swf::Color { r: 0, g: 0, b: 0, a: 0, }; let mut font_id = 0; let mut height = 0; for block in &self.text_blocks { x = block.x_offset.unwrap_or(x); y = block.y_offset.unwrap_or(y); color = block.color.as_ref().unwrap_or_else(|| &color).clone(); font_id = block.font_id.unwrap_or(font_id); height = block.height.unwrap_or(height); let mut transform = context.transform_stack.transform().clone(); transform.matrix.ty += y; if let Some(font) = context.library.get_font(font_id) { for c in &block.glyphs { if let Some(glyph) = font.get_glyph(c.index as usize) { context.renderer.render_shape(glyph, &transform); x += c.advance as f32 / 20.0; transform.matrix.tx += c.advance as f32 / 20.0; } } } } context.transform_stack.pop(); } } impl Trace for Text { fn trace(&mut self, _tracer: &mut Tracer) { // Noop } }