Packages
image
0.52.1
0.72.0
0.71.0
0.70.0
0.69.0
0.68.0
0.67.0
0.67.0-dev
retired
0.66.0
0.65.0
0.64.0
0.63.0
0.62.1
0.62.0
0.61.1
0.61.0
0.60.0
0.59.3
0.59.2
0.59.1
0.59.0
0.58.0
0.57.0
0.56.1
0.56.0
0.55.2
0.55.1
retired
0.55.0
0.54.4
0.54.3
0.54.2
0.54.1
0.54.0
0.53.0
0.52.3
0.52.2
0.52.1
0.52.0
retired
0.51.0
0.50.0
0.49.0
0.48.1
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.2
0.43.1
0.43.0
0.42.0
0.41.0
0.40.0
0.39.3
0.39.2
0.39.1
0.39.0
0.38.4
0.38.3
0.38.2
0.38.1
0.38.0
0.37.0
0.36.2
0.36.1
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.1
0.31.0
0.30.0
0.29.0
0.28.2
0.28.1
0.28.0
0.27.0
0.26.0
0.25.1
0.25.0
0.24.1
0.24.0
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.0
0.20.0
retired
0.19.0
0.18.1
0.18.0
0.17.0
0.16.0
0.15.0
0.14.4
0.14.2
0.14.1
0.14.0
retired
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.10.0-rc.0
retired
0.9.0
retired
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
An approachable image processing library primarily based upon Vix and libvips that is NIF-based, fast, multi-threaded, pipelined and has a low memory footprint.
Current section
Files
Jump to
Current section
Files
lib/image/options/join.ex
defmodule Image.Options.Join do
@moduledoc """
Options and option validation for `Image.join/2`.
"""
alias Image.Color
@typedoc """
Options applicable to `Image.join/2`.
"""
@type join_option ::
{:vertical_spacing, non_neg_integer()}
| {:horizontal_spacing, non_neg_integer()}
| {:vertical_align, :top | :center | :bottom}
| {:horizontal_align, :left | :center | :right}
| {:background_color, Color.t() | nil}
| {:shim, non_neg_integer()}
| {:across, pos_integer()}
@typedoc """
Image.join/2 options list.
"""
@type join_options :: [join_option()]
# Ussed by Image.join/2 and defines the
# vertical spacing in pixels between images.
@default_vertical_spacing 0
# Ussed by Image.join/2 and defines the
# horizontal spacing in pixels between images.
@default_horizontal_spacing 0
# Default vertical alignment of images.
@default_vertical_alignment :bottom
# Default horizontal alignment of images.
@default_horizontal_alignment :left
# Default background color of the final iamge.
@default_background_color nil
# Default pixels between images.
@default_shim_in_pixels 0
# Default umber of images across the grid.
@default_images_across 1
# Maps from api values to libvips values
@alignment_map %{
bottom: :VIPS_ALIGN_LOW,
middle: :VIPS_ALIGN_CENTRE,
top: :VIPS_ALIGN_HIGH,
left: :VIPS_ALIGN_LOW,
centre: :VIPS_ALIGN_CENTRE,
right: :VIPS_ALIGN_HIGH
}
@doc """
Validate the options for `Image.join/2`.
"""
def validate_options(options) when is_list(options) do
options = Keyword.merge(default_options(), options)
case Enum.reduce_while(options, options, &validate_option(&1, &2)) do
{:error, value} ->
{:error, value}
options ->
{:ok, options}
end
end
# Docs say default vertical spacing is 1 but that produces
# incorrect results. So we delete the option instead.
defp validate_option({:vertical_spacing, 0}, options) do
{:cont, Keyword.delete(options, :vertical_spacing)}
end
defp validate_option({:vertical_spacing, vertical_spacing}, options)
when is_integer(vertical_spacing) and vertical_spacing > 0 do
{:cont, replace_option(options, :vertical_spacing, :vspacing, vertical_spacing)}
end
# Docs say default horizontal spacing is 1 but that produces
# incorrect results. So we delete the option instead.
defp validate_option({:horizontal_spacing, 0}, options) do
{:cont, Keyword.delete(options, :horizontal_spacing)}
end
defp validate_option({:horizontal_spacing, horizontal_spacing}, options)
when is_integer(horizontal_spacing) and horizontal_spacing > 0 do
{:cont, replace_option(options, :horizontal_spacing, :hspacing, horizontal_spacing)}
end
defp validate_option({:vertical_align, vertical_align}, options)
when vertical_align in [:bottom, :middle, :high] do
{:cont,
replace_option(options, :vertical_align, :valign, Map.get(@alignment_map, vertical_align))}
end
defp validate_option({:horizontal_align, horizontal_align}, options)
when horizontal_align in [:left, :centre, :right] do
{:cont,
replace_option(options, :horizontal_align, :halign, Map.get(@alignment_map, horizontal_align))}
end
defp validate_option({:background_color, nil}, options) do
{:cont, Keyword.delete(options, :background_color)}
end
defp validate_option({:background_color, color} = option, options) do
case Color.rgb_color(color) do
{:ok, hex: _hex, rgb: color} ->
{:cont, replace_option(options, :background_color, :background, color)}
{:ok, color} ->
{:cont, replace_option(options, :background_color, :background, color)}
_other ->
{:halt, invalid_option(option)}
end
end
defp validate_option({:shim, shim}, options)
when is_integer(shim) and shim >= 0 do
{:cont, options}
end
defp validate_option({:across, across}, options)
when is_integer(across) and across > 0 do
{:cont, options}
end
defp validate_option(option, _options) do
{:halt, {:error, invalid_option(option)}}
end
defp invalid_option(option) do
"Invalid option or option value: #{inspect(option)}"
end
defp replace_option(options, from, to, value) do
options
|> Keyword.delete(from)
|> Keyword.put(to, value)
end
defp default_options do
[
vertical_spacing: @default_vertical_spacing,
horizontal_spacing: @default_horizontal_spacing,
vertical_align: @default_vertical_alignment,
horizontal_align: @default_horizontal_alignment,
background_color: @default_background_color,
shim: @default_shim_in_pixels,
across: @default_images_across
]
end
end