blob: b93bc85332143b44acd3c22d8d75e43ccdc319cc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Red Hat and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.tests.gtk.snippets;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
public class Bug103691_TransparentPixel {
private static byte LO = 0;
private static byte MID = 1;
private static byte HI = 2;
// Change to path pointing to image.
private static String IMG_PATH = "/home/xiyan/Downloads/smallfish.gif";
private static float markOrigColor(byte orig[]) {
int foo[] = new int[3];
for (int i = 0; i < 3; i++)
foo[i] = orig[i] < 0 ? orig[i] + 256 : orig[i];
int hi, lo, mid;
hi = lo = mid = foo[0];
for (int i = 1; i < 3; i++)
if (foo[i] > hi) {
mid = hi;
hi = foo[i];
} else if (foo[i] < lo) {
mid = lo;
lo = foo[i];
} else
mid = foo[i];
for (int i = 0; i < 3; i++)
if (foo[i] == hi)
orig[i] = HI;
else if (foo[i] == lo)
orig[i] = LO;
else
orig[i] = MID;
return (mid - lo) / (float) (hi - lo);
}
private static void colorize(ImageData data, byte orig[], float midratio) {
for (int y = 0; y < data.height; y++)
for (int x = 0; x < data.width; x++) {
int pixel = data.getPixel(x, y);
if (pixel == data.transparentPixel) {
data.setPixel(x, y, data.palette.getPixel(new RGB(0, 0, 255)));
continue;
}
RGB pixelValue = data.palette.getRGB(data.getPixel(x, y));
int foo[] = new int[] { pixelValue.red, pixelValue.green, pixelValue.blue };
int hi, lo, mid;
hi = lo = mid = foo[0];
for (int i = 1; i < 3; i++)
if (foo[i] > hi) {
mid = hi;
hi = foo[i];
} else if (foo[i] < lo) {
mid = lo;
lo = foo[i];
} else
mid = foo[i];
float mul = ((hi + mid + lo) / 765.0f * 255 - hi) / hi;
hi += mul * hi;
lo += mul * lo;
int sat = 100 * (255 - lo) / (hi + 1);
float dif = (255 - (hi - lo)) / (float) 255;
hi *= 1 + dif;
if (hi > 255)
hi = 255;
lo -= (sat + 0 * dif);
if (lo < 0)
lo = 0;
mid = (int) (midratio * (hi - lo) + lo);
for (int i = 0; i < 3; i++)
if (orig[i] == HI)
foo[i] = hi;
else if (orig[i] == LO)
foo[i] = lo;
else
foo[i] = mid;
data.setPixel(x, y, data.palette.getPixel(new RGB(foo[0], foo[1], foo[2])));
}
}
public static void printArray(byte bites[]) {
System.out.print("[");
for (int i = 0; i < 2; i++)
System.out.print((bites[i] < 0 ? bites[i] + 256 : bites[i]) + ", ");
System.out.println((bites[2] < 0 ? bites[2] + 256 : bites[2]) + "]");
}
public static void main(String[] args) {
byte orig[] = { (byte) 255, (byte) 64, (byte) 0 };
float midratio = markOrigColor(orig);
Display display = new Display();
final Shell shell = new Shell(display);
final Label label = new Label(shell, SWT.BORDER);
Image image = new Image(display, IMG_PATH);
ImageData data = image.getImageData();
colorize(data, orig, midratio);
image = new Image(display, data);
label.setBounds(image.getBounds());
shell.pack();
label.setImage(image);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}