/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.badlogic.gdx.tools.flame;
import java.awt.EventQueue;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
/** @author Inferno */
public class PreAlpha extends JFrame {
BufferedImage image;
ImagePanel imagePanel;
String lastDir;
public PreAlpha () {
super("Premultiply alpha converter");
addWindowListener(new WindowAdapter() {
public void windowClosed (WindowEvent event) {
System.exit(0);
}
});
initializeComponents();
pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setVisible(true);
}
private void initializeComponents () {
//Create the menu bar.
JMenuBar menuBar = new JMenuBar();
//Build the first menu.
JMenu menu = new JMenu("File");
menuBar.add(menu);
//a group of JMenuItems
JMenuItem menuItem = new JMenuItem("Open");
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent arg0) {
open();
}
});
menu.add(menuItem);
menuItem = new JMenuItem("Save");
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent arg0) {
save();
}
});
menu.add(menuItem);
setJMenuBar(menuBar);
imagePanel = new ImagePanel();
getContentPane().add(imagePanel);
}
protected void save () {
FileDialog dialog = new FileDialog(this, "Save Image", FileDialog.SAVE);
if (lastDir != null) dialog.setDirectory(lastDir);
dialog.setVisible(true);
final String file = dialog.getFile();
final String dir = dialog.getDirectory();
if (dir == null || file == null || file.trim().length() == 0) return;
lastDir = dir;
try {
generatePremultiplyAlpha(new File(dir, file));
JOptionPane.showMessageDialog(this, "Conversion complete!");
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, "Error saving image.");
return;
}
}
protected void open () {
FileDialog dialog = new FileDialog(this, "Open Image", FileDialog.LOAD);
if (lastDir != null) dialog.setDirectory(lastDir);
dialog.setVisible(true);
final String file = dialog.getFile();
final String dir = dialog.getDirectory();
if (dir == null || file == null || file.trim().length() == 0) return;
lastDir = dir;
try {
image = ImageIO.read(new File(dir, file));
imagePanel.setImage(image);
imagePanel.revalidate();
imagePanel.repaint();
pack();
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, "Error opening image.");
return;
}
}
private void generatePremultiplyAlpha(File out){
try {
BufferedImage outImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
float[] color = new float[4];
WritableRaster raster = image.getRaster();
WritableRaster outRaster = outImage.getRaster();
for(int x =0, w = image.getWidth(); x< w; ++x)
for(int y =0, h = image.getHeight(); y< h; ++y){
raster.getPixel(x, y, color);
float alpha = color[3]/255f;
for(int i=0;i < 3; ++i)
color[i] *= alpha;
outRaster.setPixel(x, y, color);
}
ImageIO.write(outImage, "png", out);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main (String[] args) {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
try {
UIManager.setLookAndFeel(info.getClassName());
} catch (Throwable ignored) {
}
break;
}
}
EventQueue.invokeLater(new Runnable() {
public void run () {
new PreAlpha();
}
});
}
}