diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 83568fc..d8fed1d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -118,3 +118,14 @@ jobs: !contains(matrix.platform.target, 'freebsd') && !contains(matrix.platform.target, 'netbsd') run: cargo clippy --all-targets --target ${{ matrix.platform.target }} $OPTIONS --features $FEATURES -- -Dwarnings + + - name: Lint with rustdoc + shell: bash + if: > + (matrix.rust_version == 'stable') && + !contains(matrix.platform.options, '--no-default-features') && + !((matrix.platform.os == 'ubuntu-latest') && contains(matrix.platform.target, 'i686')) && + !contains(matrix.platform.target, 'redox') && + !contains(matrix.platform.target, 'freebsd') && + !contains(matrix.platform.target, 'netbsd') + run: cargo doc --no-deps --target ${{ matrix.platform.target }} $OPTIONS --features $FEATURES --document-private-items diff --git a/Cargo.toml b/Cargo.toml index c6da900..7ad9739 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -85,3 +85,14 @@ rayon = "1.5.1" members = [ "run-wasm", ] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] +default-target = "x86_64-unknown-linux-gnu" +targets = [ + "x86_64-pc-windows-msvc", + "x86_64-apple-darwin", + "x86_64-unknown-linux-gnu", + "wasm32-unknown-unknown", +] diff --git a/src/lib.rs b/src/lib.rs index f7dadf6..b7064d3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ #![doc = include_str!("../README.md")] #![deny(unsafe_op_in_unsafe_fn)] #![warn(missing_docs)] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] #[cfg(target_os = "macos")] #[macro_use] @@ -35,6 +36,9 @@ use raw_window_handle::{ HasRawDisplayHandle, HasRawWindowHandle, RawDisplayHandle, RawWindowHandle, }; +#[cfg(target_arch = "wasm32")] +pub use self::web::SurfaceExtWeb; + /// An instance of this struct contains the platform-specific data that must be managed in order to /// write to a window on that platform. pub struct Context { diff --git a/src/web.rs b/src/web.rs index c8286d1..920b443 100644 --- a/src/web.rs +++ b/src/web.rs @@ -11,6 +11,7 @@ use web_sys::ImageData; use crate::error::SwResultExt; use crate::SoftBufferError; use std::convert::TryInto; +use std::marker::PhantomData; use std::num::NonZeroU32; /// Display implementation for the web platform. @@ -56,6 +57,10 @@ impl WebImpl { // We already made sure this was a canvas in `querySelector`. .unchecked_into(); + Self::from_canvas(canvas) + } + + fn from_canvas(canvas: HtmlCanvasElement) -> Result { let ctx = canvas .get_context("2d") .ok() @@ -96,6 +101,23 @@ impl WebImpl { } } +/// Extension methods for the Wasm target on [`Surface`](crate::Surface). +pub trait SurfaceExtWeb: Sized { + /// Creates a new instance of this struct, using the provided [`HtmlCanvasElement`]. + fn from_canvas(canvas: HtmlCanvasElement) -> Result; +} + +impl SurfaceExtWeb for crate::Surface { + fn from_canvas(canvas: HtmlCanvasElement) -> Result { + let imple = crate::SurfaceDispatch::Web(WebImpl::from_canvas(canvas)?); + + Ok(Self { + surface_impl: Box::new(imple), + _marker: PhantomData, + }) + } +} + pub struct BufferImpl<'a> { imp: &'a mut WebImpl, }