///|
/// Portable image-filter recipes that can be mapped to native Skia filters.
pub(all) enum ImageFilterDescriptor {
  BlurImageFilter(Float, Float)
} derive(Debug, Eq)

///|
pub fn ImageFilterDescriptor::blur(
  sigma_x : Float,
  sigma_y : Float,
) -> ImageFilterDescriptor? {
  if shader_filter_scalar_is_finite(sigma_x) &&
    shader_filter_scalar_is_finite(sigma_y) &&
    sigma_x > 0.0 &&
    sigma_y > 0.0 {
    Some(BlurImageFilter(sigma_x, sigma_y))
  } else {
    None
  }
}

///|
pub fn ImageFilterDescriptor::is_valid(self : ImageFilterDescriptor) -> Bool {
  match self {
    BlurImageFilter(sigma_x, sigma_y) =>
      shader_filter_scalar_is_finite(sigma_x) &&
      shader_filter_scalar_is_finite(sigma_y) &&
      sigma_x > 0.0 &&
      sigma_y > 0.0
  }
}

///|
fn ImageFilterDescriptor::resource_id(self : ImageFilterDescriptor) -> Bytes {
  if !self.is_valid() {
    b""
  } else {
    match self {
      BlurImageFilter(sigma_x, sigma_y) =>
        b"moui_skia:image-filter:v1" +
        shader_filter_resource_bytes(b"blur") +
        shader_filter_float_id(sigma_x) +
        shader_filter_float_id(sigma_y)
    }
  }
}

///|
pub fn ImageFilterDescriptor::resource_key(
  self : ImageFilterDescriptor,
) -> RendererResourceKey {
  RendererResourceKey::image_filter(self.resource_id())
}

///|
pub fn ImageFilterDescriptor::resource_descriptor(
  self : ImageFilterDescriptor,
  byte_size? : Int64 = -1L,
) -> RendererResourceDescriptor {
  let id = self.resource_id()
  let measured_byte_size = if byte_size < 0L {
    id.length().to_int64()
  } else {
    byte_size
  }
  RendererResourceDescriptor::image_filter(id, byte_size=measured_byte_size)
}