Packages
image
0.61.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/enum/extend_mode.ex
defmodule Image.ExtendMode do
@moduledoc """
Defines the known modes by which an image
can be extended.
"""
@extend_map %{
black: :VIPS_EXTEND_BLACK,
copy: :VIPS_EXTEND_COPY,
repeat: :VIPS_EXTEND_REPEAT,
mirror: :VIPS_EXTEND_MIRROR,
white: :VIPS_EXTEND_WHITE,
background: :VIPS_EXTEND_BACKGROUND
}
@extend Map.keys(@extend_map)
@vips_extend Map.values(@extend_map)
@reverse_extend Enum.map(@extend_map, fn {k, v} -> {v, k} end)
|> Map.new()
@typedoc """
Defines the known extend strategies.
"""
@type t :: unquote(Enum.reduce(@extend, &{:|, [], [&1, &2]}))
@doc """
Returns the known extend modes.
"""
def known_extend_modes do
@extend
end
@doc """
Normalizes and validates an extend mode.
### Arguments
* `extend` is any atom or string value
in `Image.ExtendMode.known_extend_modes/0`.
### Returns
* `{:error, normalized_extend_mode}` or
* `{:error, reason}`.
### Examples
iex> Image.Kernel.validate_extend(:black)
{:ok, :VIPS_EXTEND_BLACK}
iex> Image.Kernel.validate_extend(:VIPS_EXTEND_REPEAT)
{:ok, :VIPS_EXTEND_REPEAT}
iex> Image.Kernel.validate_extend(:unknown)
{:error, "Unknown extend mode. Found :unknown"}
"""
def validate_extend(extend) when extend in @vips_extend do
{:ok, extend}
end
def validate_extend(extend) when is_atom(extend) do
case Map.fetch(@extend_map, extend) do
{:ok, extend} -> {:ok, extend}
:error -> {:error, unknown_extend_error(extend)}
end
end
def validate_extend(extend) when is_binary(extend) do
extend
|> String.downcase()
|> String.to_existing_atom()
|> validate_extend()
rescue
ArgumentError ->
{:error, unknown_extend_error(extend)}
end
@doc false
def validate_extend(extend, options) when extend in @extend do
extend = Map.fetch!(@extend_map, extend)
options =
options
|> Keyword.delete(:interpolate)
|> Keyword.put(:extend, extend)
{:cont, options}
end
def validate_extend(extend, options) when extend in @vips_extend do
{:cont, Keyword.put(options, :extend, extend)}
end
def validate_extend(extend, _options) do
{:halt, {:error, unknown_extend_error(extend)}}
end
@doc false
def decode_extend(extend) do
Map.fetch!(@reverse_extend, extend)
end
defp unknown_extend_error(extend) do
"Unknown extend mode. Found #{inspect(extend)}"
end
end