Skip to main content

lib/skia/command_spec/text.ex

defmodule Skia.CommandSpec.Text do
  @moduledoc false

  alias Skia.CommandSpec.Types, as: T

  def commands do
    [
      text_blob: [
        handler: :draw_text_blob,
        args: [blob: T.text_blob()],
        defaults: [fill: :black],
        opts:
          [
            [name: :x, type: :number, required: true],
            [name: :y, type: :number, required: true]
          ] ++ T.paint_opts(),
        text_draw: [
          setup: [
            {:let, "blob", "text_blob_from_term(*args.first().ok_or(rustler::Error::BadArg)?)?"},
            {:let, "paint",
             "match opts.fill { Some(term) => decode_paint(term)?, None => fill_paint(Color::BLACK) }"},
            {:let_mut, "paint", "paint"},
            {:stmt, "apply_paint_effects(&mut paint, raw_opts)?"}
          ],
          body: [
            {:call, "canvas", :draw_text_blob,
             [{:ref, "blob"}, {:tuple, ["opts.x", "opts.y"]}, {:ref, "paint"}]}
          ]
        ],
        native_refs: ["skia_safe::Canvas::draw_text_blob"]
      ],
      text: [
        handler: :draw_text,
        args: [text: :string],
        defaults: [size: 16, fill: :black],
        opts: [
          [name: :x, type: :number, required: true],
          [name: :y, type: :number, required: true],
          [name: :width, type: :number],
          [name: :size, type: :number],
          [name: :fill, type: T.color()],
          [name: :font, type: :font],
          [name: :weight, type: :integer],
          [name: :align, type: :atom],
          [name: :direction, type: :atom],
          [name: :font_family, type: :string],
          [name: :line_height, type: :number],
          [name: :spans, type: :term]
        ],
        text_draw: [
          setup: [
            {:let, "text", "args.first().ok_or(rustler::Error::BadArg)?.decode::<String>()?"},
            {:let, "size", "opts.size.unwrap_or(16.0)"},
            {:let_mut, "font",
             "match opts.font { Some(term) => font_from_term(term, size)?, None => Font::default() }"},
            {:call, "font", :set_size, ["size"]},
            {:let, "paint",
             "match opts.fill { Some(term) => fill_paint(decode_color(term)?), None => fill_paint(Color::BLACK) }"}
          ],
          body: [
            {:if_let_else, "Some(width)", "opts.width",
             [
               {:stmt,
                "draw_paragraph_text(canvas, &text, opts.x, opts.y, width, size, &paint, &opts)?"}
             ],
             [
               {:call, "canvas", :draw_str,
                ["text", {:tuple, ["opts.x", "opts.y"]}, {:ref, "font"}, {:ref, "paint"}]}
             ]}
          ]
        ],
        native_refs: ["skia_safe::Canvas::draw_str", "skia_safe::Font::measure_str"]
      ]
    ]
  end
end