Packages
image
0.66.0
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/radial_gradient.ex
defmodule Image.Options.RadialGradient do
@moduledoc """
Options and option validation for `Image.radial_gradient/3`.
"""
alias Image.Pixel
@typedoc """
Options applicable to `Image.radial_gradient/3`.
"""
@type radial_gradient_option ::
{:start_color, Pixel.t()}
| {:finish_color, Pixel.t()}
| {:feather, pos_integer()}
| {:radius, number()}
@typedoc """
Options list or map for `Image.radial_gradient/3`.
"""
@type radial_gradient_options :: [radial_gradient_option()] | map()
@default_start_color [0.0, 0.0, 0.0, 0.0]
@default_finish_color [0.0, 0.0, 0.0, 255.0]
@default_feather 1
@default_radius 2
@doc """
Validate the options for `Image.radial_gradient/3`.
"""
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, Map.new(options)}
end
end
defp validate_option({key, color}, options)
when key in [:start_color, :finish_color] and is_list(color) and length(color) in [3, 4] do
if Enum.all?(color, &is_number/1) do
{:cont, Keyword.put(options, key, ensure_alpha(color))}
else
resolve_gradient_color(key, color, options)
end
end
defp validate_option({key, color}, options)
when key in [:start_color, :finish_color] do
resolve_gradient_color(key, color, options)
end
defp validate_option({:radius, angle}, options) when is_number(angle) do
{:cont, options}
end
defp validate_option({:feather, feather}, options) when feather in 1..10 do
{:cont, options}
end
defp validate_option(option, _options) do
{:halt, {:error, invalid_option(option)}}
end
defp resolve_gradient_color(key, color, options) do
case Pixel.to_srgb(color) do
{:ok, pixel} ->
{:cont, Keyword.put(options, key, ensure_alpha(pixel))}
_other ->
{:halt, {:error, invalid_option({key, color})}}
end
end
# Gradient math operates on RGBA, so opaque sRGB inputs need an
# explicit alpha appended.
defp ensure_alpha([_, _, _] = rgb), do: rgb ++ [255]
defp ensure_alpha([_, _, _, _] = rgba), do: rgba
defp invalid_option(option) do
"Invalid option or option value: #{inspect(option)}"
end
defp default_options do
[
start_color: @default_start_color,
finish_color: @default_finish_color,
feather: @default_feather,
radius: @default_radius
]
end
end