diff options
author | Felipe Heidrich <fheidric> | 2009-10-06 14:19:46 +0000 |
---|---|---|
committer | Felipe Heidrich <fheidric> | 2009-10-06 14:19:46 +0000 |
commit | 5b398c34e7c4ee58a33a38b1c1effe23bfe02aec (patch) | |
tree | 2a9626ededcdae5e601bfd80a3684fd33df0661b | |
parent | e5e5e84ba2f4928d3aca0d741233a824286d2f42 (diff) | |
download | eclipse.platform.swt-5b398c34e7c4ee58a33a38b1c1effe23bfe02aec.tar.gz eclipse.platform.swt-5b398c34e7c4ee58a33a38b1c1effe23bfe02aec.tar.xz eclipse.platform.swt-5b398c34e7c4ee58a33a38b1c1effe23bfe02aec.zip |
Bug 291307 - Menu images (PNG) does not support semi-alpha-transparency on Windows Vista/7 (3.5.x backport)
-rwxr-xr-x | bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java index e3a2fee7b8..9b8e15f73e 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java @@ -878,16 +878,33 @@ static int /*long*/ create32bitDIB (Image image) { } else if (alpha != -1) { for (int y = 0, dp = 0; y < imgHeight; ++y) { for (int x = 0; x < imgWidth; ++x) { - srcData [dp + 3] = (byte)alpha; - if (srcData [dp + 3] == 0) srcData [dp + 0] = srcData [dp + 1] = srcData [dp + 2] = 0; + int r = ((srcData[dp + 0] & 0xFF) * alpha) + 128; + r = (r + (r >> 8)) >> 8; + int g = ((srcData[dp + 1] & 0xFF) * alpha) + 128; + g = (g + (g >> 8)) >> 8; + int b = ((srcData[dp + 2] & 0xFF) * alpha) + 128; + b = (b + (b >> 8)) >> 8; + srcData[dp+0] = (byte)r; + srcData[dp+1] = (byte)g; + srcData[dp+2] = (byte)b; + srcData[dp+3] = (byte)alpha; dp += 4; } } } else if (alphaData != null) { for (int y = 0, dp = 0, ap = 0; y < imgHeight; ++y) { for (int x = 0; x < imgWidth; ++x) { - srcData [dp + 3] = alphaData [ap++]; - if (srcData [dp + 3] == 0) srcData [dp + 0] = srcData [dp + 1] = srcData [dp + 2] = 0; + int a = alphaData[ap++] & 0xFF; + int r = ((srcData[dp + 0] & 0xFF) * a) + 128; + r = (r + (r >> 8)) >> 8; + int g = ((srcData[dp + 1] & 0xFF) * a) + 128; + g = (g + (g >> 8)) >> 8; + int b = ((srcData[dp + 2] & 0xFF) * a) + 128; + b = (b + (b >> 8)) >> 8; + srcData[dp+0] = (byte)r; + srcData[dp+1] = (byte)g; + srcData[dp+2] = (byte)b; + srcData[dp+3] = (byte)a; dp += 4; } } |