Update decoration drawing to be less cairo path happy
diff --git a/cairo-util.c b/cairo-util.c
index 437098c..c4138dd 100644
--- a/cairo-util.c
+++ b/cairo-util.c
@@ -114,4 +114,142 @@
 	}
 
 	free(dst);
+	cairo_surface_mark_dirty(surface);
+}
+
+void
+tile_mask(cairo_t *cr, cairo_surface_t *surface,
+	  int x, int y, int width, int height, int margin)
+{
+	cairo_pattern_t *pattern;
+	cairo_matrix_t matrix;
+	int i, fx, fy;
+
+	cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
+	pattern = cairo_pattern_create_for_surface (surface);
+
+	for (i = 0; i < 4; i++) {
+		fx = i & 1;
+		fy = i >> 1;
+
+		cairo_matrix_init_translate(&matrix,
+					    -x + fx * (128 - width),
+					    -y + fy * (128 - height));
+		cairo_pattern_set_matrix(pattern, &matrix);
+
+		cairo_reset_clip(cr);
+		cairo_rectangle(cr,
+				x + fx * (width - margin),
+				y + fy * (height - margin),
+				margin, margin);
+		cairo_clip (cr);
+		cairo_mask(cr, pattern);
+	}
+
+	/* Top strecth */
+	cairo_matrix_init_translate(&matrix, 64, 0);
+	cairo_matrix_scale(&matrix, 64.0 / (width - 2 * margin), 1);
+	cairo_matrix_translate(&matrix, -x - width / 2, -y);
+	cairo_pattern_set_matrix(pattern, &matrix);
+	cairo_rectangle(cr, x + margin, y, width - 2 * margin, margin);
+
+	cairo_reset_clip(cr);
+	cairo_rectangle(cr,
+			x + margin,
+			y,
+			width - 2 * margin, margin);
+	cairo_clip (cr);
+	cairo_mask(cr, pattern);
+
+	/* Bottom strecth */
+	cairo_matrix_translate(&matrix, 0, -height + 128);
+	cairo_pattern_set_matrix(pattern, &matrix);
+
+	cairo_reset_clip(cr);
+	cairo_rectangle(cr, x + margin, y + height - margin,
+			width - 2 * margin, margin);
+	cairo_clip (cr);
+	cairo_mask(cr, pattern);
+
+	/* Left strecth */
+	cairo_matrix_init_translate(&matrix, 0, 64);
+	cairo_matrix_scale(&matrix, 1, 64.0 / (height - 2 * margin));
+	cairo_matrix_translate(&matrix, -x, -y - height / 2);
+	cairo_pattern_set_matrix(pattern, &matrix);
+	cairo_reset_clip(cr);
+	cairo_rectangle(cr, x, y + margin, margin, height - 2 * margin);
+	cairo_clip (cr);
+	cairo_mask(cr, pattern);
+
+	/* Right strecth */
+	cairo_matrix_translate(&matrix, -width + 128, 0);
+	cairo_pattern_set_matrix(pattern, &matrix);
+	cairo_rectangle(cr, x + width - margin, y + margin,
+			margin, height - 2 * margin);
+	cairo_reset_clip(cr);
+	cairo_clip (cr);
+	cairo_mask(cr, pattern);
+
+	cairo_pattern_destroy(pattern);
+	cairo_reset_clip(cr);
+}
+
+void
+tile_source(cairo_t *cr, cairo_surface_t *surface,
+	    int x, int y, int width, int height, int margin)
+{
+	cairo_pattern_t *pattern;
+	cairo_matrix_t matrix;
+	int i, fx, fy;
+
+	cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
+	pattern = cairo_pattern_create_for_surface (surface);
+	cairo_set_source(cr, pattern);
+	cairo_pattern_destroy(pattern);
+
+	for (i = 0; i < 4; i++) {
+		fx = i & 1;
+		fy = i >> 1;
+
+		cairo_matrix_init_translate(&matrix,
+					    -x + fx * (128 - width),
+					    -y + fy * (128 - height));
+		cairo_pattern_set_matrix(pattern, &matrix);
+
+		cairo_rectangle(cr,
+				x + fx * (width - margin),
+				y + fy * (height - margin),
+				margin, margin);
+		cairo_fill(cr);
+	}
+
+	/* Top strecth */
+	cairo_matrix_init_translate(&matrix, 64, 0);
+	cairo_matrix_scale(&matrix, 64.0 / (width - 2 * margin), 1);
+	cairo_matrix_translate(&matrix, -x - width / 2, -y);
+	cairo_pattern_set_matrix(pattern, &matrix);
+	cairo_rectangle(cr, x + margin, y, width - 2 * margin, margin);
+	cairo_fill(cr);
+
+	/* Bottom strecth */
+	cairo_matrix_translate(&matrix, 0, -height + 128);
+	cairo_pattern_set_matrix(pattern, &matrix);
+	cairo_rectangle(cr, x + margin, y + height - margin,
+			width - 2 * margin, margin);
+	cairo_fill(cr);
+
+	/* Left strecth */
+	cairo_matrix_init_translate(&matrix, 0, 64);
+	cairo_matrix_scale(&matrix, 1, 64.0 / (height - 2 * margin));
+	cairo_matrix_translate(&matrix, -x, -y - height / 2);
+	cairo_pattern_set_matrix(pattern, &matrix);
+	cairo_rectangle(cr, x, y + margin, margin, height - 2 * margin);
+	cairo_fill(cr);
+
+	/* Right strecth */
+	cairo_matrix_translate(&matrix, -width + 128, 0);
+	cairo_pattern_set_matrix(pattern, &matrix);
+	cairo_rectangle(cr, x + width - margin, y + margin,
+			margin, height - 2 * margin);
+	cairo_fill(cr);
 }