Packages
image
0.36.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/draw.ex
defmodule Image.Options.Draw do
@moduledoc """
Options and options validation for the
drawing functionss.
"""
alias Image.Color
alias Image.CombineMode
@type circle :: [
{:fill, boolean()}
| {:color, Color.t()}
]
@type rect :: [
{:fill, boolean()}
| {:color, Color.t()}
| {:stroke_width, pos_integer()}
]
@type point :: [
{:color, Color.t()}
]
@type flood :: [
{:equal, boolean()}
| {:color, Color.t()}
]
@type mask :: [
{:color, Color.t()}
]
@type line :: [
{:color, Color.t()}
]
@type smudge :: []
@type image :: [
{:mode, CombineMode.t()}
]
@doc false
def default_options(:circle) do
[
color: :black,
fill: true,
stroke_width: 1
]
end
@doc false
def default_options(:rect) do
[
color: :black,
fill: true,
stroke_width: 1
]
end
@doc false
def default_options(:line) do
[
color: :black
]
end
@doc false
def default_options(:point) do
[
color: :black
]
end
@doc false
def default_options(:mask) do
[
color: :black
]
end
@doc false
def default_options(:flood) do
[
color: :black,
equal: false
]
end
@doc false
def default_options(:image) do
[
mode: :VIPS_COMBINE_MODE_SET
]
end
@doc false
def default_options(:smudge) do
[]
end
@doc """
Validate the options for `Image.Draw`.
"""
def validate_options(type, options) do
options = Keyword.merge(default_options(type), options)
options =
case Enum.reduce_while(options, options, &validate_option(type, &1, &2)) do
{:error, value} ->
{:error, value}
options ->
{:ok, options}
end
case options do
{:ok, options} ->
options
|> Map.new()
|> wrap(:ok)
other ->
other
end
end
defp validate_option(type, {:fill, fill}, options) when type in [:circle, :rect] do
if fill do
{:cont, Keyword.put(options, :fill, true)}
else
{:cont, Keyword.put(options, :fill, false)}
end
end
defp validate_option(type, {:color, color}, options)
when type in [:mask, :point, :circle, :rect, :line, :flood] do
case Color.rgb_color(color) do
{:ok, color} ->
rgb = if Keyword.keyword?(color), do: Keyword.fetch!(color, :rgb), else: color
{:cont, Keyword.put(options, :color, rgb)}
{:error, reason} ->
{:halt, {:error, reason}}
end
end
defp validate_option(:flood, {:equal, equal}, options) do
if equal do
{:cont, Keyword.put(options, :equal, true)}
else
{:cont, Keyword.put(options, :equal, false)}
end
end
defp validate_option(:image, {:mode, mode}, options) do
case Image.CombineMode.validate(mode) do
{:ok, mode} ->
{:cont, Keyword.put(options, :mode, mode)}
{:error, reason} ->
{:halt, {:error, reason}}
end
end
defp validate_option(type, {:stroke_width, stroke_width}, options)
when type in [:rect, :circle]
when is_integer(stroke_width) and stroke_width > 0 do
{:cont, options}
end
defp validate_option(type, {option, value}, _options) do
{:halt, {:error, invalid_option(type, option, value)}}
end
@doc false
def invalid_option(type, option) do
"Invalid option or option value for draw_#{type}: #{inspect(option)}"
end
@doc false
def invalid_option(type, option, value) do
"Invalid option or option value for draw_#{type}: #{option}: #{inspect(value)}"
end
defp wrap(term, atom) do
{atom, term}
end
end