Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit 677bd49

Browse files
committed
servo: Merge #19715 - Update WR (removal of RGB8, which isn't supported on some hardware) (from glennw:update-wr-rgb8); r=emilio
Instead, we convert any source RGB8 images into RGBx (with an opaque alpha channel). Source-Repo: https://github.com/servo/servo Source-Revision: 5d0d6cff81a003e72dda83f6b2dd87ad8821d779 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 425ab27ae1e200eec6d63585e9da02af7717ab89
1 parent 30dce26 commit 677bd49

3 files changed

Lines changed: 33 additions & 42 deletions

File tree

servo/Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

servo/components/canvas/webgl_thread.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ impl<VR: WebVRRenderHandler + 'static, OB: WebGLThreadObserver> WebGLThread<VR,
487487
width: size.width as u32,
488488
height: size.height as u32,
489489
stride: None,
490-
format: if alpha { webrender_api::ImageFormat::BGRA8 } else { webrender_api::ImageFormat::RGB8 },
490+
format: webrender_api::ImageFormat::BGRA8,
491491
offset: 0,
492492
is_opaque: !alpha,
493493
}

servo/components/net/image_cache.rs

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,6 @@ use webrender_api;
3434
// Helper functions.
3535
// ======================================================================
3636

37-
fn convert_format(format: PixelFormat) -> webrender_api::ImageFormat {
38-
match format {
39-
PixelFormat::K8 | PixelFormat::KA8 => {
40-
panic!("Not support by webrender yet");
41-
}
42-
PixelFormat::RGB8 => webrender_api::ImageFormat::RGB8,
43-
PixelFormat::BGRA8 => webrender_api::ImageFormat::BGRA8,
44-
}
45-
}
46-
4737
fn decode_bytes_sync(key: LoadKey, bytes: &[u8]) -> DecoderMsg {
4838
let image = load_from_memory(bytes);
4939
DecoderMsg {
@@ -63,19 +53,35 @@ fn get_placeholder_image(webrender_api: &webrender_api::RenderApi, path: &PathBu
6353

6454
fn set_webrender_image_key(webrender_api: &webrender_api::RenderApi, image: &mut Image) {
6555
if image.id.is_some() { return; }
66-
let format = convert_format(image.format);
6756
let mut bytes = Vec::new();
68-
bytes.extend_from_slice(&*image.bytes);
69-
if format == webrender_api::ImageFormat::BGRA8 {
70-
premultiply(bytes.as_mut_slice());
71-
}
57+
let is_opaque = match image.format {
58+
PixelFormat::BGRA8 => {
59+
bytes.extend_from_slice(&*image.bytes);
60+
premultiply(bytes.as_mut_slice())
61+
}
62+
PixelFormat::RGB8 => {
63+
for bgr in image.bytes.chunks(3) {
64+
bytes.extend_from_slice(&[
65+
bgr[2],
66+
bgr[1],
67+
bgr[0],
68+
0xff
69+
]);
70+
}
71+
72+
true
73+
}
74+
PixelFormat::K8 | PixelFormat::KA8 => {
75+
panic!("Not support by webrender yet");
76+
}
77+
};
7278
let descriptor = webrender_api::ImageDescriptor {
7379
width: image.width,
7480
height: image.height,
7581
stride: None,
76-
format: format,
82+
format: webrender_api::ImageFormat::BGRA8,
7783
offset: 0,
78-
is_opaque: is_image_opaque(format, &bytes),
84+
is_opaque,
7985
};
8086
let data = webrender_api::ImageData::new(bytes);
8187
let image_key = webrender_api.generate_image_key();
@@ -85,28 +91,10 @@ fn set_webrender_image_key(webrender_api: &webrender_api::RenderApi, image: &mut
8591
image.id = Some(image_key);
8692
}
8793

88-
// TODO(gw): This is a port of the old is_image_opaque code from WR.
89-
// Consider using SIMD to speed this up if it shows in profiles.
90-
fn is_image_opaque(format: webrender_api::ImageFormat, bytes: &[u8]) -> bool {
91-
match format {
92-
webrender_api::ImageFormat::BGRA8 => {
93-
let mut is_opaque = true;
94-
for i in 0..(bytes.len() / 4) {
95-
if bytes[i * 4 + 3] != 255 {
96-
is_opaque = false;
97-
break;
98-
}
99-
}
100-
is_opaque
101-
}
102-
webrender_api::ImageFormat::RGB8 => true,
103-
webrender_api::ImageFormat::RG8 => true,
104-
webrender_api::ImageFormat::A8 => false,
105-
webrender_api::ImageFormat::Invalid | webrender_api::ImageFormat::RGBAF32 => unreachable!(),
106-
}
107-
}
108-
109-
fn premultiply(data: &mut [u8]) {
94+
// Returns true if the image was found to be
95+
// completely opaque.
96+
fn premultiply(data: &mut [u8]) -> bool {
97+
let mut is_opaque = true;
11098
let length = data.len();
11199

112100
let mut i = 0;
@@ -121,7 +109,10 @@ fn premultiply(data: &mut [u8]) {
121109
data[i + 2] = (r * a / 255) as u8;
122110

123111
i += 4;
112+
is_opaque = is_opaque && a == 255;
124113
}
114+
115+
is_opaque
125116
}
126117

127118
// ======================================================================

0 commit comments

Comments
 (0)