blob: 0e545a3aa80a062452fa2c0e962bc648878aa084 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Red Hat and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.tests.gtk.snippets;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
/*
* Created on Jul 5, 2005
*
* To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
public class Bug103691_TransparentPixel {
// public static byte byteMe(String prompt) {
// System.out.print(prompt + " ");
// return Byte.parseByte(Stdin.readLine());
// }
private static byte LO = 0;
private static byte MID = 1;
private static byte HI = 2;
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;
// mid += mul*mid;
lo += mul*lo;
// mul = ((hi+mid+lo) / 765.0f * hi - lo) / (hi-lo+1);
// mid += mul*(hi-mid);
// lo += mul*(hi-lo);
int sat = 100*(255 - lo) / (hi+1);
// lo = mid = hi;
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 *= 1+(.5f*dif);
// if (mid > 255)
// mid = 255;
// mid -= sat/2;
// if (mid < 0)
// mid = 0;
mid = (int) (midratio*(hi-lo) + lo);
// float mul;
// int sum = lo+mid+hi;
// if (sum < 510) {
// mul = Math.abs(255-sum)/255.0f;
// mul = 1 - (1-mul)/4;
// hi *= mul;
// lo *= mul;
// mid *= mul;
// }
// if (sum > 255) {
// mul = Math.abs(510-sum)/255.0f;
// mul = 1 - (1-mul)/4;
// hi += (255-hi)*mul;
// lo += (255-lo)*mul;
// mid += (255-mid)*mul;
// }
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]) + "]");
}
/**
* @param args
*/
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, "/home/fmain/Downloads/smallfish.gif");
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 ();
}
//widget.shell.dispose();
display.dispose();
}
}