Subversion Repositories mkgmap

Rev

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