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

///|
pub fn MaskFilterDescriptor::blur(sigma : Float) -> MaskFilterDescriptor? {
  if shader_filter_scalar_is_finite(sigma) && sigma > 0.0 {
    Some(BlurMaskFilter(sigma))
  } else {
    None
  }
}

///|
pub fn MaskFilterDescriptor::is_valid(self : MaskFilterDescriptor) -> Bool {
  match self {
    BlurMaskFilter(sigma) =>
      shader_filter_scalar_is_finite(sigma) && sigma > 0.0
  }
}

///|
fn MaskFilterDescriptor::resource_id(self : MaskFilterDescriptor) -> Bytes {
  if !self.is_valid() {
    b""
  } else {
    match self {
      BlurMaskFilter(sigma) =>
        b"moui_skia:mask-filter:v1" +
        shader_filter_resource_bytes(b"blur") +
        shader_filter_float_id(sigma)
    }
  }
}

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

///|
pub fn MaskFilterDescriptor::resource_descriptor(
  self : MaskFilterDescriptor,
  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::mask_filter(id, byte_size=measured_byte_size)
}