 
   @_cachingDraws: 0
 
+  getCacheDrawRequired: (elementToTargetMatrix) -> @getNeedsStagingBitmap(elementToTargetMatrix) || (config.drawCacheEnabled && Element._cachingDraws == 0 && @getCacheable() && @getCacheDraw())
+  getNeedsStagingBitmap: (elementToTargetMatrix) ->
+    (
+      (
+        (@getHasChildren() || @getIsMask()) &&
+        (@_compositeMode != "normal" || @_opacity < 1 || @getChildRequiresParentStagingBitmap())
+      ) ||
+      (elementToTargetMatrix && @_clip && !elementToTargetMatrix.getIsTranslateAndScaleOnly())
+    )
+
   @getter
-    cacheDrawRequired: -> @getNeedsStagingBitmap() || (config.drawCacheEnabled && Element._cachingDraws == 0 && @getCacheable() && @getCacheDraw())
     cacheIsValid: -> !!@_drawCacheBitmap
-    needsStagingBitmap: ->
-      (@getHasChildren() || @getIsMask()) && (@_compositeMode != "normal" || @_opacity < 1 || @getChildRequiresParentStagingBitmap())
 
     # override this for elements which are faster w/o caching (RectangleElement, BitmapElement)
     cacheable: -> true

      targetSpaceDrawArea = @drawAreaIn(elementToTargetMatrix).intersection target.getClippingArea()
      return unless targetSpaceDrawArea.area > 0

      if @getCacheDrawRequired()
        @_cachedFullDraw targetSpaceDrawArea, target, elementToTargetMatrix
      else
        @_clearDrawCache()

      proposedTargetSpaceDrawArea = child.overDraw proposedTargetSpaceDrawArea, elementToTargetMatrix
    proposedTargetSpaceDrawArea

  # OVERRIDE _clipDraw AND hasCustomClipping for custom clipping (RectangleElement, for example)
  _clipDraw: (clipArea, target, elementToTargetMatrix)->
    throw new Error "bad matrix" unless elementToTargetMatrix.getIsTranslateAndScaleOnly()
    target.clippedTo clipArea, =>
      @_drawChildren target, elementToTargetMatrix

  @getter
    hasCustomClipping: -> false

  draw: (target, elementToTargetMatrix)->
    stats.elementsDrawn++
