Skip to main content

native/skia_native/src/generated_shapes.rs

// Generated by mix skia.codegen. Do not edit by hand.

fn draw_clear_impl<'a>(
    canvas: &skia_safe::Canvas,
    args: Vec<Term<'a>>,
) -> NifResult<()> {
    if let Some(color) = args.first().and_then(|term| decode_color(*term).ok()) {
        canvas.clear(color);
    }
    Ok(())
}
fn draw_rect_impl<'a>(
    canvas: &skia_safe::Canvas,
    opts: generated_opts::RectOpts<'a>,
    raw_opts: &[(Atom, Term<'a>)],
) -> NifResult<()> {
    let rect = Rect::from_xywh(opts.x, opts.y, opts.width, opts.height);
    let radius = opts.radius.unwrap_or(0.0);
    if let Some(mut paint) = opt_fill_paint(raw_opts, atoms::fill())? {
        apply_blend_mode(&mut paint, raw_opts)?;
        draw_rect_shape(canvas, rect, radius, &paint);
    }
    if let Some(color) = opt_color(raw_opts, atoms::stroke())? {
        let paint = stroke_paint(color, opts.stroke_width.unwrap_or(1.0), raw_opts)?;
        draw_rect_shape(canvas, rect, radius, &paint);
    }
    Ok(())
}
fn draw_oval_impl<'a>(
    canvas: &skia_safe::Canvas,
    opts: generated_opts::OvalOpts<'a>,
    raw_opts: &[(Atom, Term<'a>)],
) -> NifResult<()> {
    let rect = Rect::from_xywh(opts.x, opts.y, opts.width, opts.height);
    if let Some(mut paint) = opt_fill_paint(raw_opts, atoms::fill())? {
        apply_blend_mode(&mut paint, raw_opts)?;
        canvas.draw_oval(rect, &paint);
    }
    if let Some(color) = opt_color(raw_opts, atoms::stroke())? {
        let paint = stroke_paint(color, opts.stroke_width.unwrap_or(1.0), raw_opts)?;
        canvas.draw_oval(rect, &paint);
    }
    Ok(())
}
fn draw_arc_impl<'a>(
    canvas: &skia_safe::Canvas,
    opts: generated_opts::ArcOpts<'a>,
    raw_opts: &[(Atom, Term<'a>)],
) -> NifResult<()> {
    let rect = Rect::from_xywh(opts.x, opts.y, opts.width, opts.height);
    let use_center = opts.use_center.unwrap_or(false);
    if let Some(mut paint) = opt_fill_paint(raw_opts, atoms::fill())? {
        apply_blend_mode(&mut paint, raw_opts)?;
        canvas
            .draw_arc(rect, opts.start_degrees, opts.sweep_degrees, use_center, &paint);
    }
    if let Some(color) = opt_color(raw_opts, atoms::stroke())? {
        let paint = stroke_paint(color, opts.stroke_width.unwrap_or(1.0), raw_opts)?;
        canvas
            .draw_arc(rect, opts.start_degrees, opts.sweep_degrees, use_center, &paint);
    }
    Ok(())
}
fn draw_circle_impl<'a>(
    canvas: &skia_safe::Canvas,
    opts: generated_opts::CircleOpts<'a>,
    raw_opts: &[(Atom, Term<'a>)],
) -> NifResult<()> {
    let center = Point::new(opts.x, opts.y);
    if let Some(mut paint) = opt_fill_paint(raw_opts, atoms::fill())? {
        apply_blend_mode(&mut paint, raw_opts)?;
        canvas.draw_circle(center, opts.radius, &paint);
    }
    if let Some(color) = opt_color(raw_opts, atoms::stroke())? {
        let paint = stroke_paint(color, opts.stroke_width.unwrap_or(1.0), raw_opts)?;
        canvas.draw_circle(center, opts.radius, &paint);
    }
    Ok(())
}
fn draw_vertices_impl<'a>(
    canvas: &skia_safe::Canvas,
    args: Vec<Term<'a>>,
    opts: generated_opts::VerticesOpts<'a>,
    raw_opts: &[(Atom, Term<'a>)],
) -> NifResult<()> {
    let vertices = vertices_from_term(*args.first().ok_or(rustler::Error::BadArg)?)?;
    let blend_mode = generated_enums::decode_blend_mode(
        opts.blend_mode.unwrap_or(atoms::src_over()),
    )?;
    let paint = match opts.fill {
        Some(term) => decode_paint(term)?,
        None => fill_paint(Color::WHITE),
    };
    let mut paint = paint;
    apply_paint_effects(&mut paint, raw_opts)?;
    canvas.draw_vertices(&vertices, blend_mode, &paint);
    Ok(())
}
fn draw_line_impl<'a>(
    canvas: &skia_safe::Canvas,
    opts: generated_opts::LineOpts<'a>,
    raw_opts: &[(Atom, Term<'a>)],
) -> NifResult<()> {
    let color = decode_color(opts.stroke)?;
    let paint = stroke_paint(color, opts.stroke_width.unwrap_or(1.0), raw_opts)?;
    canvas.draw_line(point_from_term(opts.from)?, point_from_term(opts.to)?, &paint);
    Ok(())
}
fn draw_rect_shape(canvas: &skia_safe::Canvas, rect: Rect, radius: f32, paint: &Paint) {
    if radius > 0.0 {
        canvas.draw_rrect(RRect::new_rect_xy(rect, radius, radius), paint);
    } else {
        canvas.draw_rect(rect, paint);
    }
}