Project

General

Profile

colors_interpolations_1.txt

Sergey Ivanovskiy, 08/21/2015 04:22 PM

Download (2 KB)

 
1
=== modified file 'src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js'
2
--- src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js	2015-08-21 16:58:11 +0000
3
+++ src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js	2015-08-21 20:06:59 +0000
4
@@ -1497,18 +1497,36 @@
5
     */
6
    Window.prototype.drawImage = function(ctx, x, y, width, height, imgData, imgDataOffset)
7
    {
8
-      var img = ctx.createImageData(width, height);
9
+      /**
10
+       * Pixels must be returned as non-premultiplied alpha values according to:
11
+       * http://www.w3.org/TR/2dcontext/#pixel-manipulation
12
+       */
13
+      var img = ctx.getImageData(this.origin.x + x, this.origin.y + y, width, height);
14
       var data = img.data;
15
       var pixelsInBytes = width * height * 4;
16
-
17
-      for (var i = 0, j = imgDataOffset; i < pixelsInBytes; i += 4, j += 4)
18
+      var j = imgDataOffset;
19
+      for (var i = 0; i < pixelsInBytes; i += 4, j += 4)
20
       {
21
-         data[i]     = imgData[j];
22
-         data[i + 1] = imgData[j + 1];
23
-         data[i + 2] = imgData[j + 2];
24
-         data[i + 3] = imgData[j + 3];
25
-     }
26
-     ctx.putImageData(img, this.origin.x + x, this.origin.y + y);
27
+         var alpha = imgData[j + 3];
28
+         var gamma = (256 - alpha) * data[i + 3];
29
+         var beta = gamma >> 8;
30
+         if (alpha == 255)
31
+         {
32
+            data[i]     = imgData[j];
33
+            data[i + 1] = imgData[j + 1];
34
+            data[i + 2] = imgData[j + 2];
35
+            data[i + 3] = imgData[j + 3];
36
+         }
37
+         else if (alpha > 0)
38
+         {
39
+            /** server sends premultiplied image data */
40
+            data[i]     = (imgData[j]     * alpha + data[i]     * beta) >> 8;
41
+            data[i + 1] = (imgData[j + 1] * alpha + data[i + 1] * beta) >> 8;
42
+            data[i + 2] = (imgData[j + 2] * alpha + data[i + 2] * beta) >> 8;
43
+            data[i + 3] = (imgData[j + 3] * alpha + gamma) >> 8;
44
+         }
45
+      }
46
+      ctx.putImageData(img, this.origin.x + x, this.origin.y + y);
47
    };
48
    
49
    /**
50