=== modified file 'src/com/goldencode/p2j/ui/client/gui/driver/web/RawEncoder.java' --- src/com/goldencode/p2j/ui/client/gui/driver/web/RawEncoder.java 2015-08-10 20:53:46 +0000 +++ src/com/goldencode/p2j/ui/client/gui/driver/web/RawEncoder.java 2015-08-22 19:36:14 +0000 @@ -78,6 +78,8 @@ encodedRectangle[b++] = (byte) colorModel.getGreen(pixel); encodedRectangle[b++] = (byte) colorModel.getBlue(pixel); encodedRectangle[b++] = (byte) colorModel.getAlpha(pixel); +// System.err.println(colorModel.getRed(pixel) + ":" + colorModel.getGreen(pixel) +// + ":" + colorModel.getBlue(pixel) + ":" + colorModel.getAlpha(pixel)); } } else === modified file 'src/com/goldencode/p2j/ui/client/gui/driver/web/VirtualScreenImpl.java' --- src/com/goldencode/p2j/ui/client/gui/driver/web/VirtualScreenImpl.java 2015-08-21 15:40:44 +0000 +++ src/com/goldencode/p2j/ui/client/gui/driver/web/VirtualScreenImpl.java 2015-08-22 19:12:47 +0000 @@ -64,7 +64,7 @@ public VirtualScreenImpl(int width, int height) { this(new DirectColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), 32, 0xFF, 0xFF00, - 0xFF0000, 0xFF000000, true, DataBuffer.TYPE_INT), width, height); + 0xFF0000, 0xFF000000, false, DataBuffer.TYPE_INT), width, height); } /** === modified file 'src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js' --- src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js 2015-08-22 11:48:56 +0000 +++ src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js 2015-08-22 19:28:35 +0000 @@ -294,7 +294,7 @@ } } }; - }; + } /** * Register the specified coordinates for mouse support. @@ -363,7 +363,7 @@ break; } } - } + }; // remove from the DOM this.parentNode.removeChild(this); @@ -898,16 +898,14 @@ this.drawRoundRect(ctx, x, y, width, height, diameter, this.rawColor, false); break; case ops.DRAW_IMAGE: - //console.debug("drawing type: " + message[idx]); x = p2j.socket.readInt32BinaryMessage(message, idx + 1); y = p2j.socket.readInt32BinaryMessage(message, idx + 5); + width = p2j.socket.readInt32BinaryMessage(message, idx + 9); height = p2j.socket.readInt32BinaryMessage(message, idx + 13); - //console.debug(x + "x" + y + ", " + width + "x" + height); + var encoding = message[idx + 17]; - //console.debug("encoding type: " + encoding); var key = p2j.socket.readInt32BinaryMessage(message, idx + 18); - console.debug("hash: " + key); var pixelsInBytes = width * height * 4; var imgData; var imgDataOffset; @@ -1503,28 +1501,28 @@ var img = ctx.getImageData(this.origin.x + x, this.origin.y + y, width, height); var data = img.data; var pixelsInBytes = width * height * 4; - var j = imgDataOffset; - for (var i = 0; i < pixelsInBytes; i += 4, j += 4) + var offset = imgDataOffset; + for (var p = 0; p < pixelsInBytes; p += 4, offset += 4) { - var alpha = imgData[j + 3]; - var gamma = (256 - alpha) * data[i + 3]; - var beta = gamma >> 8; + var alpha = imgData[offset + 3]; + var beta = 256 - alpha; if (alpha == 255) { - data[i] = imgData[j]; - data[i + 1] = imgData[j + 1]; - data[i + 2] = imgData[j + 2]; - data[i + 3] = imgData[j + 3]; + /** server sends non-premultiplied image data */ + data[p] = imgData[offset]; + data[p + 1] = imgData[offset + 1]; + data[p + 2] = imgData[offset + 2]; + data[p + 3] = imgData[offset + 3]; } else if (alpha > 0) { - /** server sends premultiplied image data */ - data[i] = (imgData[j] * alpha + data[i] * beta) >> 8; - data[i + 1] = (imgData[j + 1] * alpha + data[i + 1] * beta) >> 8; - data[i + 2] = (imgData[j + 2] * alpha + data[i + 2] * beta) >> 8; - data[i + 3] = (imgData[j + 3] * alpha + gamma) >> 8; - } - } + /** server sends non-premultiplied image data */ + data[p] = (imgData[offset] * alpha + data[p] * beta) >> 8; + data[p + 1] = (imgData[offset + 1] * alpha + data[p + 1] * beta) >> 8; + data[p + 2] = (imgData[offset + 2] * alpha + data[p + 2] * beta) >> 8; + data[p + 3] = (imgData[offset + 3] * alpha + data[p + 3] * beta) >> 8; + }; + }; ctx.putImageData(img, this.origin.x + x, this.origin.y + y); };