/* * 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; } }