public override void DrawGeometry (Brush brush, Pen pen, Geometry geometry)
		{
			if (brush != null) {
				if (brush is SolidColorBrush) {
					var b = brush as SolidColorBrush;
					cr.Color = new Cairo.Color (b.Color.R, b.Color.G, b.Color.B, b.Color.Alfa);	
					
					DrawGeometry (geometry);	
			
					cr.Fill ();
				} else if (brush is LinearGradientBrush) {
					var b = brush as LinearGradientBrush;
					
					var pattern = new Cairo.LinearGradient (b.StartPoint.X, b.StartPoint.Y, b.EndPoint.X, b.EndPoint.Y);
					foreach (var stop in b.GradientStops) {
						pattern.AddColorStop (stop.Offset, new Cairo.Color (stop.Color.R, stop.Color.G, stop.Color.B, stop.Color.Alfa));						
					}
					
					cr.Pattern = pattern;
					DrawGeometry (geometry);	
					
					cr.Fill ();
				}
			}
			
			if (pen != null) {
				cr.Color = new Cairo.Color (pen.Color.R, pen.Color.G, pen.Color.B, pen.Color.Alfa);	
				cr.LineWidth = pen.Thickness;

				DrawGeometry (geometry);	
			
				cr.Stroke ();
			}
		}
		private void DrawGeometry (Geometry geometry)
		{
			if (geometry is PathGeometry) {
				var path = geometry as PathGeometry;

				foreach (var figure in path.Figures) {
					DrawFigure (figure);
				}
			}
		}
		public abstract void DrawGeometry (Brush brush, Pen pen, Geometry geometry);