package org.ebookdroid.core.codec;
import org.ebookdroid.common.settings.AppSettings;
import org.ebookdroid.ui.viewer.ViewerActivity;
import android.graphics.Bitmap;
import java.lang.reflect.Field;
import java.util.concurrent.atomic.AtomicLong;
public abstract class AbstractCodecContext implements CodecContext {
private static final AtomicLong SEQ = new AtomicLong();
private static Integer densityDPI;
final int supportedFeatures;
private long contextHandle;
/**
* Constructor.
*
* @param supportedFeatures
* supported features list
*/
protected AbstractCodecContext(final int supportedFeatures) {
this(SEQ.incrementAndGet(), supportedFeatures);
}
/**
* Constructor.
*
* @param contextHandle
* contect handler
*/
protected AbstractCodecContext(final long contextHandle, final int supportedFeatures) {
this.contextHandle = contextHandle;
this.supportedFeatures = supportedFeatures;
}
@Override
protected final void finalize() throws Throwable {
recycle();
super.finalize();
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.core.codec.CodecContext#recycle()
*/
@Override
public final void recycle() {
if (!isRecycled()) {
freeContext();
contextHandle = 0;
}
}
protected void freeContext() {
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.core.codec.CodecContext#isRecycled()
*/
@Override
public final boolean isRecycled() {
return contextHandle == 0;
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.core.codec.CodecContext#getContextHandle()
*/
@Override
public final long getContextHandle() {
return contextHandle;
}
@Override
public boolean isFeatureSupported(final int feature) {
return (supportedFeatures & feature) != 0;
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.core.codec.CodecContext#getBitmapConfig()
*/
@Override
public Bitmap.Config getBitmapConfig() {
return Bitmap.Config.ARGB_8888;
}
public static int getWidthInPixels(final float pdfWidth) {
return getSizeInPixels(pdfWidth, AppSettings.current().getXDpi(ViewerActivity.DM.xdpi));
}
public static int getHeightInPixels(final float pdfHeight) {
return getSizeInPixels(pdfHeight, AppSettings.current().getYDpi(ViewerActivity.DM.ydpi));
}
public static int getSizeInPixels(final float pdfHeight, float dpi) {
if (dpi == 0) {
// Archos fix
dpi = getDensityDPI();
}
if (dpi < 72) { // Density lover then 72 is to small
dpi = 72; // Set default density to 72
}
return (int) (pdfHeight * dpi / 72);
}
private static int getDensityDPI() {
if (densityDPI == null) {
try {
final Field f = ViewerActivity.DM.getClass().getDeclaredField("densityDpi");
densityDPI = ((Integer) f.get(ViewerActivity.DM));
} catch (final Throwable ex) {
densityDPI = Integer.valueOf(120);
}
}
return densityDPI.intValue();
}
}