deno_canvas 0.78.0

OffscreenCanvas implementation for Deno
Documentation
// Copyright 2018-2025 the Deno authors. MIT license.

mod image_ops;
mod op_create_image_bitmap;
pub use image;
use image::ColorType;
use op_create_image_bitmap::op_create_image_bitmap;

#[derive(Debug, thiserror::Error, deno_error::JsError)]
pub enum CanvasError {
  /// Image formats that is 32-bit depth are not supported currently due to the following reasons:
  /// - e.g. OpenEXR, it's not covered by the spec.
  /// - JPEG XL supported by WebKit, but it cannot be called a standard today.
  ///   https://github.com/whatwg/mimesniff/issues/143
  ///
  #[class(type)]
  #[error("Unsupported color type and bit depth: '{0:?}'")]
  UnsupportedColorType(ColorType),
  #[class("DOMExceptionInvalidStateError")]
  #[error("Cannot decode image '{0}'")]
  InvalidImage(image::ImageError),
  #[class("DOMExceptionInvalidStateError")]
  #[error("The chunk data is not big enough with the specified width: {0} and height: {1}")]
  NotBigEnoughChunk(u32, u32),
  #[class("DOMExceptionInvalidStateError")]
  #[error("The width: {0} or height: {1} could not be zero")]
  InvalidSizeZero(u32, u32),
  #[class(generic)]
  #[error(transparent)]
  Lcms(#[from] lcms2::Error),
  #[class(generic)]
  #[error(transparent)]
  Image(#[from] image::ImageError),
}

impl CanvasError {
  /// Convert an [`image::ImageError`] to an [`CanvasError::InvalidImage`].
  fn image_error_to_invalid_image(error: image::ImageError) -> Self {
    CanvasError::InvalidImage(error)
  }
}

deno_core::extension!(
  deno_canvas,
  deps = [deno_webidl, deno_web, deno_webgpu],
  ops = [op_create_image_bitmap],
  lazy_loaded_esm = ["01_image.js"],
);