defmodule Image.Plug.Pipeline.Ops.Resize do @moduledoc """ Resize operation. Combines target dimensions, fit mode, gravity (focal point for cropping), upscale policy, and DPR (device pixel ratio). Either `:width`, `:height`, or both may be set. When only one is set, the other is inferred from the source aspect ratio per the chosen `:fit` mode. `:width` may also be the atom `:auto`, mirroring Cloudflare's client-hint-driven sizing. The interpreter resolves it to a concrete pixel count from request hints; if no hint is available it falls back to the source width. """ @type fit :: :contain | :cover | :crop | :pad | :scale_down | :squeeze @type gravity :: :auto | :face | :center | :north | :south | :east | :west | :north_east | :north_west | :south_east | :south_west | {:xy, float(), float()} @type t :: %__MODULE__{ width: nil | :auto | pos_integer(), height: nil | pos_integer(), fit: fit(), gravity: gravity(), upscale?: boolean(), dpr: pos_integer(), face_zoom: float(), size_pct: nil | number() } defstruct width: nil, height: nil, fit: :contain, gravity: :center, upscale?: true, dpr: 1, face_zoom: 0.0, # Percentage-of-source resize. When set (a positive number, # typically `0.0..100.0`), the interpreter resizes by this # percentage instead of using `width`/`height`. Mutually # exclusive with `width`/`height`; the IIIF Image API 3.0 # `pct:N` size form maps to this field, and the URL builder # emits `pct:N` when `size_pct` is set and dimensions are # nil. size_pct: nil end