mirror of
https://github.com/servo/servo.git
synced 2025-08-09 15:35:34 +01:00
Don't draw images a pixel at a time
This commit is contained in:
parent
b46aaa509d
commit
e818caf184
3 changed files with 136 additions and 39 deletions
|
@ -1 +1 @@
|
|||
Subproject commit c787b5eb2b3cc9ec5be5024098bdc1a368791fb7
|
||||
Subproject commit 7c683d825ebe58f4c378dd6c5b69da8cbbd50deb
|
|
@ -8,6 +8,11 @@ import azure::bindgen::*;
|
|||
import libc::size_t;
|
||||
import text::text_run::TextRun;
|
||||
import dom::event::{Event, ResizeEvent};
|
||||
import geom::size::Size2D;
|
||||
import geom::rect::Rect;
|
||||
import geom::point::Point2D;
|
||||
import azure_hl::AsAzureRect;
|
||||
import ptr::addr_of;
|
||||
|
||||
type Renderer = chan<Msg>;
|
||||
|
||||
|
@ -116,46 +121,44 @@ fn draw_solid_color(draw_target: AzDrawTargetRef, item: dl::display_item,
|
|||
AzReleaseColorPattern(red_pattern);
|
||||
}
|
||||
|
||||
fn draw_image(draw_target: AzDrawTargetRef, item: dl::display_item,
|
||||
-image: ~image) {
|
||||
// FIXME: This is hideously inefficient.
|
||||
fn draw_image(draw_target: AzDrawTargetRef, item: dl::display_item, -image: ~image) unsafe {
|
||||
let size = Size2D(image.width as i32, image.height as i32);
|
||||
let stride = image.width * 4;
|
||||
|
||||
let bounds = copy (*item).bounds;
|
||||
|
||||
if (image.depth < 3u) {
|
||||
#debug("TODO: can't draw images with depth less than 3 yet");
|
||||
ret;
|
||||
}
|
||||
|
||||
let stride = image.width * image.depth;
|
||||
for uint::range(0u, image.height) |y| {
|
||||
for uint::range(0u, image.width) |x| {
|
||||
let color = {
|
||||
r: image.data[y * stride + x * image.depth].to_float()
|
||||
as AzFloat,
|
||||
g: image.data[y * stride + x * image.depth + 1u].to_float()
|
||||
as AzFloat,
|
||||
b: image.data[y * stride + x * image.depth + 2u].to_float()
|
||||
as AzFloat,
|
||||
a: 1f as AzFloat
|
||||
};
|
||||
let pattern = AzCreateColorPattern(ptr::addr_of(color));
|
||||
|
||||
let pixel_rect = {
|
||||
x: (au_to_px(bounds.origin.x) + (x as int)) as AzFloat,
|
||||
y: (au_to_px(bounds.origin.y) + (y as int)) as AzFloat,
|
||||
width: 1f as AzFloat,
|
||||
height: 1f as AzFloat
|
||||
};
|
||||
AzDrawTargetFillRect(
|
||||
draw_target,
|
||||
ptr::addr_of(pixel_rect),
|
||||
unsafe { unsafe::reinterpret_cast(pattern) }
|
||||
);
|
||||
|
||||
AzReleaseColorPattern(pattern);
|
||||
// Do color space conversion :(
|
||||
let data = do vec::from_fn(image.width * image.height * 4) |i| {
|
||||
let color = i % 4;
|
||||
let pixel = i / 4;
|
||||
alt color {
|
||||
0 { image.data[pixel * 3 + 2] }
|
||||
1 { image.data[pixel * 3 + 1] }
|
||||
2 { image.data[pixel * 3 + 0] }
|
||||
3 { 0xffu8 }
|
||||
_ { fail }
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let azure_surface =
|
||||
AzDrawTargetCreateSourceSurfaceFromData(draw_target,
|
||||
addr_of(data[0]),
|
||||
unsafe::reinterpret_cast(addr_of(size)),
|
||||
stride as i32,
|
||||
0u32);
|
||||
let source_rect = Rect(Point2D(0.0f as AzFloat, 0.0f as AzFloat),
|
||||
Size2D(image.width as AzFloat, image.height as AzFloat));
|
||||
let dest_rect = Rect(Point2D(au_to_px(item.bounds.origin.x) as AzFloat,
|
||||
au_to_px(item.bounds.origin.y) as AzFloat),
|
||||
Size2D(au_to_px(item.bounds.size.width) as AzFloat,
|
||||
au_to_px(item.bounds.size.height) as AzFloat));
|
||||
let draw_surface_options = azure_hl::DrawSurfaceOptions(azure_hl::Linear, true);
|
||||
let draw_options = azure_hl::DrawOptions(1.0f as AzFloat, 0);
|
||||
AzDrawTargetDrawSurface(draw_target,
|
||||
azure_surface,
|
||||
addr_of(dest_rect.as_azure_rect()),
|
||||
addr_of(source_rect.as_azure_rect()),
|
||||
addr_of(draw_surface_options.as_azure_draw_surface_options()),
|
||||
addr_of(draw_options.as_azure_draw_options()));
|
||||
AzReleaseSourceSurface(azure_surface);
|
||||
}
|
||||
|
||||
fn draw_text(draw_target: AzDrawTargetRef, item: dl::display_item, text_run: TextRun) {
|
||||
|
|
94
src/test/test-many-images.html
Normal file
94
src/test/test-many-images.html
Normal file
|
@ -0,0 +1,94 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>test</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
<img src="test.jpeg" width="64" height="64"></img>
|
||||
|
||||
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
|
||||
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
|
||||
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
|
||||
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
|
||||
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
<img src="test.jpeg" width="64" height="64"/>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue