package com.gmail.dpierron.calibre.opds;
import com.gmail.dpierron.tools.i18n.Localization;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
public class ImageFile {
private final static Logger logger = LogManager.getLogger(ImageFile.class);
public static final int VERTICAL = 0;
public static final int HORIZONTAL = 1;
public static final String IMAGE_JPEG = "jpeg";
public static final String IMAGE_JPG = "jpg";
public static final String IMAGE_PNG = "png";
private ImageIcon image;
private ImageIcon thumb;
public ImageFile(String fileName) {
image = new ImageIcon(fileName);
if (!isImageLoaded()) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// I don't give a tiny rat's ass
}
if (!isImageLoaded())
CatalogManager.callback.errorOccured(Localization.Main.getText("error.loadingImage", fileName), null);
}
}
public boolean isImageLoaded() {
return (image != null && image.getImageLoadStatus() == MediaTracker.COMPLETE);
}
public Image getImage(int size, int dir) {
if (dir == HORIZONTAL) {
thumb = new ImageIcon(image.getImage().getScaledInstance(size, -1, Image.SCALE_SMOOTH));
} else {
thumb = new ImageIcon(image.getImage().getScaledInstance(-1, size, Image.SCALE_SMOOTH));
}
return thumb.getImage();
}
public void saveImage(File file, String imageType) {
if (thumb != null) {
BufferedImage bi = new BufferedImage(thumb.getIconWidth(), thumb.getIconHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = bi.getGraphics();
g.drawImage(thumb.getImage(), 0, 0, null);
int nbTries = 20;
Exception exception = null;
while (nbTries > 0) {
boolean error = false;
try {
ImageIO.write(bi, imageType, file);
} catch (Exception e) {
String msg = "error occurred while writing image " + file.getName() + " - trying again (" + (nbTries) + " remaining)";
if (nbTries < 10)
logger.warn(msg, e);
else
logger.debug(msg, e);
if (exception == null)
exception = e;
error = true;
}
if (!error) {
nbTries = 0;
exception = null;
} else {
nbTries--;
try {
Thread.sleep(10); // wait 10ms
} catch (InterruptedException e) {
// I don't give a tiny rat's ass
}
}
}
if (exception != null)
CatalogManager.callback.errorOccured(Localization.Main.getText("error.savingImage", file.getAbsolutePath()), exception);
} else {
CatalogManager.callback.errorOccured(Localization.Main.getText("error.generatingImage", file.getAbsolutePath()), null);
}
}
}