HTMLImageElement for old safari implementation

This commit is contained in:
bmatthieu3
2022-06-24 11:20:34 +02:00
parent 0afea6c796
commit 34ec5c8854
6 changed files with 96 additions and 18 deletions

View File

@@ -1,4 +1,4 @@
use cgmath::{Vector2, Vector3};
use cgmath::Vector3;
#[derive(Debug, Clone)]
pub struct Bitmap<F>
@@ -6,7 +6,6 @@ where
F: ImageFormat + Clone,
{
pub image: web_sys::ImageBitmap,
pub size: Vector2<i32>,
format: std::marker::PhantomData<F>,
}
@@ -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<i32> {
&self.size
}*/
}

View File

@@ -1,5 +1,4 @@
/* ------------------------------------------------------ */
#[derive(Debug)]
pub struct HTMLImage<F>
where
@@ -8,6 +7,19 @@ where
image: web_sys::HtmlImageElement,
format: std::marker::PhantomData<F>,
}
impl<F> HTMLImage<F>
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;

View File

@@ -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<R8UI> },
PngImageRgba8u { image: Bitmap<RGBA8U> },
JpgImageRgb8u { image: Bitmap<RGB8U> },
PngHTMLImageRgba8u { image: HTMLImage<RGBA8U> },
JpgHTMLImageRgb8u { image: HTMLImage<RGB8U> },
RawRgb8u { image: ImageBuffer<RGB8U> },
RawRgba8u { image: ImageBuffer<RGBA8U> },
RawR32f { image: ImageBuffer<R32F> },
@@ -281,6 +285,8 @@ pub enum ImageType {
#[cfg(feature = "webgl1")]
pub enum ImageType {
FitsImageR32f { image: Fits<R32F> },
PngHTMLImageRgba8u { image: HTMLImage<RGBA8U> },
JpgHTMLImageRgb8u { image: HTMLImage<RGB8U> },
PngImageRgba8u { image: Bitmap<RGBA8U> },
JpgImageRgb8u { image: Bitmap<RGB8U> },
RawRgb8u { image: ImageBuffer<RGB8U> },
@@ -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),

View File

@@ -18,7 +18,6 @@ impl From<AllskyRequest> for RequestType {
}
}
use crate::survey::Url;
use wasm_bindgen_futures::JsFuture;
use web_sys::{RequestInit, RequestMode, Response};

View File

@@ -29,7 +29,7 @@ use std::future::Future;
use wasm_bindgen::JsValue;
impl<R> Request<R>
where
R: 'static,
R: 'static
{
pub fn new<F>(f: F) -> Self
where

View File

@@ -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<TileRequest> 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<query::Tile> for TileRequest {
// Create a tile request associated to a HiPS
@@ -50,13 +53,45 @@ impl From<query::Tile> for TileRequest {
debug_assert!(resp_value.is_instance_of::<Response>());
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::<RGB8U>::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<dyn FnMut(js_sys::Function, js_sys::Function)>)
);
let _ = JsFuture::from(html_img_elt_promise).await?;
// The image has been resolved
Ok(ImageType::JpgHTMLImageRgb8u { image: HTMLImage::<RGB8U>::new(image) })
}),
ImageFormatType::RGBA8U => Request::new(async move {
let mut opts = RequestInit::new();
@@ -69,6 +104,8 @@ impl From<query::Tile> for TileRequest {
debug_assert!(resp_value.is_instance_of::<Response>());
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<query::Tile> 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::<RGBA8U>::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<dyn FnMut(js_sys::Function, js_sys::Function)>)
);
let _ = JsFuture::from(html_img_elt_promise).await?;
// The image has been resolved
Ok(ImageType::PngHTMLImageRgba8u { image: HTMLImage::<RGBA8U>::new(image) })
}),
ImageFormatType::R32F => Request::new(async move {
let mut opts = RequestInit::new();