diff --git a/src/core/al-core/src/image/bitmap.rs b/src/core/al-core/src/image/bitmap.rs index 3ac3339e..85fe5dda 100644 --- a/src/core/al-core/src/image/bitmap.rs +++ b/src/core/al-core/src/image/bitmap.rs @@ -1,4 +1,4 @@ -use cgmath::{Vector2, Vector3}; +use cgmath::Vector3; #[derive(Debug, Clone)] pub struct Bitmap @@ -6,7 +6,6 @@ where F: ImageFormat + Clone, { pub image: web_sys::ImageBitmap, - pub size: Vector2, format: std::marker::PhantomData, } @@ -17,10 +16,8 @@ where F: ImageFormat + Clone, { pub fn new(image: web_sys::ImageBitmap) -> Self { - let size = Vector2::new(image.width() as i32, image.height() as i32); Self { image, - size, format: std::marker::PhantomData, } } @@ -36,9 +33,4 @@ where .bind() .tex_sub_image_2d_with_u32_and_u32_and_image_bitmap(offset.x, offset.y, &self.image); } - - // The size of the image - /*fn get_size(&self) -> &Vector2 { - &self.size - }*/ } diff --git a/src/core/al-core/src/image/html.rs b/src/core/al-core/src/image/html.rs index 66d038db..6337a61e 100644 --- a/src/core/al-core/src/image/html.rs +++ b/src/core/al-core/src/image/html.rs @@ -1,5 +1,4 @@ /* ------------------------------------------------------ */ - #[derive(Debug)] pub struct HTMLImage where @@ -8,6 +7,19 @@ where image: web_sys::HtmlImageElement, format: std::marker::PhantomData, } + +impl HTMLImage +where + F: ImageFormat + Clone, +{ + pub fn new(image: web_sys::HtmlImageElement) -> Self { + Self { + image, + format: std::marker::PhantomData, + } + } +} + use cgmath::Vector3; use crate::image::format::ImageFormat; diff --git a/src/core/al-core/src/image/mod.rs b/src/core/al-core/src/image/mod.rs index aa931f1e..07ff4814 100644 --- a/src/core/al-core/src/image/mod.rs +++ b/src/core/al-core/src/image/mod.rs @@ -178,6 +178,8 @@ impl ArrayBuffer for ArrayF64 { } } +use self::html::HTMLImage; + use super::Texture2DArray; pub trait Image { fn tex_sub_image_3d( @@ -270,6 +272,8 @@ pub enum ImageType { FitsImageR8ui { image: Fits }, PngImageRgba8u { image: Bitmap }, JpgImageRgb8u { image: Bitmap }, + PngHTMLImageRgba8u { image: HTMLImage }, + JpgHTMLImageRgb8u { image: HTMLImage }, RawRgb8u { image: ImageBuffer }, RawRgba8u { image: ImageBuffer }, RawR32f { image: ImageBuffer }, @@ -281,6 +285,8 @@ pub enum ImageType { #[cfg(feature = "webgl1")] pub enum ImageType { FitsImageR32f { image: Fits }, + PngHTMLImageRgba8u { image: HTMLImage }, + JpgHTMLImageRgb8u { image: HTMLImage }, PngImageRgba8u { image: Bitmap }, JpgImageRgb8u { image: Bitmap }, RawRgb8u { image: ImageBuffer }, @@ -311,6 +317,8 @@ impl Image for ImageType { ImageType::FitsImageR8ui { image } => image.tex_sub_image_3d(textures, offset), ImageType::PngImageRgba8u { image } => image.tex_sub_image_3d(textures, offset), ImageType::JpgImageRgb8u { image } => image.tex_sub_image_3d(textures, offset), + ImageType::PngHTMLImageRgba8u { image } => image.tex_sub_image_3d(textures, offset), + ImageType::JpgHTMLImageRgb8u { image } => image.tex_sub_image_3d(textures, offset), ImageType::RawRgb8u { image } => image.tex_sub_image_3d(textures, offset), ImageType::RawRgba8u { image } => image.tex_sub_image_3d(textures, offset), ImageType::RawR32f { image } => image.tex_sub_image_3d(textures, offset), diff --git a/src/core/src/downloader/request/allsky.rs b/src/core/src/downloader/request/allsky.rs index c1b1aa33..6ed00bce 100644 --- a/src/core/src/downloader/request/allsky.rs +++ b/src/core/src/downloader/request/allsky.rs @@ -18,7 +18,6 @@ impl From for RequestType { } } - use crate::survey::Url; use wasm_bindgen_futures::JsFuture; use web_sys::{RequestInit, RequestMode, Response}; diff --git a/src/core/src/downloader/request/mod.rs b/src/core/src/downloader/request/mod.rs index f57e7b83..1c3acde1 100644 --- a/src/core/src/downloader/request/mod.rs +++ b/src/core/src/downloader/request/mod.rs @@ -29,7 +29,7 @@ use std::future::Future; use wasm_bindgen::JsValue; impl Request where - R: 'static, + R: 'static { pub fn new(f: F) -> Self where diff --git a/src/core/src/downloader/request/tile.rs b/src/core/src/downloader/request/tile.rs index e88ea5b6..704d65b3 100644 --- a/src/core/src/downloader/request/tile.rs +++ b/src/core/src/downloader/request/tile.rs @@ -1,8 +1,13 @@ use crate::{healpix::cell::HEALPixCell}; -use al_core::image::format::ImageFormatType; +use al_core::image::format::{ImageFormatType, RGB8U, RGBA8U}; use crate::downloader::{query}; -use al_core::image::{bitmap::Bitmap, fits::Fits, ImageType}; +use al_core::image::{ + //bitmap::Bitmap, + fits::Fits, + //raw::ImageBuffer, + ImageType +}; use super::{Request, RequestType}; pub struct TileRequest { @@ -18,12 +23,10 @@ impl From for RequestType { RequestType::Tile(request) } } - - +use al_core::image::html::HTMLImage; use crate::survey::Url; use wasm_bindgen_futures::JsFuture; use web_sys::{Blob, RequestInit, RequestMode, Response}; - use wasm_bindgen::JsCast; impl From for TileRequest { // Create a tile request associated to a HiPS @@ -50,13 +53,45 @@ impl From for TileRequest { debug_assert!(resp_value.is_instance_of::()); let resp: Response = resp_value.dyn_into()?; + /* + /// Bitmap version let blob = JsFuture::from(resp.blob()?).await?.into(); let image = JsFuture::from(window.create_image_bitmap_with_blob(&blob)?) .await? .into(); let image = Bitmap::new(image); - Ok(ImageType::JpgImageRgb8u { image }) + Ok(ImageType::JpgImageRgb8u { image })*/ + /* + /// Raw image decoding + + let buf = JsFuture::from(resp.array_buffer()?).await?; + let raw_bytes = js_sys::Uint8Array::new(&buf).to_vec(); + let image = ImageBuffer::::from_raw_bytes(&raw_bytes[..], 512, 512)?; + + Ok(ImageType::RawRgb8u { image }) + */ + // HTMLImageElement + let blob = JsFuture::from(resp.blob()?).await?.into(); + let image = web_sys::HtmlImageElement::new().unwrap(); + let image_cloned = image.clone(); + + let html_img_elt_promise = js_sys::Promise::new( + &mut (Box::new(move |resolve, reject| { + let url = web_sys::Url::create_object_url_with_blob(&blob).unwrap(); + image_cloned.set_src(&url); + image_cloned.set_onload( + Some(&resolve) + ); + image_cloned.set_onerror( + Some(&reject) + ); + }) as Box) + ); + + let _ = JsFuture::from(html_img_elt_promise).await?; + // The image has been resolved + Ok(ImageType::JpgHTMLImageRgb8u { image: HTMLImage::::new(image) }) }), ImageFormatType::RGBA8U => Request::new(async move { let mut opts = RequestInit::new(); @@ -69,6 +104,8 @@ impl From for TileRequest { debug_assert!(resp_value.is_instance_of::()); let resp: Response = resp_value.dyn_into()?; + /* + /// Bitmap version let blob = JsFuture::from(resp.blob()?).await?.into(); let image = JsFuture::from(window.create_image_bitmap_with_blob(&blob)?) .await? @@ -76,6 +113,36 @@ impl From for TileRequest { let image = Bitmap::new(image); Ok(ImageType::PngImageRgba8u { image }) + */ + /* + /// Raw image decoding + let buf = JsFuture::from(resp.array_buffer()?).await?; + let raw_bytes = js_sys::Uint8Array::new(&buf).to_vec(); + let image = ImageBuffer::::from_raw_bytes(&raw_bytes[..], 512, 512)?; + + Ok(ImageType::RawRgba8u { image }) + */ + // HTMLImageElement + let blob = JsFuture::from(resp.blob()?).await?.into(); + let image = web_sys::HtmlImageElement::new().unwrap(); + let image_cloned = image.clone(); + + let html_img_elt_promise = js_sys::Promise::new( + &mut (Box::new(move |resolve, reject| { + let url = web_sys::Url::create_object_url_with_blob(&blob).unwrap(); + image_cloned.set_src(&url); + image_cloned.set_onload( + Some(&resolve) + ); + image_cloned.set_onerror( + Some(&reject) + ); + }) as Box) + ); + + let _ = JsFuture::from(html_img_elt_promise).await?; + // The image has been resolved + Ok(ImageType::PngHTMLImageRgba8u { image: HTMLImage::::new(image) }) }), ImageFormatType::R32F => Request::new(async move { let mut opts = RequestInit::new();