Packages
vix
0.39.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.1
0.33.0
0.32.0
0.31.1
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.1
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.1
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.0
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.2.1
0.2.0
retired
0.1.0
NIF based bindings for libvips
Current section
Files
Jump to
Current section
Files
lib/vix/vips/array.ex
defmodule Vix.Vips.ArrayHelper do
@moduledoc false
alias Vix.Nif
alias Vix.Vips
def __before_compile__(env) do
def_vips_array(env, %{
module_name: Int,
nested_type: Vix.GObject.Int,
nested_typespec: Macro.escape(quote(do: integer())),
to_nif_term: &Nif.nif_int_array/1,
to_erl_term: &Nif.nif_vips_int_array_to_erl_list/1
})
def_vips_array(env, %{
module_name: Double,
nested_type: Vix.GObject.Double,
nested_typespec: Macro.escape(quote(do: float())),
to_nif_term: &Nif.nif_double_array/1,
to_erl_term: &Nif.nif_vips_double_array_to_erl_list/1
})
def_vips_array(env, %{
module_name: Image,
nested_type: Vips.Image,
nested_typespec: Macro.escape(quote(do: Vips.Image.t())),
to_nif_term: &Nif.nif_image_array/1,
to_erl_term: &Nif.nif_vips_image_array_to_erl_list/1
})
# array of enum
def_vips_array(env, %{
module_name: Enum.VipsBlendMode,
nested_type: Vips.Enum.VipsBlendMode,
nested_typespec: Macro.escape(quote(do: Vips.Operation.vips_blend_mode())),
to_nif_term: &Nif.nif_int_array/1,
to_erl_term: &Nif.nif_vips_int_array_to_erl_list/1
})
end
def def_vips_array(env, opts) do
module_name = Module.concat([Vix.Vips.Array, opts.module_name])
contents =
quote do
# Internal module
@nested_type unquote(opts.nested_type)
@to_nif_term unquote(opts.to_nif_term)
@to_erl_term unquote(opts.to_erl_term)
@moduledoc false
@opaque t() :: reference()
alias Vix.Type
@behaviour Type
@impl Type
def typespec do
nested_typespec = unquote(opts.nested_typespec)
quote do
list(unquote(nested_typespec))
end
end
@impl Type
def default(default), do: default
@impl Type
def to_nif_term(value, data) do
Enum.map(value, fn nested_value ->
@nested_type.to_nif_term(nested_value, data)
end)
|> @to_nif_term.()
end
@impl Type
def to_erl_term(value) do
{:ok, list} = @to_erl_term.(value)
Enum.map(list, fn nested_value ->
@nested_type.to_erl_term(nested_value)
end)
end
end
Module.create(module_name, contents, line: env.line, file: env.file)
end
end
defmodule Vix.Vips.Array do
@moduledoc false
@before_compile Vix.Vips.ArrayHelper
end