mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
canvas: Unify retrieving image data from the HTMLImageElement (#37809)
Currently, HTMLImageElement uses as an image source (ImageBitmapSource, CanvasImageSource, TexImageSource) in various canvas2D/WebGL operations, and there is a small inconsistency in how we get the image data of the 'img' element: usability checking and retrieving the image data from the image cache. To simplify and avoid state inconsistency between the window's image cache and the 'img' element, let's retrieve the image data (as a raster) from the HTMLImageElement itself. Testing: No expected changes in testing results, except the 'drawimage_svg_image_with_foreign_object_does_not_taint.html' which is 'false' passed because drawing of the non supported vector image is silently skip instead of throwing the 'InvalidState' exception anymore. Signed-off-by: Andrei Volykhin <andrei.volykhin@gmail.com>
This commit is contained in:
parent
d5b6160119
commit
d0579256bb
6 changed files with 118 additions and 140 deletions
|
@ -12,7 +12,7 @@ use std::{char, mem};
|
|||
use app_units::{AU_PER_PX, Au};
|
||||
use cssparser::{Parser, ParserInput};
|
||||
use dom_struct::dom_struct;
|
||||
use euclid::Point2D;
|
||||
use euclid::default::{Point2D, Size2D};
|
||||
use html5ever::{LocalName, Prefix, QualName, local_name, ns};
|
||||
use js::jsapi::JSAutoRealm;
|
||||
use js::rust::HandleObject;
|
||||
|
@ -28,7 +28,9 @@ use net_traits::{
|
|||
ResourceFetchTiming, ResourceTimingType,
|
||||
};
|
||||
use num_traits::ToPrimitive;
|
||||
use pixels::{CorsStatus, ImageMetadata};
|
||||
use pixels::{
|
||||
CorsStatus, ImageMetadata, PixelFormat, Snapshot, SnapshotAlphaMode, SnapshotPixelFormat,
|
||||
};
|
||||
use servo_url::ServoUrl;
|
||||
use servo_url::origin::MutableOrigin;
|
||||
use style::attr::{AttrValue, LengthOrPercentageOrAuto, parse_integer, parse_length};
|
||||
|
@ -168,9 +170,6 @@ pub(crate) struct HTMLImageElement {
|
|||
}
|
||||
|
||||
impl HTMLImageElement {
|
||||
pub(crate) fn get_url(&self) -> Option<ServoUrl> {
|
||||
self.current_request.borrow().parsed_url.clone()
|
||||
}
|
||||
// https://html.spec.whatwg.org/multipage/#check-the-usability-of-the-image-argument
|
||||
pub(crate) fn is_usable(&self) -> Fallible<bool> {
|
||||
// If image has an intrinsic width or intrinsic height (or both) equal to zero, then return bad.
|
||||
|
@ -193,6 +192,36 @@ impl HTMLImageElement {
|
|||
pub(crate) fn image_data(&self) -> Option<Image> {
|
||||
self.current_request.borrow().image.clone()
|
||||
}
|
||||
|
||||
/// Gets the copy of the raster image data.
|
||||
pub(crate) fn get_raster_image_data(&self) -> Option<Snapshot> {
|
||||
let Some(img) = self.image_data()?.as_raster_image() else {
|
||||
warn!("Vector image is not supported as raster image source");
|
||||
return None;
|
||||
};
|
||||
|
||||
let size = Size2D::new(img.metadata.width, img.metadata.height);
|
||||
let format = match img.format {
|
||||
PixelFormat::BGRA8 => SnapshotPixelFormat::BGRA,
|
||||
PixelFormat::RGBA8 => SnapshotPixelFormat::RGBA,
|
||||
pixel_format => {
|
||||
unimplemented!("unsupported pixel format ({:?})", pixel_format)
|
||||
},
|
||||
};
|
||||
|
||||
let alpha_mode = SnapshotAlphaMode::Transparent {
|
||||
premultiplied: false,
|
||||
};
|
||||
|
||||
let snapshot = Snapshot::from_vec(
|
||||
size.cast(),
|
||||
format,
|
||||
alpha_mode,
|
||||
img.first_frame().bytes.to_vec(),
|
||||
);
|
||||
|
||||
Some(snapshot)
|
||||
}
|
||||
}
|
||||
|
||||
/// The context required for asynchronously loading an external image.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue