Bootlin logo

Elixir Cross Referencer

<body>
This is a test for custom CSS cursors on retina displays.
Move the mouse over the green pixel in each red square and the left should match the right.
Note that NSCursor has bugs with precise sub-pixel positioning on retina displays but if you zoom in using the control+scroll shortcut then the cursor will shift to the correct position.
See https://bugs.webkit.org/show_bug.cgi?id=120783.
<script>

if (window.devicePixelRatio !== 2) {
  document.write('<h1>Note: This test only makes sense on a retina display.</h1>');
}

var demoWidth = 64;
var demoHeight = 64;

function createCheckerboard(width, height) {
  var c = document.createElement('canvas').getContext('2d');
  var imageData = c.createImageData(width, height);
  var data = imageData.data;
  c.canvas.width = width;
  c.canvas.height = height;
  for (var y = 0; y < height; y++) {
    for (var x = 0; x < width; x++) {
      var i = x + y * width << 2;
      data[i] = data[i + 1] = data[i + 2] = (x ^ y) & 1 ? 255 : 0;
      data[i + 3] = 255;
    }
  }
  c.putImageData(imageData, 0, 0);
  return c.canvas;
}

function createRender(x, y, width, height, scale) {
  var c = document.createElement('canvas').getContext('2d');
  var checkerboard = createCheckerboard(width, height);
  c.canvas.width = demoWidth * 2;
  c.canvas.height = demoHeight * 2;
  c.canvas.style.width = demoWidth + 'px';
  c.canvas.style.height = demoHeight + 'px';
  c.fillStyle = '#F00'; c.fillRect(0, 0, demoWidth * 2, demoHeight * 2);
  c.fillStyle = '#D00'; c.fillRect(0, 0, demoWidth, demoHeight);
  c.fillStyle = '#0F0'; c.fillRect(demoWidth, demoHeight, 2, 2);
  c.drawImage(checkerboard, demoWidth - 2 * x, demoHeight - 2 * y, checkerboard.width * 2 / scale, checkerboard.height * 2 / scale);
  return c.canvas;
}

var number = 0;

function createCursorDemo(x, y, width, height, scale) {
  var cursor = '-webkit-image-set(url(' + createCheckerboard(width, height).toDataURL() + ') ' + scale + 'x) ' + x + ' ' + y + ', help';
  document.write('<h3 style="margin-bottom:0;">Test ' + ++number + '</h3>' +
    '<div style="position:relative;width:' + demoWidth + 'px;height:' + demoHeight + 'px;background:#F00;display:inline-block;margin-right:20px;">' +
      '<div style="position:absolute;width:' + demoWidth / 2 + 'px;height:' + demoHeight / 2 + 'px;background:#D00;"></div>' +
      '<div style="position:absolute;left:' + demoWidth / 2 + 'px;top:' + demoHeight / 2 + 'px;width:1px;height:1px;background:#0F0;cursor:' + cursor + ';"></div>' +
    '</div>');
  document.body.appendChild(createRender(x, y, width, height, scale));
}

document.write('<h2>Size tests</h2>');
createCursorDemo(0, 0, 64, 64, 2);
createCursorDemo(0, 0, 63, 64, 2);
createCursorDemo(0, 0, 64, 63, 2);
createCursorDemo(0, 0, 63, 63, 2);
createCursorDemo(0, 0, 5, 4, 2);
createCursorDemo(0, 0, 5, 3, 2);
createCursorDemo(0, 0, 4, 3, 2);
createCursorDemo(0, 0, 2, 2, 2);
createCursorDemo(0, 0, 1, 1, 2);

document.write('<h2>Hot spot tests</h2>');
createCursorDemo(15, 15, 64, 64, 2);
createCursorDemo(15, 15, 32, 32, 1);
createCursorDemo(31, 31, 64, 64, 2);
createCursorDemo(31, 31, 32, 32, 1);
createCursorDemo(1, 1, 9, 9, 2);
createCursorDemo(16, 0, 64, 64, 2);
createCursorDemo(0, 16, 64, 64, 2);
createCursorDemo(3, 4, 8, 10, 2);
createCursorDemo(2, 3, 7, 9, 2);
createCursorDemo(1, 0, 5, 3, 2);
createCursorDemo(2, 1, 5, 3, 2);

</script>
</body>