Optimize imageviewer xcb_clear_area calls
diff --git a/example/imageviewer/imageviewer.cc b/example/imageviewer/imageviewer.cc
index de73643..5fc8b04 100644
--- a/example/imageviewer/imageviewer.cc
+++ b/example/imageviewer/imageviewer.cc
@@ -490,11 +490,35 @@
   return true;
 }
 
+bool  //
+intersects(int32_t old_x,
+           int32_t old_y,
+           int32_t width,
+           int32_t height,
+           int32_t new_x,
+           int32_t new_y) {
+  if ((width <= 0) || (height <= 0)) {
+    return false;
+  } else if ((old_x > new_x) && ((old_x - new_x) >= width)) {
+    return false;
+  } else if ((new_x > old_x) && ((new_x - old_x) >= width)) {
+    return false;
+  } else if ((old_y > new_y) && ((old_y - new_y) >= height)) {
+    return false;
+  } else if ((new_y > old_y) && ((new_y - old_y) >= height)) {
+    return false;
+  }
+  return true;
+}
+
 // clear_area clears the L-shaped difference between old and new rectangles (of
 // equal width and height). It does this in up to two xcb_clear_area calls,
 // labeled A and B in the example below (with old_x=0, old_y=0, width=5,
 // height=4, new_x=2, new_y=2).
 //
+// If the old and new rectangles do not intersect then the old rectangle (not
+// an L-shape) will be cleared.
+//
 // AAAAA
 // AAAAA
 // BB+---+
@@ -510,6 +534,13 @@
            int32_t height,
            int32_t new_x,
            int32_t new_y) {
+  if ((width <= 0) || (height <= 0)) {
+    return;
+  } else if (!intersects(old_x, old_y, width, height, new_x, new_y)) {
+    xcb_clear_area(c, 1, w, old_x, old_y, width, height);
+    return;
+  }
+
   int32_t dy = new_y - old_y;
   if (dy < 0) {
     xcb_clear_area(c, 1, w, old_x, old_y + height + dy, width, -dy);