package org.ebookdroid.core;
import org.ebookdroid.core.models.ZoomModel;
public class PageTreeLevel {
public static final int ZOOM_THRESHOLD = 2;
public static final PageTreeLevel ROOT;
public static final PageTreeLevel[] LEVELS;
public static final int NODES;
static {
int count = 1 + (int) Math.ceil(Math.log(ZoomModel.MAX_ZOOM) / Math.log(2));
ROOT = new PageTreeLevel(count);
LEVELS = new PageTreeLevel[count];
LEVELS[0] = ROOT;
int end = ROOT.end;
int index = 1;
for (PageTreeLevel l = ROOT.next; l != null; l = l.next) {
LEVELS[index++] = l;
end = l.end;
}
NODES = end;
}
public final int level;
public final float zoom;
public final int start;
public final int end;
public final PageTreeLevel prev;
public final PageTreeLevel next;
private PageTreeLevel(int count) {
this.level = 0;
this.zoom = ZoomModel.MIN_ZOOM;
this.start = 0;
this.end = 1;
this.prev = null;
this.next = new PageTreeLevel(this, count - 1);
}
private PageTreeLevel(final PageTreeLevel parent, int count) {
this.level = parent.level + 1;
this.zoom = parent.zoom * ZOOM_THRESHOLD;
this.start = parent.end;
this.end = this.start + (int) Math.pow(PageTree.splitMasks.length, this.level);
this.prev = parent;
this.next = count > 1 ? new PageTreeLevel(this, count - 1) : null;
}
public static PageTreeLevel getLevel(float zoom) {
for (int i = 1; i < LEVELS.length; i++) {
if (zoom < LEVELS[i].zoom) {
return LEVELS[i - 1];
} else if (zoom == LEVELS[i].zoom) {
return LEVELS[i];
}
}
return LEVELS[LEVELS.length - 1];
}
}