     else
       @drawArea
 
-    # descendant && log _needsRedrawing: {descendant: descendant.class, dirtyArea}
-
-    @_dirtyDrawArea = dirtyArea.unionInto @_dirtyDrawArea
+    if @_dirtyDrawAreas
+      foundOverlap = false
+      while foundOverlap
+        foundOverlap = false
+        for area, i in @_dirtyDrawAreas when area.overlaps dirtyArea
+          foundOverlap = true
+          area.unionInto dirtyArea
+          @_dirtyDrawAreas = arrayWithout @_dirtyDrawAreas, i
+      @_dirtyDrawAreas.push dirtyArea
+    else
+      @_dirtyDrawAreas = [dirtyArea]
 
     super
     @queueDrawEpoch()


    false

  # eventually this will only mark an area as needing drawing rather than the whole screen.
  # NOTE: For geometry changes, this gets called twice for the same element:
  #   once before and once after it "moves"
  #   As such, if we are invalidating rectangular areas, we need to do it immediately with each call.


    @_attach @_getOrCreateCanvasElement options
    @engineStat = new EngineStat
    @_dirtyDrawAreas = null

    @pointerEventManager = new PointerEventManager canvasElement:@
    self.canvasElement ||= @
