anchor.diff:      _areaEntity.y = 0.0;
       d.draw(_g, entity, _areaEntity);
       if (tf != null) {
  +      _g.scale(1/tf.scale3d.x, 1/tf.scale3d.y);
  +      _g.rotate(-tf.rotation3d.z);
         _g.translate(-tf.position3d.x.toInt(), -tf.position3d.y.toInt());
  -      _g.rotate(-tf.rotation3d.z);
  -      _g.scale(1/tf.scale3d.x, 1/tf.scale3d.y);
       }
  +
  +    if (_scale != 1.0) _g.scale(_scaleI, _scaleI);
  +    _g.translate(- translateX, - translateY);
       _g.restore();
     }
   
     void end() {
       _g.restore();
  -    _gVisible.clearRect(0,0, _w, _h);
  +    _gVisible.clearRect(0, 0, _w, _h);
       _gVisible.drawImage(_g.canvas, 0, 0);
  -    _g.clearRect(0,0, _w, _h);
  +    _g.clearRect(0, 0, _w, _h);
     }
   }
   
  
positive.code:   }
  
    void processEntity(Entity entity) {
      var d = _drawMapper.get(entity);
      var tf = _transformMapper.getSafe(entity);
      if (tf != null) {
  
negative.code:   /// TODO optim : use _areaEntity and _areaEntities to clear and to update offscreen canvas
    //vec4 _areaEntities = new vec4(0.0, 0.0);
  
    var translateX = 0.0;
    var translateY = 0.0;
  
    var _scale = 1.0;
    var _scaleI = 1.0;
    get scale => _scale / _dpr;
    set scale(v) {
      _scale = v * _dpr;
      _scaleI = 1 / _scale;
    }
  
  
    System_Renderer(canvas) :
      super(Aspect.getAspectForAllOf([Drawable])),
      _gVisible = canvas.context2D,
      _g = new CanvasElement().context2D
      ;
  
    void initialize(){
  