Rev 3408 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
* Copyright (C) 2006 Steve Ratcliffe
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* Author: Steve Ratcliffe
* Create date: 09-Dec-2006
*/
package uk.me.parabola.imgfmt.app.trergn;
import uk.me.parabola.imgfmt.app.ImgFileWriter;
/**
* This is for polyline, polygon and point overviews. A simple record that
* holds the type of an object and the highest level at which it is found.
*
* It kind of declares which objects will appear in the map and if they
* are not included here they will not be shown.
*
* @author Steve Ratcliffe
*/
public abstract class Overview
implements Comparable<Overview
> {
public static final int POINT_KIND =
1;
public static final int LINE_KIND =
2;
public static final int SHAPE_KIND =
3;
private final int kind
; // The kind of overview; point, line etc.
private final char extType
;
private final char type
;
private final char subType
;
private final int minResolution
;
private final int size
;
private int maxLevel
;
protected Overview
(int kind,
int fullType,
int minres
) {
this.
kind = kind
;
this.
extType =
(char)((fullType
>> 16) & 0xff
);
this.
type =
(char) (fullType
>> 8 & 0xff
);
this.
subType =
(char) (fullType
& 0xff
);
this.
minResolution = minres
;
if (kind == POINT_KIND
)
size =
3;
else
size =
2;
}
public void write
(ImgFileWriter file
) {
if (extType ==
0) {
file.
put((byte) (type
& 0xff
));
file.
put((byte) maxLevel
);
if (size
> 2)
file.
put((byte) (subType
& 0xff
));
} else {
file.
put((byte) type
);
file.
put((byte) maxLevel
);
file.
put((byte) subType
);
file.
put((byte) 0);
}
}
/**
* Returns a hash code value for the object.
*
* @return a hash code value for this object.
* @see Object#equals(Object)
*/
public int hashCode
() {
return (kind
<< 7) +
(type
<< 3) + subType
;
}
/**
* Indicates whether some other object is "equal to" this one.
*
* @param obj the reference object with which to compare.
* @return <code>true</code> if this object is the same as the obj
* argument; <code>false</code> otherwise.
* @see #hashCode()
*/
public boolean equals
(Object obj
) {
if (!(obj
instanceof Overview
))
return false;
Overview ov =
(Overview
) obj
;
return (ov.
kind == kind
&&
ov.
extType == extType
&&
ov.
type == type
&&
ov.
subType == subType
);
}
public int getKind
() {
return kind
;
}
/**
* Compares this object with the specified object for order. Returns a
* negative integer, zero, or a positive integer as this object is less
* than, equal to, or greater than the specified object.
*
* @param ov the object to be compared.
* @return a negative integer, zero, or a positive integer as this object
* is less than, equal to, or greater than the specified object.
* @throws ClassCastException if the specified object's type prevents it
* from being compared to this object.
*/
public int compareTo
(Overview ov
) {
if (kind
!= ov.
kind) {
return kind
> ov.
kind ? 1 : -
1;
}
if(extType
!= ov.
extType) {
return extType
> ov.
extType? 1: -
1;
}
int res
;
if (type == ov.
type) {
if (subType == ov.
subType)
res =
0;
else if (subType
> ov.
subType)
res =
1;
else
res = -
1;
} else {
if (type == ov.
type)
res =
0;
else if (type
> ov.
type)
res =
1;
else
res = -
1;
}
return res
;
}
public void setMaxLevel
(int maxLevel
) {
this.
maxLevel = maxLevel
;
}
public int getMinResolution
() {
return minResolution
;
}
public boolean hasExtType
() {
return extType
!=
0;
}
}