Commit 6f4cbb3f authored by vj's avatar vj

Always generate square cursor images in changeCursor (fix portrait mode issue).

This is a workaround for corrupted non-square cursors seen on some
Windows 7 machines with NVIDIA cards. The corruption only happens when
the screen is in portrait mode.
parent 7a6c94b6
...@@ -657,10 +657,17 @@ return constructor(); // Return the public API interface ...@@ -657,10 +657,17 @@ return constructor(); // Return the public API interface
/* Set CSS cursor property using data URI encoded cursor file */ /* Set CSS cursor property using data URI encoded cursor file */
function changeCursor(target, pixels, mask, hotx, hoty, w, h, cmap) { function changeCursor(target, pixels, mask, hotx, hoty, w0, h0, cmap) {
"use strict"; "use strict";
var cur = [], rgb, IHDRsz, RGBsz, ANDsz, XORsz, url, idx, alpha, x, y; var cur = [], rgb, IHDRsz, RGBsz, ANDsz, XORsz, url, idx, alpha, x, y;
//Util.Debug(">> changeCursor, x: " + hotx + ", y: " + hoty + ", w: " + w + ", h: " + h); //Util.Debug(">> changeCursor, x: " + hotx + ", y: " + hoty + ", w0: " + w0 + ", h0: " + h0);
var w = w0;
var h = h0;
if (h < w)
h = w; // increase h to make it square
else
w = h; // increace w to make it square
// Push multi-byte little-endian values // Push multi-byte little-endian values
cur.push16le = function (num) { cur.push16le = function (num) {
...@@ -715,18 +722,23 @@ function changeCursor(target, pixels, mask, hotx, hoty, w, h, cmap) { ...@@ -715,18 +722,23 @@ function changeCursor(target, pixels, mask, hotx, hoty, w, h, cmap) {
// 62: color data (RGBQUAD icColors[]) // 62: color data (RGBQUAD icColors[])
for (y = h-1; y >= 0; y -= 1) { for (y = h-1; y >= 0; y -= 1) {
for (x = 0; x < w; x += 1) { for (x = 0; x < w; x += 1) {
idx = y * Math.ceil(w / 8) + Math.floor(x/8); if (x >= w0 || y >= h0) {
cur.push(0); // blue
cur.push(0); // green
cur.push(0); // red
cur.push(0); // alpha
} else {
idx = y * Math.ceil(w0 / 8) + Math.floor(x/8);
alpha = (mask[idx] << (x % 8)) & 0x80 ? 255 : 0; alpha = (mask[idx] << (x % 8)) & 0x80 ? 255 : 0;
if (cmap) { if (cmap) {
idx = (w * y) + x; idx = (w0 * y) + x;
rgb = cmap[pixels[idx]]; rgb = cmap[pixels[idx]];
cur.push(rgb[2]); // blue cur.push(rgb[2]); // blue
cur.push(rgb[1]); // green cur.push(rgb[1]); // green
cur.push(rgb[0]); // red cur.push(rgb[0]); // red
cur.push(alpha); // alpha cur.push(alpha); // alpha
} else { } else {
idx = ((w * y) + x) * 4; idx = ((w0 * y) + x) * 4;
cur.push(pixels[idx + 2]); // blue cur.push(pixels[idx + 2]); // blue
cur.push(pixels[idx + 1]); // green cur.push(pixels[idx + 1]); // green
cur.push(pixels[idx ]); // red cur.push(pixels[idx ]); // red
...@@ -734,6 +746,7 @@ function changeCursor(target, pixels, mask, hotx, hoty, w, h, cmap) { ...@@ -734,6 +746,7 @@ function changeCursor(target, pixels, mask, hotx, hoty, w, h, cmap) {
} }
} }
} }
}
// XOR/bitmask data (BYTE icXOR[]) // XOR/bitmask data (BYTE icXOR[])
// (ignored, just needs to be right size) // (ignored, just needs to be right size)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment