| Index: experimental/webtry/js/webtry.js | 
| diff --git a/experimental/webtry/js/webtry.js b/experimental/webtry/js/webtry.js | 
| index aafadf3b67bb4165ebb948558db2acdb953e99d1..ca3023c0c1a380930e48c001273450b641abff66 100644 | 
| --- a/experimental/webtry/js/webtry.js | 
| +++ b/experimental/webtry/js/webtry.js | 
| @@ -28,12 +28,15 @@ | 
| * Enable zooming for any images with a class of 'zoom'. | 
| */ | 
| (function () { | 
| +  var PIXELS       = 20; // The number of pixels in width and height in a zoom. | 
| var clientX      = 0; | 
| var clientY      = 0; | 
| var lastClientX  = 0; | 
| var lastClientY  = 0; | 
| var ctx          = null; // The 2D canvas context of the zoom. | 
| var currentImage = null; // The img node we are zooming for, otherwise null. | 
| +  var hex          = document.getElementById('zoomHex'); | 
| +  var canvasCopy   = null; | 
|  | 
| function zoomMove(e) { | 
| clientX = e.clientX; | 
| @@ -53,13 +56,23 @@ | 
| lastClientY = clientY-1; | 
| document.body.style.cursor = 'crosshair'; | 
| canvas = document.createElement('canvas'); | 
| -    canvas.width=256; | 
| -    canvas.height=256; | 
| +    canvas.width = 1024; | 
| +    canvas.height = 1024; | 
| canvas.classList.add('zoomCanvas'); | 
| ctx = canvas.getContext('2d'); | 
| ctx.imageSmoothingEnabled = false; | 
| this.parentNode.insertBefore(canvas, this); | 
|  | 
| +    // Copy the image over to a canvas so we can read RGBA values for each point. | 
| +    if (hex) { | 
| +      canvasCopy = document.createElement('canvas'); | 
| +      canvasCopy.width = currentImage.width; | 
| +      canvasCopy.height = currentImage.height; | 
| +      canvasCopy.id = 'zoomCopy'; | 
| +      canvasCopy.getContext('2d').drawImage(currentImage, 0, 0, currentImage.width, currentImage.height); | 
| +      this.parentNode.insertBefore(canvasCopy, this); | 
| +    } | 
| + | 
| document.body.addEventListener('mousemove',  zoomMove,     true); | 
| document.body.addEventListener('mouseup',    zoomFinished); | 
| document.body.addEventListener('mouseleave', zoomFinished); | 
| @@ -68,18 +81,47 @@ | 
| setTimeout(drawZoom, 1); | 
| } | 
|  | 
| +  function hexify(i) { | 
| +    var s = i.toString(16).toUpperCase(); | 
| +    // Pad out to two hex digits if necessary. | 
| +    if (s.length < 2) { | 
| +      s = '0' + s; | 
| +    } | 
| +    return s; | 
| +  } | 
| + | 
| function drawZoom() { | 
| if (currentImage) { | 
| // Only draw if the mouse has moved from the last time we drew. | 
| if (lastClientX != clientX || lastClientY != clientY) { | 
| ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); | 
| +        var x = clientX - currentImage.x; | 
| +        var y = clientY - currentImage.y; | 
| ctx.drawImage(currentImage, | 
| -            clientX - currentImage.x, clientY - currentImage.y,  // src zero | 
| -            32, 32,                                              // src dimensions | 
| -            0, 0,                                                // dst zero | 
| -            ctx.canvas.width, ctx.canvas.height);                // dst dimensions | 
| +            x, y,                                 // src zero | 
| +            PIXELS, PIXELS,                       // src dimensions | 
| +            0, 0,                                 // dst zero | 
| +            ctx.canvas.width, ctx.canvas.height); // dst dimensions | 
| lastClientX = clientX; | 
| lastClientY = clientY; | 
| +        // Box and label one selected pixel with its rgba values. | 
| +        if (hex) { | 
| +          ctx.lineWidth = 1; | 
| +          ctx.strokeStyle = '#000'; | 
| +          var dx = ctx.canvas.width/PIXELS; | 
| +          var dy = ctx.canvas.height/PIXELS; | 
| +          ctx.strokeRect((PIXELS/2)*dx, (PIXELS/2)*dy, dx, dy); | 
| +          var p = canvasCopy.getContext('2d').getImageData(x+PIXELS/2, y+PIXELS/2, 1, 1).data; | 
| +          hex.textContent = 'rgba(' | 
| +            + p[0] + ', ' | 
| +            + p[1] + ', ' | 
| +            + p[2] + ', ' | 
| +            + p[3] + ') ' | 
| +            + hexify(p[0]) | 
| +            + hexify(p[1]) | 
| +            + hexify(p[2]) | 
| +            + hexify(p[3]); | 
| +        } | 
| } | 
| setTimeout(drawZoom, 1000/30); | 
| } | 
| @@ -87,8 +129,12 @@ | 
|  | 
| function zoomFinished() { | 
| currentImage = null; | 
| +    if (hex) { | 
| +      hex.textContent = ''; | 
| +    } | 
| document.body.style.cursor = 'default'; | 
| ctx.canvas.parentNode.removeChild(ctx.canvas); | 
| +    canvasCopy.parentNode.removeChild(canvasCopy); | 
| document.body.removeEventListener('mousemove',  zoomMove,     true); | 
| document.body.removeEventListener('mouseup',    zoomFinished); | 
| document.body.removeEventListener('mouseleave', zoomFinished); | 
|  |