     }
     
     /// Add a rectangle with a certain size
-    public mutating func addRectangleWithWidth(width: CGFloat, height: CGFloat) {
-        self.appendDrawingOperation(.LineByMovingByX(0, y: height), isDrawing: true)
-        self.appendDrawingOperation(.LineByMovingByX(width, y: 0), isDrawing: true)
-        self.appendDrawingOperation(.LineByMovingByX(0, y: -height), isDrawing: true)
-        self.appendDrawingOperation(.LineByMovingByX(-width, y: 0), isDrawing: true)
+    public mutating func addRectangleWithWidth(width: CGFloat, height: CGFloat, fill: Bool = false) {
+        self.appendDrawingOperation(.RectWithWidth(width, height: height, fill: fill), isDrawing: true)
     }
     
     /// Add a square with a certain size
-    public mutating func addSquareWithSize(size: CGFloat) {
-        self.addRectangleWithWidth(size, height: size)
+    public mutating func addSquareWithSize(size: CGFloat, fill: Bool = false) {
+        self.addRectangleWithWidth(size, height: size, fill: fill)
     }
     
     /// Close the shape, drawing a line to the origin point of the shape

    case MoveTo(CGPoint)
    case LineTo(CGPoint)
    case LineByMovingByX(CGFloat, y: CGFloat)
    case Close
}


        let yScale = size.height / self.size.height
        
        let context = CGContext.bitmapContextWithSize(size)
        CGContextSetStrokeColorWithColor(context, self.color.CGColor)
        CGContextSetFillColorWithColor(context, self.color.CGColor)
        CGContextMoveToPoint(context, 0, 0)
        
        var rectsToFill = [CGRect]()
        
        for operation in self.drawingOperations {
            switch operation {
