         @drawOrderRequiresStaging
       )
 
+    getWhyStagingIsNeeded: (elementToTargetMatrix) ->
+      switch
+        when @stage then "stage property is true"
+        when @getIsMask() then "is mask"
+        when ((@getHasChildren() || @draw?) && !@getCompositingIsBasic()) then "compositing requires staging: #{@compositeMode}, opacity: #{@opacity}"
+        when (@_clip && elementToTargetMatrix?.getHasSkew()) then "clipping and non-rectangular area due to matrix: #{elementToTargetMatrix}"
+        when @getChildRequiresParentStagingBitmap() then "child needs parent staging"
+        when @drawOrderRequiresStaging then "draw property requries staging: #{formattedInspect @draw}"
+
     @getter
       compositingIsBasic: -> @_compositeMode == "normal" && floatEq @_opacity, 1
       cacheIsValid: -> !!@_drawCacheBitmap

      return if elementSpaceDrawArea.getArea() <= 0

      cacheScale =
        pixelsPerPoint *
          if @getCacheDraw() || @getStage() then 1 else elementToTargetMatrix.getExactScaler()

      cacheSpaceDrawArea = elementSpaceDrawArea.mul cacheScale
      while cacheSpaceDrawArea.area >= maxCanvasSize

      cacheDraw:
        default: false
        validate: (v) -> v == false || v == true || isPlainObject v

    @drawLayoutProperty

