diff --git a/src/gfx/geom.rs b/src/gfx/geom.rs
index 4e857ffc802..7d2623525e3 100644
--- a/src/gfx/geom.rs
+++ b/src/gfx/geom.rs
@@ -5,6 +5,12 @@ type rect = { mut origin: point, mut size: size };
enum au = int;
+impl size for size {
+ fn area() -> int {
+ self.width * self.height
+ }
+}
+
fn point(x: A, y: A) -> point {
{mut x: x, mut y: y}
}
diff --git a/src/gfx/surface.rs b/src/gfx/surface.rs
index ac64b2a0961..b6978b80ef4 100644
--- a/src/gfx/surface.rs
+++ b/src/gfx/surface.rs
@@ -1,9 +1,30 @@
+import gfx::geom;
+import gfx::geom::size;
+
enum format {
fo_rgba_8888
// TODO: RGB 565, others?
}
-type surface = {
- format: format
+type image_surface = {
+ size: geom::size,
+ format: format,
+ buffer: [u8]
};
+impl format for format {
+ fn bpp() -> uint {
+ alt self {
+ fo_rgba_8888 { 32u }
+ }
+ }
+}
+
+fn image_surface(size: geom::size, format: format) -> image_surface {
+ {
+ size: size,
+ format: format,
+ buffer: vec::from_elem((size.area() as uint) * format.bpp(), 0u8)
+ }
+}
+