diff --git a/Cargo.lock b/Cargo.lock index c2a27a41f1..847e23c475 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -964,6 +964,14 @@ dependencies = [ "serde_derive 1.0.35 (git+https://github.com/servo/serde?branch=deserialize_from_enums5)", ] +[[package]] +name = "serde_bytes" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "serde_derive" version = "1.0.35" @@ -1341,6 +1349,7 @@ dependencies = [ "euclid 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_bytes 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.35 (git+https://github.com/servo/serde?branch=deserialize_from_enums5)", "time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1608,6 +1617,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum scoped_threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3ef399c8893e8cb7aa9696e895427fab3a6bf265977bb96e126f24ddd2cda85a" "checksum scopeguard 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c79eb2c3ac4bc2507cda80e7f3ac5b88bd8eae4c0914d5663e6a8933994be918" "checksum serde 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)" = "800fdb0a894572994f3970035a8a5f65d8ec2cd40e6cdf7d8cd9001d7b30648e" +"checksum serde_bytes 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)" = "adb6e51a6b3696b301bc221d785f898b4457c619b51d7ce195a6d20baecb37b3" "checksum serde_derive 1.0.35 (git+https://github.com/servo/serde?branch=deserialize_from_enums5)" = "" "checksum serde_derive_internals 0.22.1 (git+https://github.com/servo/serde?branch=deserialize_from_enums5)" = "" "checksum serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "48b04779552e92037212c3615370f6bd57a40ebba7f20e554ff9f55e41a69a7b" diff --git a/webrender_api/Cargo.toml b/webrender_api/Cargo.toml index ee2715c9cb..5e34c19a20 100644 --- a/webrender_api/Cargo.toml +++ b/webrender_api/Cargo.toml @@ -20,6 +20,7 @@ ipc-channel = {version = "0.10.0", optional = true} euclid = { version = "0.17", features = ["serde"] } serde = { version = "=1.0.35", features = ["rc"] } serde_derive = { version = "=1.0.35", features = ["deserialize_in_place"] } +serde_bytes = "0.10" time = "0.1" [target.'cfg(target_os = "macos")'.dependencies] diff --git a/webrender_api/src/api.rs b/webrender_api/src/api.rs index 3d97c7eea5..0dc527aaba 100644 --- a/webrender_api/src/api.rs +++ b/webrender_api/src/api.rs @@ -2,6 +2,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +extern crate serde_bytes; + use app_units::Au; use channel::{self, MsgSender, Payload, PayloadSender, PayloadSenderHelperMethods}; use std::cell::Cell; @@ -405,7 +407,11 @@ pub struct UpdateImage { #[derive(Clone, Deserialize, Serialize)] pub enum AddFont { - Raw(FontKey, Vec, u32), + Raw( + FontKey, + #[serde(with = "serde_bytes")] Vec, + u32 + ), Native(FontKey, NativeFontHandle), } diff --git a/webrender_api/src/image.rs b/webrender_api/src/image.rs index c06deca6c7..ba0b935e5f 100644 --- a/webrender_api/src/image.rs +++ b/webrender_api/src/image.rs @@ -2,6 +2,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +extern crate serde_bytes; + use font::{FontInstanceKey, FontKey, FontTemplate}; use std::sync::Arc; use {DevicePoint, DeviceUintRect, IdNamespace, TileOffset, TileSize}; @@ -110,11 +112,26 @@ impl ImageDescriptor { #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ImageData { - Raw(Arc>), - Blob(BlobImageData), + Raw(#[serde(with = "serde_image_data_raw")] Arc>), + Blob(#[serde(with = "serde_bytes")] BlobImageData), External(ExternalImageData), } +mod serde_image_data_raw { + extern crate serde_bytes; + + use std::sync::Arc; + use serde::{Deserializer, Serializer}; + + pub fn serialize<'a, S: Serializer>(bytes: &'a Arc>, serializer: S) -> Result { + serde_bytes::serialize(bytes.as_slice(), serializer) + } + + pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result>, D::Error> { + serde_bytes::deserialize(deserializer).map(Arc::new) + } +} + impl ImageData { pub fn new(bytes: Vec) -> Self { ImageData::Raw(Arc::new(bytes))