anchor.diff:      framebuffer = gl.createFramebuffer();
   
       colorTexture = new TypedTexture(
  -        "frame::color", width, height, WEBGL.RGB, WEBGL.UNSIGNED_BYTE);
  +        "frame::color", width, height, colorFormat, WEBGL.UNSIGNED_BYTE);
       colorTexture.Install(gl);
       depthTexture = new TypedTexture("frame::depth", width, height,
           WEBGL.DEPTH_COMPONENT, WEBGL.UNSIGNED_SHORT);
  
positive.code:     }
      return result;
    }
    
    // e.g. into Float32List
    void ExtractData(var buf, int x, int y, int w, int h) {
      gl.bindFramebuffer(WEBGL.FRAMEBUFFER, framebuffer);
      int implFormat =
          gl.getParameter(WEBGL.RenderingContext.IMPLEMENTATION_COLOR_READ_FORMAT);
      int implType =
          gl.getParameter(WEBGL.RenderingContext.IMPLEMENTATION_COLOR_READ_TYPE);
      gl.readPixels(x, y, w, h, implFormat, implType, buf);
      gl.bindFramebuffer(WEBGL.FRAMEBUFFER, null);
    }
  }
  
negative.code:   WEBGL.RenderingContext gl;
  
    WEBGL.Framebuffer framebuffer;
    //WEBGL.Renderbuffer renderbuffer;
    TypedTexture colorTexture;
    TypedTexture depthTexture;
    var depthTextureExt;
  
    ChronosFramebuffer(this.gl, width, height, [colorFormat = WEBGL.RGB]) {
      depthTextureExt = GetGlExtensionDepth(gl);
      // http://blog.tojicode.com/2012/07/using-webgldepthtexture.html
      if (depthTextureExt == null) {
  