anchor.diff:      var tx = this.getTransform();
       CanvasUtil.transform(ctx, tx);
   
  +    _setAlpha(ctx);
       ctx.drawImage(this._cacheCanvas, 0, 0);
       ctx.restore();
     }
  
positive.code:     requireArgument(isValidNumber(value), 'value');
      requireArgument(value >= 0 && value <= 1, 'value');
      _alpha = value;
      invalidateDraw();
    }
  
    ThingParent get parent => _parent;
  
negative.code:       ctx.clip();
      }
  
      _setAlpha(ctx);
  
      _drawInternal(ctx);
      ctx.restore();
    }
  
    void _drawInternal(CanvasRenderingContext2D ctx) {
      // possible for invalidateParent to be called during draw
      // which signals that another frame is wanted for animating content
      // so we're setting _lastDrawSize here
      _lastDrawSize = this.size;
  
      // call the abstract draw method
      drawOverride(ctx);
    }
  
    bool _isClipped(AffineTransform tx, CanvasRenderingContext2D ctx){
      if(clip){
        // a lot more impl to do here...
      }
      return false;
    }
  
    void _invalidateParent(){
      assert(this._parent != null);
      _invalidatedEventHandle.fireEvent(EventArgs.empty);
      _parent.childInvalidated(this);
    }
  
    void _setAlpha(CanvasRenderingContext2D ctx) {
      assert(_alpha != null);
      assert(_alpha >= 0);
      assert(_alpha <= 1);
      ctx.globalAlpha = _alpha;
    }
  }
  