Packages
image
0.8.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 for the draw functions.
"""
alias Image.Color
alias Image.CombineMode
@type circle :: [
{:fill, boolean()} |
{:color, Color.t()}
]
@type rect :: [
{:fill, boolean()} |
{:color, Color.t()}
]
@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()}
]
def default_options(:circle) do
[
color: :black,
fill: true
]
end
def default_options(:rect) do
[
color: :black,
fill: true
]
end
def default_options(:line) do
[
color: :black
]
end
def default_options(:point) do
[
color: :black
]
end
def default_options(:mask) do
[
color: :black
]
end
def default_options(:flood) do
[
color: :black,
equal: false
]
end
def default_options(:image) do
[
mode: :VIPS_COMBINE_MODE_SET
]
end
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, {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