Index: uspace/lib/gfx/src/coord.c
===================================================================
--- uspace/lib/gfx/src/coord.c	(revision 8b1ce56ebdcb932e749a47df174ee4a25271231d)
+++ uspace/lib/gfx/src/coord.c	(revision fdc8e4053a18f2b30fdf821c1f0a755b6e34908e)
@@ -87,5 +87,5 @@
 /** Move (translate) rectangle.
  *
- * @param trans Translation
+ * @param trans Translation offset
  * @param src Source rectangle
  * @param dest Destination rectangle
@@ -93,6 +93,18 @@
 void gfx_rect_translate(gfx_coord2_t *trans, gfx_rect_t *src, gfx_rect_t *dest)
 {
-	gfx_coord2_add(trans, &src->p0, &dest->p0);
-	gfx_coord2_add(trans, &src->p1, &dest->p1);
+	gfx_coord2_add(&src->p0, trans, &dest->p0);
+	gfx_coord2_add(&src->p1, trans, &dest->p1);
+}
+
+/** Reverse move (translate) rectangle.
+ *
+ * @param trans Translation offset
+ * @param src Source rectangle
+ * @param dest Destination rectangle
+ */
+void gfx_rect_rtranslate(gfx_coord2_t *trans, gfx_rect_t *src, gfx_rect_t *dest)
+{
+	gfx_coord2_subtract(&src->p0, trans, &dest->p0);
+	gfx_coord2_subtract(&src->p1, trans, &dest->p1);
 }
 
@@ -100,4 +112,8 @@
  *
  * Envelope is the minimal rectangle covering all pixels of both rectangles.
+ *
+ * @param a First rectangle
+ * @param b Second rectangle
+ * @param dest Place to store enveloping rectangle
  */
 void gfx_rect_envelope(gfx_rect_t *a, gfx_rect_t *b, gfx_rect_t *dest)
@@ -124,4 +140,26 @@
 	dest->p1.x = max(sa.p1.x, sb.p1.x);
 	dest->p1.y = max(sa.p1.y, sb.p1.y);
+}
+
+/** Compute intersection of two rectangles.
+ *
+ * If the two rectangles do not intersect, the result will be an empty
+ * rectangle (check with gfx_rect_is_empty()).
+ *
+ * @param rect Source rectangle
+ * @param clip Clipping rectangle
+ * @param dest Place to store clipped rectangle
+ */
+void gfx_rect_clip(gfx_rect_t *rect, gfx_rect_t *clip, gfx_rect_t *dest)
+{
+	gfx_rect_t srect, sclip;
+
+	gfx_rect_points_sort(rect, &srect);
+	gfx_rect_points_sort(clip, &sclip);
+
+	dest->p0.x = min(max(srect.p0.x, sclip.p0.x), sclip.p1.x);
+	dest->p0.y = min(max(srect.p0.y, sclip.p0.y), sclip.p1.y);
+	dest->p1.x = max(sclip.p0.x, min(srect.p1.x, sclip.p1.x));
+	dest->p1.y = max(sclip.p0.y, min(srect.p1.y, sclip.p1.y));
 }
 
