Separate out the modes of the recolor tool. There are now three modes - Using Color Class (old All Colorizations mode), Multi-Color (Specify up to 4 recolors), and Manual Recolor (old specifying target color, offsets manually mode).

git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@900 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
Mike Thomas
2010-03-10 21:41:41 +00:00
parent 490dcdfd2b
commit ba3be78a51
@@ -24,6 +24,7 @@ package com.threerings.media.tools;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
@@ -50,8 +51,8 @@ import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.JSlider; import javax.swing.JSlider;
import javax.swing.JTabbedPane;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
@@ -66,6 +67,7 @@ import com.samskivert.swing.util.SwingUtil;
import com.threerings.media.image.ColorPository; import com.threerings.media.image.ColorPository;
import com.threerings.media.image.Colorization; import com.threerings.media.image.Colorization;
import com.threerings.media.image.ImageUtil; import com.threerings.media.image.ImageUtil;
import com.threerings.media.image.ColorPository.ClassRecord;
import com.threerings.media.image.ColorPository.ColorRecord; import com.threerings.media.image.ColorPository.ColorRecord;
import com.threerings.media.image.tools.xml.ColorPositoryParser; import com.threerings.media.image.tools.xml.ColorPositoryParser;
@@ -103,7 +105,6 @@ public class RecolorImage extends JPanel
file.add(reload, HGroupLayout.FIXED); file.add(reload, HGroupLayout.FIXED);
add(file, VGroupLayout.FIXED); add(file, VGroupLayout.FIXED);
// Colorization file
JPanel colFile = new JPanel(new HGroupLayout(HGroupLayout.STRETCH)); JPanel colFile = new JPanel(new HGroupLayout(HGroupLayout.STRETCH));
colFile.add(new JLabel("Colorize file:"), HGroupLayout.FIXED); colFile.add(new JLabel("Colorize file:"), HGroupLayout.FIXED);
colFile.add(_colFilePath = new JTextField()); colFile.add(_colFilePath = new JTextField());
@@ -114,22 +115,47 @@ public class RecolorImage extends JPanel
colFile.add(browse, HGroupLayout.FIXED); colFile.add(browse, HGroupLayout.FIXED);
add(colFile, VGroupLayout.FIXED); add(colFile, VGroupLayout.FIXED);
JPanel colMode = new JPanel(new HGroupLayout(HGroupLayout.STRETCH)); _tabs = new JTabbedPane();
colMode.add(_mode = new JToggleButton("All Colorizations")); _tabs.addChangeListener(new ChangeListener() {
colMode.add(_classList = new JComboBox()); public void stateChanged (ChangeEvent event) {
convert();
}
});
add(_tabs, VGroupLayout.FIXED);
// Colorization file
JPanel byFile = new JPanel(new VGroupLayout(VGroupLayout.STRETCH));
_tabs.addTab("Using Color Class", byFile);
byFile.add(_classList = new JComboBox());
byFile.add(_labelColors = new JCheckBox("Label Colorizations"), VGroupLayout.FIXED);
ActionListener al = new ActionListener() { ActionListener al = new ActionListener() {
public void actionPerformed (ActionEvent ae) { public void actionPerformed (ActionEvent ae) {
convert(); convert();
} }
}; };
_mode.addActionListener(al);
_classList.addActionListener(al); _classList.addActionListener(al);
add(colMode, VGroupLayout.FIXED); // Specific colors
JPanel multiColor = new JPanel(new GridLayout(4, 2));
_tabs.addTab("Multi-Color", multiColor);
multiColor.add(_classList1 = new JComboBox());
multiColor.add(_colorList1 = new JComboBox());
multiColor.add(_classList2 = new JComboBox());
multiColor.add(_colorList2 = new JComboBox());
multiColor.add(_classList3 = new JComboBox());
multiColor.add(_colorList3 = new JComboBox());
multiColor.add(_classList4 = new JComboBox());
multiColor.add(_colorList4 = new JComboBox());
_colorList1.addActionListener(al);
_colorList2.addActionListener(al);
_colorList3.addActionListener(al);
_colorList4.addActionListener(al);
add(_labelColors = new JCheckBox("Label Colorizations"), VGroupLayout.FIXED);
_labelColors.addActionListener(al); _labelColors.addActionListener(al);
JPanel specRecolor = new JPanel(new VGroupLayout(VGroupLayout.STRETCH));
_tabs.addTab("Manual Recolor", specRecolor);
JPanel controls = new JPanel(new HGroupLayout(HGroupLayout.STRETCH)); JPanel controls = new JPanel(new HGroupLayout(HGroupLayout.STRETCH));
controls.add(new JLabel("Source color:"), HGroupLayout.FIXED); controls.add(new JLabel("Source color:"), HGroupLayout.FIXED);
controls.add(_source = new JTextField("FF0000")); controls.add(_source = new JTextField("FF0000"));
@@ -143,7 +169,7 @@ public class RecolorImage extends JPanel
update.setActionCommand(UPDATE_TARGET_COLOR); update.setActionCommand(UPDATE_TARGET_COLOR);
update.addActionListener(this); update.addActionListener(this);
controls.add(update, HGroupLayout.FIXED); controls.add(update, HGroupLayout.FIXED);
add(controls, VGroupLayout.FIXED); specRecolor.add(controls, VGroupLayout.FIXED);
HGroupLayout hlay = new HGroupLayout(HGroupLayout.STRETCH); HGroupLayout hlay = new HGroupLayout(HGroupLayout.STRETCH);
JPanel dists = new JPanel(hlay); JPanel dists = new JPanel(hlay);
@@ -151,7 +177,7 @@ public class RecolorImage extends JPanel
dists.add(_hueD = new SliderAndLabel(0.0f, 1.0f, 0.05f)); dists.add(_hueD = new SliderAndLabel(0.0f, 1.0f, 0.05f));
dists.add(_saturationD = new SliderAndLabel(0.0f, 1.0f, 0.8f)); dists.add(_saturationD = new SliderAndLabel(0.0f, 1.0f, 0.8f));
dists.add(_valueD = new SliderAndLabel(0.0f, 1.0f, 0.6f)); dists.add(_valueD = new SliderAndLabel(0.0f, 1.0f, 0.6f));
add(dists, VGroupLayout.FIXED); specRecolor.add(dists, VGroupLayout.FIXED);
hlay = new HGroupLayout(HGroupLayout.STRETCH); hlay = new HGroupLayout(HGroupLayout.STRETCH);
JPanel offsets = new JPanel(hlay); JPanel offsets = new JPanel(hlay);
@@ -159,7 +185,7 @@ public class RecolorImage extends JPanel
offsets.add(_hueO = new SliderAndLabel(-1.0f, 1.0f, 0.1f)); offsets.add(_hueO = new SliderAndLabel(-1.0f, 1.0f, 0.1f));
offsets.add(_saturationO = new SliderAndLabel(-1.0f, 1.0f, 0.0f)); offsets.add(_saturationO = new SliderAndLabel(-1.0f, 1.0f, 0.0f));
offsets.add(_valueO = new SliderAndLabel(-1.0f, 1.0f, 0.0f)); offsets.add(_valueO = new SliderAndLabel(-1.0f, 1.0f, 0.0f));
add(offsets, VGroupLayout.FIXED); specRecolor.add(offsets, VGroupLayout.FIXED);
add(_status = new JTextField(), VGroupLayout.FIXED); add(_status = new JTextField(), VGroupLayout.FIXED);
_status.setEditable(false); _status.setEditable(false);
@@ -202,14 +228,35 @@ public class RecolorImage extends JPanel
// obtain the target color and offset // obtain the target color and offset
try { try {
BufferedImage image; BufferedImage image;
if (_mode.isSelected()) { if (_tabs.getSelectedIndex() == 0) {
// All recolorings from file. // All recolorings from file.
image = getAllRecolors(_labelColors.isSelected()); image = getAllRecolors(_labelColors.isSelected());
if (image == null) { if (image == null) {
return; return;
} }
} else if (_tabs.getSelectedIndex() == 1) {
ArrayList<Colorization> zations = Lists.newArrayList();
if (_classList1.getSelectedItem() != NONE) {
zations.add(_colRepo.getColorization((String)_classList1.getSelectedItem(),
(String)_colorList1.getSelectedItem()));
}
if (_classList2.getSelectedItem() != NONE) {
zations.add(_colRepo.getColorization((String)_classList2.getSelectedItem(),
(String)_colorList2.getSelectedItem()));
}
if (_classList3.getSelectedItem() != NONE) {
zations.add(_colRepo.getColorization((String)_classList3.getSelectedItem(),
(String)_colorList3.getSelectedItem()));
}
if (_classList4.getSelectedItem() != NONE) {
zations.add(_colRepo.getColorization((String)_classList4.getSelectedItem(),
(String)_colorList4.getSelectedItem()));
}
image = ImageUtil.recolorImage(_image,
zations.toArray(new Colorization[zations.size()]));
} else { } else {
// Normal recoloring // Manual recoloring
int color = Integer.parseInt(_source.getText(), 16); int color = Integer.parseInt(_source.getText(), 16);
float hueD = _hueD.getValue(); float hueD = _hueD.getValue();
@@ -327,6 +374,17 @@ public class RecolorImage extends JPanel
} }
} }
public void setupColors (JComboBox box, String className)
{
box.removeAllItems();
if (className != null && className != NONE) {
ClassRecord classRec = _colRepo.getClassRecord(className);
for (ColorRecord color : classRec.colors.values()) {
box.addItem(color.name);
}
}
}
/** /**
* Loads up the colorization classes from the specified file. * Loads up the colorization classes from the specified file.
*/ */
@@ -341,6 +399,30 @@ public class RecolorImage extends JPanel
} }
_classList.removeAllItems(); _classList.removeAllItems();
_classList1.removeAllItems();
_classList1.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent event) {
setupColors(_colorList1, (String)_classList1.getSelectedItem());
}
});
_classList2.removeAllItems();
_classList2.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent event) {
setupColors(_colorList2, (String)_classList2.getSelectedItem());
}
});
_classList3.removeAllItems();
_classList3.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent event) {
setupColors(_colorList3, (String)_classList3.getSelectedItem());
}
});
_classList4.removeAllItems();
_classList4.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent event) {
setupColors(_colorList4, (String)_classList4.getSelectedItem());
}
});
Iterator<ColorPository.ClassRecord> iter = _colRepo.enumerateClasses(); Iterator<ColorPository.ClassRecord> iter = _colRepo.enumerateClasses();
ArrayList<String> names = Lists.newArrayList(); ArrayList<String> names = Lists.newArrayList();
while (iter.hasNext()) { while (iter.hasNext()) {
@@ -348,12 +430,25 @@ public class RecolorImage extends JPanel
names.add(str); names.add(str);
} }
_classList1.addItem(NONE);
_classList2.addItem(NONE);
_classList3.addItem(NONE);
_classList4.addItem(NONE);
Collections.sort(names); Collections.sort(names);
for (String name : names) { for (String name : names) {
_classList.addItem(name); _classList.addItem(name);
_classList1.addItem(name);
_classList2.addItem(name);
_classList3.addItem(name);
_classList4.addItem(name);
} }
_classList.setSelectedIndex(0); _classList.setSelectedIndex(0);
_classList1.setSelectedIndex(0);
_classList2.setSelectedIndex(0);
_classList3.setSelectedIndex(0);
_classList4.setSelectedIndex(0);
_colFilePath.setText(path.getPath()); _colFilePath.setText(path.getPath());
CONFIG.setValue(LAST_COLORIZATION_KEY, path.getAbsolutePath()); CONFIG.setValue(LAST_COLORIZATION_KEY, path.getAbsolutePath());
@@ -472,9 +567,18 @@ public class RecolorImage extends JPanel
protected JTextField _status; protected JTextField _status;
protected JComboBox _classList; protected JComboBox _classList;
protected JToggleButton _mode; protected JComboBox _classList1;
protected JComboBox _classList2;
protected JComboBox _classList3;
protected JComboBox _classList4;
protected JComboBox _colorList1;
protected JComboBox _colorList2;
protected JComboBox _colorList3;
protected JComboBox _colorList4;
protected JCheckBox _labelColors; protected JCheckBox _labelColors;
protected JTabbedPane _tabs;
protected ColorPository _colRepo; protected ColorPository _colRepo;
protected static final String IMAGE_PATH = protected static final String IMAGE_PATH =
@@ -492,6 +596,8 @@ public class RecolorImage extends JPanel
protected static final PrefsConfig CONFIG = protected static final PrefsConfig CONFIG =
new PrefsConfig("rsrc/config/threerings/recolorimage"); new PrefsConfig("rsrc/config/threerings/recolorimage");
protected static final String NONE = "<none>";
/** Keys for our preferences. */ /** Keys for our preferences. */
protected static final String LAST_IMAGE_KEY = "last_image"; protected static final String LAST_IMAGE_KEY = "last_image";
protected static final String LAST_COLORIZATION_KEY = "last_colorization"; protected static final String LAST_COLORIZATION_KEY = "last_colorization";