package com.marshalchen.common.uimodule.tileView.tileview.detail;
import android.graphics.Rect;
import com.marshalchen.common.uimodule.tileView.tileview.tiles.Tile;
import java.util.LinkedList;
public class DetailLevel implements Comparable<DetailLevel> {
private static final int DEFAULT_TILE_SIZE = 256;
private double scale;
private int tileWidth = DEFAULT_TILE_SIZE;
private int tileHeight = DEFAULT_TILE_SIZE;
private String pattern;
private String downsample;
private DetailManager detailManager;
private Rect viewport = new Rect();
public DetailLevel( DetailManager zm, float s, String p, String d, int tw, int th ) {
detailManager = zm;
scale = s;
pattern = p;
downsample = d;
tileWidth = tw;
tileHeight = th;
}
public DetailLevel( DetailManager zm, float s, String p, String d ) {
this( zm, s, p, d, DEFAULT_TILE_SIZE, DEFAULT_TILE_SIZE );
}
public LinkedList<Tile> getIntersections() {
double relativeScale = getRelativeScale();
int drawableWidth = (int) ( detailManager.getWidth() * getScale() * relativeScale );
int drawableHeight = (int) ( detailManager.getHeight() * getScale() * relativeScale );
double offsetWidth = ( tileWidth * relativeScale );
double offsetHeight = ( tileHeight * relativeScale );
LinkedList<Tile> intersections = new LinkedList<Tile>();
viewport.set( detailManager.getComputedViewport() );
// TODO test if mins are right
viewport.top = Math.max( viewport.top, 0 );
viewport.left = Math.max( viewport.left, 0 );
viewport.right = Math.min( viewport.right, drawableWidth );
viewport.bottom = Math.min( viewport.bottom, drawableHeight );
int startingRow = (int) Math.floor( viewport.top / offsetHeight );
int endingRow = (int) Math.ceil( viewport.bottom / offsetHeight );
int startingColumn = (int) Math.floor( viewport.left / offsetWidth );
int endingColumn = (int) Math.ceil( viewport.right / offsetWidth );
DetailLevelPatternParser parser = detailManager.getDetailLevelPatternParser();
for ( int iterationRow = startingRow; iterationRow < endingRow; iterationRow++ ) {
for ( int iterationColumn = startingColumn; iterationColumn < endingColumn; iterationColumn++ ) {
String fileName = parser.parse( pattern, iterationRow, iterationColumn );
int left = iterationColumn * tileWidth;
int top = iterationRow * tileHeight;
Tile tile = new Tile( left, top, tileWidth, tileHeight, fileName );
intersections.add( tile );
}
}
return intersections;
}
public double getScale(){
return scale;
}
public double getRelativeScale(){
return detailManager.getScale() / scale;
}
public int getTileWidth() {
return tileWidth;
}
public int getTileHeight() {
return tileHeight;
}
public String getPattern() {
return pattern;
}
public String getDownsample() {
return downsample;
}
@Override
public int compareTo( DetailLevel o ) {
return (int) Math.signum( getScale() - o.getScale() );
}
@Override
public boolean equals( Object o ) {
if ( o instanceof DetailLevel ) {
DetailLevel zl = (DetailLevel) o;
return ( zl.getScale() == getScale() );
}
return false;
}
@Override
public int hashCode() {
long bits = ( Double.doubleToLongBits( getScale() ) * 43 );
return ( ( (int) bits ) ^ ( (int) ( bits >> 32 ) ) );
}
}