+/*
+ * noVNC: HTML5 VNC client
+ * Copyright 2018 Pierre Ossman for noVNC
+ * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
+ */
+
+function Cursor(container) {
+ this._target = null;
+}
+
+Cursor.prototype = {
+ attach: function (target) {
+ if (this._target) {
+ this.detach();
+ }
+
+ this._target = target;
+
+ this.clear();
+ },
+
+ detach: function () {
+ this._target = null;
+ },
+
+ change: function (pixels, mask, hotx, hoty, w, h) {
+ if ((w === 0) || (h === 0)) {
+ this.clear();
+ return;
+ }
+
+ let cur = []
+ for (let y = 0; y < h; y++) {
+ for (let x = 0; x < w; x++) {
+ let idx = y * Math.ceil(w / 8) + Math.floor(x / 8);
+ let alpha = (mask[idx] << (x % 8)) & 0x80 ? 255 : 0;
+ idx = ((w * y) + x) * 4;
+ cur.push(pixels[idx + 2]); // red
+ cur.push(pixels[idx + 1]); // green
+ cur.push(pixels[idx]); // blue
+ cur.push(alpha); // alpha
+ }
+ }
+
+ let canvas = document.createElement('canvas');
+ let ctx = canvas.getContext('2d');
+
+ canvas.width = w;
+ canvas.height = h;
+
+ let img;
+ try {
+ // IE doesn't support this
+ img = new ImageData(new Uint8ClampedArray(cur), w, h);
+ } catch (ex) {
+ img = ctx.createImageData(w, h);
+ img.data.set(new Uint8ClampedArray(cur));
+ }
+ ctx.clearRect(0, 0, w, h);
+ ctx.putImageData(img, 0, 0);
+
+ let url = this._canvas.toDataURL();
+ this._target.style.cursor = 'url(' + url + ')' + hotx + ' ' + hoty + ', default';
+ },
+
+ clear: function () {
+ this._target.style.cursor = 'none';
+ },
+};
+
+export default Cursor;