anchor.diff:      return b;
     }
   
  +  get autoData => new Map()
  +    ..[sfname_projectionmatrix] = _setUniformProjectionMatrix
  +    ..[sfname_viewmatrix] = _setUniformViewMatrix
  +    ..[sfname_rotmatrix] = _setUniformRotMatrix
  +    ..[sfname_projectionviewmatrix] = _setUniformProjectionViewMatrix
  +    ;
  +
     _setup(RenderingContext gl) {
       // Basic viewport setup and clearing of the screen
       gl.viewport(x, y, viewWidth, viewHeight);
  
positive.code: 
    final _projectionMatrix = new Matrix4.zero();
    final _viewMatrix = new Matrix4.identity();
    final _projectionViewMatrix = new Matrix4.zero();
  
    updateProjectionMatrix() {
  
negative.code:     };
      return Window.resizeEvent.forTarget(canvas).listen(onResize);
    }
  }
  
  class ViewportPlan {
    int x = 0;
    int y = 0;
    int viewWidth;
    int viewHeight;
  
  
    // default constructor;
    ViewportPlan();
  
    factory ViewportPlan.defaultSettings(CanvasElement canvas) {
      var b = new Viewport()
      ..fullCanvas(canvas)
      ..registerOnResizeCanvas(canvas)
      ;
      return b;
    }
  
    _setup(RenderingContext gl) {
      // Basic viewport setup and clearing of the screen
      gl.viewport(x, y, viewWidth, viewHeight);
    }
  
    makeRequestRunOn() => new RequestRunOn()
      ..setup = _setup
  //    ..beforeAll = ((gl) => autoScale(gl.canvas))
    ;
  
  
    fullCanvas(CanvasElement canvas) {
      var dpr = window.devicePixelRatio;     // retina
      //var dpr = 1;
      viewWidth = (dpr * canvas.clientWidth).round();//parseInt(canvas.style.width);
      viewHeight = (dpr * canvas.clientHeight).round(); //parseInt(canvas.style.height);
      x = 0;
      y = 0;
      canvas.width = viewWidth;
      canvas.height = viewHeight;
    }
  
    registerOnResizeCanvas(CanvasElement canvas) {
      var onResize = (evt){
        fullCanvas(canvas);
      };
      return Window.resizeEvent.forTarget(canvas).listen(onResize);
    }
  }