/**
*
*/
package de.danielsenff.badds.controller;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Vector;
import javax.swing.JOptionPane;
import jogl.DDSImage;
import model.AbstractTextureImage;
import model.DDSFile;
import ddsutil.DDSUtil;
import ddsutil.NonCubicDimensionException;
import ddsutil.PixelFormats;
import de.danielsenff.badds.model.ExportOptions;
import de.danielsenff.badds.operations.ChannelBrightness;
import de.danielsenff.badds.operations.Operation;
import de.danielsenff.badds.operations.ScaleOperation;
import de.danielsenff.badds.util.FileHelper;
import de.danielsenff.badds.view.View;
import de.danielsenff.badds.view.worker.FileProgressDialog;
/**
* @author danielsenff
*
*/
public class SaveOperationWorker extends OperationWorker {
int newWidth;
int newHeight;
int pixelformat;
boolean hasGeneratedMipMaps;
private Vector<DDSFile> files;
private boolean makeBackup;
private Collection<Operation> operations;
private boolean keepOriginal;
/**
* @param view
* @param openFiles
* @param defaultListModel
* @param exportOptions
* @param operations
*/
public SaveOperationWorker(View view,
Vector<DDSFile> openFiles,
ExportOptions exportOptions,
final Collection<Operation> operations) {
super(view, openFiles.size());
this.files = openFiles;
this.operations = operations;
initExportValues(exportOptions);
}
/**
* @param exportOptions
*
*/
private void initExportValues(ExportOptions exportOptions) {
this.newWidth = exportOptions.getNewWidth();
this.newHeight = exportOptions.getNewHeight();
this.pixelformat = exportOptions.getNewPixelformat();
this.hasGeneratedMipMaps = exportOptions.hasGeneratedMipMaps();
this.makeBackup = exportOptions.isMakeBackup();
this.keepOriginal = exportOptions.isKeepOriginal();
operations.add(new ScaleOperation(newWidth, newHeight));
if(pixelformat == DDSImage.D3DFMT_DXT1 && exportOptions.isPaintWhiteAlpha()) {
operations.add(new ChannelBrightness(3, 1.0f));
}
System.out.println("Width: " + newWidth + " Height: " + newHeight);
System.out.println("Pixelformat: " + PixelFormats.verbosePixelformat(pixelformat) + " with MipMaps " + hasGeneratedMipMaps);
}
@Override
@SuppressWarnings("finally")
public Object construct() {
int i = 0;;
for (DDSFile file : files) {
try {
workThroughFile(file, pixelformat, hasGeneratedMipMaps);
files.setElementAt(new DDSFile(file.getAbsolutePath()), i);
view.getOpenFilesTable().invalidate();
setProgressValue(i+1);
} catch (OutOfMemoryError ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(view,
"<html>Error: Out of memory" +
"<br>The operation is aborted. </html>", "Error",
JOptionPane.ERROR_MESSAGE);
break;
}
i++;
}
view.validate();
// startNotification();
return "All done";
}
private void workThroughFile(DDSFile sourceDDS,
int pixelformat,
boolean hasGeneratedMipMaps)
throws OutOfMemoryError {
((FileProgressDialog)dialog).setFilename(sourceDDS.getFile().getName());
DDSFile imagefile;
try {
if(hasGeneratedMipMaps
&& !AbstractTextureImage.isPowerOfTwo(sourceDDS.getWidth())
&& !AbstractTextureImage.isPowerOfTwo(sourceDDS.getHeight()))
throw new NonCubicDimensionException();
imagefile = new DDSFile(sourceDDS.getFile());
imagefile.loadImageData();
BufferedImage bufferedImage = imagefile.getData();
((FileProgressDialog)dialog).setPreview(
bufferedImage.getScaledInstance(150, 150, Image.SCALE_AREA_AVERAGING));
// new PreviewFrame(null,imagefile.getFile().getName(), bufferedImage).setVisible(true);
File targetFile = sourceDDS.getFile();
// create backups
if (makeBackup) {
((FileProgressDialog)dialog).setStatus("Making backup ...");
FileHelper.createBackups(sourceDDS.getFile(), File.separator + "Backup");
if(keepOriginal) {
// keep original and create file in subfolder
File workdir = new File(sourceDDS.getFile().getAbsoluteFile().getParent());
File subDir = new File(workdir.getAbsolutePath()+ File.separator + "Scaled_DDS");
subDir.mkdir();
targetFile = new File(subDir.getAbsolutePath() + File.separator + sourceDDS.getFile().getName());
}
}
if (pixelformat == 0) { // keep original format
pixelformat = imagefile.getPixelformat();
}
((FileProgressDialog)dialog).setStatus("Pixel operations ...");
// long mem0 = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
// System.out.println(mem0);
BufferedImage bidata = runOperations(bufferedImage, operations);
((FileProgressDialog)dialog).setStatus("Compressing and saving ...");
// new PreviewFrame(null,imagefile.getFile().getName() + " scaled", bidata).setVisible(true);
DDSUtil.write(targetFile, bidata, pixelformat, hasGeneratedMipMaps);
} catch (IOException ey) {
ey.printStackTrace();
JOptionPane.showMessageDialog(view,
"<html>Error: " + ey.getMessage() +
"<br>"+sourceDDS.getFile().getName()+" will be skipped.</html>", "Error",
JOptionPane.ERROR_MESSAGE);
} catch (IllegalArgumentException ex) {
JOptionPane.showMessageDialog(view,
"<html>Error: " + ex.getMessage() +
"<br>"+sourceDDS.getFile().getName()+" will be skipped.</html>", "Error",
JOptionPane.ERROR_MESSAGE);
}
}
private BufferedImage runOperations(BufferedImage srcbi, Collection<Operation> operations) {
if(!operations.isEmpty()) {
BufferedImage newbi = null;
for (Operation op : operations) {
System.out.println(op);
newbi = op.run(srcbi);
srcbi = newbi;
}
return newbi;
}
return srcbi;
}
/*
private void startNotification() {
Notification.SetFactory("glguerin.notification.imp.mac.ten.TenNotification");
Notification note = Notification.MakeOne();
note.setMarker(true);
note.setIcon(0);
note.setSound(0);
note.setAlert(null);
note.post();
}*/
}