/*
* Copyright (C) 2016 Patrick Favre-Bulle
*
* 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 at.favre.tools.dconvert.converters;
import at.favre.tools.dconvert.arg.Arguments;
import at.favre.tools.dconvert.arg.EScaleMode;
import at.favre.tools.dconvert.arg.ImageType;
import at.favre.tools.dconvert.converters.descriptors.DensityDescriptor;
import at.favre.tools.dconvert.converters.scaling.ImageHandler;
import at.favre.tools.dconvert.util.DensityBucketUtil;
import at.favre.tools.dconvert.util.ImageUtil;
import at.favre.tools.dconvert.util.LoadedImage;
import at.favre.tools.dconvert.util.MiscUtil;
import java.awt.*;
import java.io.File;
import java.util.*;
import java.util.List;
/**
* The main logic of all platform converters
*/
public abstract class APlatformConverter<T extends DensityDescriptor> implements IPlatformConverter {
@Override
public Result convert(File srcImage, Arguments args) {
try {
File destinationFolder = args.dst;
LoadedImage imageData = ImageUtil.loadImage(srcImage);
String targetImageFileName = MiscUtil.getFileNameWithoutExtension(srcImage);
ImageType imageType = Arguments.getImageType(srcImage);
boolean isNinePatch = AndroidConverter.isNinePatch(srcImage) && getClass() == AndroidConverter.class;
StringBuilder log = new StringBuilder();
log.append(getConverterName()).append(": ").append(targetImageFileName).append(" ")
.append(imageData.getImage().getWidth()).append("x").append(imageData.getImage().getHeight()).append(" (").append(args.scale).append(args.scaleMode == EScaleMode.FACTOR ? "x" : "dp").append(")\n");
Map<T, Dimension> densityMap = DensityBucketUtil.getDensityBuckets(usedOutputDensities(args), new Dimension(imageData.getImage().getWidth(), imageData.getImage().getHeight()), args, args.scale, isNinePatch);
File mainSubFolder = createMainSubFolder(destinationFolder, targetImageFileName, args);
onPreExecute(mainSubFolder, targetImageFileName, usedOutputDensities(args), imageType, args);
List<File> allResultingFiles = new ArrayList<>();
for (Map.Entry<T, Dimension> entry : densityMap.entrySet()) {
File dstFolder = createFolderForOutputFile(mainSubFolder, entry.getKey(), entry.getValue(), targetImageFileName, args);
if ((dstFolder.isDirectory() && dstFolder.exists()) || args.dryRun) {
File imageFile = new File(dstFolder, createDestinationFileNameWithoutExtension(entry.getKey(), entry.getValue(), targetImageFileName, args));
log.append("process ").append(imageFile).append(" with ").append(entry.getValue().width).append("x").append(entry.getValue().height).append(" (x")
.append(entry.getKey().scale).append(") ").append(isNinePatch ? "(9-patch)" : "").append("\n");
if (!args.dryRun) {
List<File> files = new ImageHandler(args).saveToFile(imageFile, imageData, entry.getValue(), isNinePatch);
allResultingFiles.addAll(files);
for (File file : files) {
log.append("compressed to disk: ").append(file).append(" (").append(String.format(Locale.US, "%.2f", (float) file.length() / 1024f)).append("kB)\n");
}
if (files.isEmpty()) {
log.append("files skipped\n");
}
}
} else {
throw new IllegalStateException("could not create " + dstFolder);
}
}
onPostExecute(args);
imageData.getImage().flush();
return new Result(log.toString(), allResultingFiles);
} catch (Exception e) {
e.printStackTrace();
return new Result(null, e, Collections.emptyList());
}
}
public abstract List<T> usedOutputDensities(Arguments arguments);
public abstract String getConverterName();
public abstract File createMainSubFolder(File destinationFolder, String targetImageFileName, Arguments arguments);
public abstract File createFolderForOutputFile(File mainSubFolder, T density, Dimension dimension, String targetFileName, Arguments arguments);
public abstract String createDestinationFileNameWithoutExtension(T density, Dimension dimension, String targetFileName, Arguments arguments);
public abstract void onPreExecute(File dstFolder, String targetFileName, List<T> densityDescriptions, ImageType imageType, Arguments arguments) throws Exception;
public abstract void onPostExecute(Arguments arguments);
}