Current section

Files

Jump to
skia lib skia command_spec shapes.ex
Raw

lib/skia/command_spec/shapes.ex

defmodule Skia.CommandSpec.Shapes do
@moduledoc false
alias Skia.CommandSpec.Types, as: T
def commands do
[
clear: [
handler: :draw_clear,
args: [color: T.color()],
opts: [],
shape_draw: [
body: [
{:if_let, "Some(color)", "args.first().and_then(|term| decode_color(*term).ok())",
[{:call, "canvas", :clear, ["color"]}]}
]
],
native_refs: ["skia_safe::Canvas::clear"]
],
rect: [
handler: :draw_rect,
args: [],
defaults: [radius: 0],
opts: T.rect_opts() ++ [[name: :radius, type: :number]] ++ T.paint_opts(),
shape_draw: [
setup: [
{:let, "rect", "Rect::from_xywh(opts.x, opts.y, opts.width, opts.height)"},
{:let, "radius", "opts.radius.unwrap_or(0.0)"}
],
body: paint_shape_body({:stmt, "draw_rect_shape(canvas, rect, radius, &paint)"})
],
native_refs: ["skia_safe::Canvas::draw_rect", "skia_safe::Canvas::draw_rrect"]
],
oval: [
handler: :draw_oval,
args: [],
opts: T.rect_opts() ++ T.paint_opts(),
shape_draw: [
setup: [{:let, "rect", "Rect::from_xywh(opts.x, opts.y, opts.width, opts.height)"}],
body: paint_shape_body({:call, "canvas", :draw_oval, ["rect", "&paint"]})
],
native_refs: ["skia_safe::Canvas::draw_oval"]
],
arc: [
handler: :draw_arc,
args: [],
defaults: [use_center: false],
opts:
T.rect_opts() ++
[
[name: :start_degrees, type: :number, required: true],
[name: :sweep_degrees, type: :number, required: true],
[name: :use_center, type: :boolean]
] ++ T.paint_opts(),
shape_draw: [
setup: [
{:let, "rect", "Rect::from_xywh(opts.x, opts.y, opts.width, opts.height)"},
{:let, "use_center", "opts.use_center.unwrap_or(false)"}
],
body:
paint_shape_body(
{:call, "canvas", :draw_arc,
["rect", "opts.start_degrees", "opts.sweep_degrees", "use_center", "&paint"]}
)
],
native_refs: ["skia_safe::Canvas::draw_arc"]
],
circle: [
handler: :draw_circle,
args: [],
opts:
[
[name: :x, type: :number, required: true],
[name: :y, type: :number, required: true],
[name: :radius, type: :number, required: true]
] ++ T.paint_opts(),
shape_draw: [
setup: [{:let, "center", "Point::new(opts.x, opts.y)"}],
body:
paint_shape_body({:call, "canvas", :draw_circle, ["center", "opts.radius", "&paint"]})
],
native_refs: ["skia_safe::Canvas::draw_circle"]
],
vertices: [
handler: :draw_vertices,
args: [vertices: T.vertices()],
defaults: [blend_mode: :src_over],
opts: T.paint_opts(),
shape_draw: [
setup: [
{: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"},
{:stmt, "apply_paint_effects(&mut paint, raw_opts)?"}
],
body: [
{:call, "canvas", :draw_vertices, [{:ref, "vertices"}, "blend_mode", {:ref, "paint"}]}
]
],
native_refs: ["skia_safe::Canvas::draw_vertices"]
],
line: [
handler: :draw_line,
args: [],
opts: [
[name: :from, type: {:tuple, [:number, :number]}, required: true],
[name: :to, type: {:tuple, [:number, :number]}, required: true],
[name: :stroke, type: T.color(), required: true],
[name: :stroke_width, type: :number],
[name: :stroke_cap, type: T.stroke_cap()],
[name: :stroke_join, type: T.stroke_join()],
[name: :stroke_miter, type: :number],
[name: :blend_mode, type: T.blend_mode()]
],
shape_draw: [
body: [
{:let, "color", "decode_color(opts.stroke)?"},
{:let, "paint", "stroke_paint(color, opts.stroke_width.unwrap_or(1.0), raw_opts)?"},
{:call, "canvas", :draw_line,
["point_from_term(opts.from)?", "point_from_term(opts.to)?", "&paint"]}
]
],
native_refs: ["skia_safe::Canvas::draw_line"]
]
]
end
defp paint_shape_body(draw_call) do
[
{:if_let, "Some(mut paint)", "opt_fill_paint(raw_opts, atoms::fill())?",
[{:stmt, "apply_blend_mode(&mut paint, raw_opts)?"}, draw_call]},
{: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_call
]}
]
end
end