aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlcanvaselement.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2018-10-03 06:00:50 -0400
committerGitHub <noreply@github.com>2018-10-03 06:00:50 -0400
commit74e7736720f457abc62ffe82cdda1db230320747 (patch)
tree6d4532f210773257b3db5a67e833f7d321fbfc83 /components/script/dom/htmlcanvaselement.rs
parent7fa2b2c879923a8b1f05be59ec9511ba8d5928c8 (diff)
parent5efbeea61ca619cbded91acb4b1b468aaa5e50b0 (diff)
downloadservo-74e7736720f457abc62ffe82cdda1db230320747.tar.gz
servo-74e7736720f457abc62ffe82cdda1db230320747.zip
Auto merge of #21850 - servo:webgl, r=jdm
Don't use an intermediate PNG buffer in HTMLCanvasElement::ToDataURL <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21850) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/htmlcanvaselement.rs')
-rw-r--r--components/script/dom/htmlcanvaselement.rs40
1 files changed, 18 insertions, 22 deletions
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs
index 00b04db7ee8..09114a95d0a 100644
--- a/components/script/dom/htmlcanvaselement.rs
+++ b/components/script/dom/htmlcanvaselement.rs
@@ -98,8 +98,8 @@ impl HTMLCanvasElement {
}
}
- pub fn get_size(&self) -> Size2D<i32> {
- Size2D::new(self.Width() as i32, self.Height() as i32)
+ pub fn get_size(&self) -> Size2D<u32> {
+ Size2D::new(self.Width(), self.Height())
}
pub fn origin_is_clean(&self) -> bool {
@@ -277,7 +277,7 @@ impl HTMLCanvasElement {
self.Height() != 0 && self.Width() != 0
}
- pub fn fetch_all_data(&self) -> Option<(Vec<u8>, Size2D<i32>)> {
+ pub fn fetch_all_data(&self) -> Option<(Vec<u8>, Size2D<u32>)> {
let size = self.get_size();
if size.width == 0 || size.height == 0 {
@@ -383,12 +383,11 @@ impl HTMLCanvasElementMethods for HTMLCanvasElement {
None => return Ok(USVString("data:,".into())),
}
},
- Some(CanvasContext::WebGL2(ref context)) => match context
- .base_context()
- .get_image_data(self.Width(), self.Height())
- {
- Some(data) => data,
- None => return Ok(USVString("data:,".into())),
+ Some(CanvasContext::WebGL2(ref context)) => {
+ match context.base_context().get_image_data(self.Width(), self.Height()) {
+ Some(data) => data,
+ None => return Ok(USVString("data:,".into())),
+ }
},
None => {
// Each pixel is fully-transparent black.
@@ -396,19 +395,16 @@ impl HTMLCanvasElementMethods for HTMLCanvasElement {
},
};
- // Only handle image/png for now.
- let mime_type = "image/png";
-
- let mut encoded = Vec::new();
- {
- let encoder: PNGEncoder<&mut Vec<u8>> = PNGEncoder::new(&mut encoded);
- encoder
- .encode(&raw_data, self.Width(), self.Height(), ColorType::RGBA(8))
- .unwrap();
- }
-
- let encoded = base64::encode(&encoded);
- Ok(USVString(format!("data:{};base64,{}", mime_type, encoded)))
+ // FIXME: Only handle image/png for now.
+ let mut png = Vec::new();
+ PNGEncoder::new(&mut png)
+ .encode(&raw_data, self.Width(), self.Height(), ColorType::RGBA(8))
+ .unwrap();
+ let mut url = "data:image/png;base64,".to_owned();
+ // FIXME(nox): Should this use base64::URL_SAFE?
+ // FIXME(nox): https://github.com/alicemaz/rust-base64/pull/56
+ base64::encode_config_buf(&png, base64::STANDARD, &mut url);
+ Ok(USVString(url))
}
}