Subversion Repositories mkgmap

Rev

Rev 2630 | 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 java.io.IOException;
import java.io.OutputStream;

import uk.me.parabola.imgfmt.app.Coord;
import uk.me.parabola.imgfmt.app.ImgFileWriter;
import uk.me.parabola.imgfmt.app.lbl.POIRecord;

/**
 * Represents a particular point object on a map.  A point has a type (town
 * restaurant etc) and a location as well as a name.
 *
 * A point belongs to a particular subdivision and cannot be interpreted without
 * it as all details are relative to the subdivision.
 *
 * @author Steve Ratcliffe
 */

public class Point extends MapObject {
        // Points can link to a POIRecord
        private POIRecord poi;

        public Point(Subdivision div) {
                setSubdiv(div);
        }

        /**
         * Format and write the contents of the object to the given
         * file.
         *
         * @param file A reference to the file that should be written to.
         */

        public void write(ImgFileWriter file) {
                boolean hasSubtype = false;
                int type = getType();
                byte subtype = 0;
                if (type > 0xff) {
                        if((type & 0xff) != 0) {
                            hasSubtype = true;
                            subtype = (byte) type;
                        }
                        type >>= 8;
                }

                file.put((byte) type);

                int off = getLabel().getOffset();
                if (poi != null) {
                        off = poi.getOffset();
                        off |= 0x400000;
                }
                if (hasSubtype)
                        off |= 0x800000;

                file.put3(off);
                file.putChar((char) getDeltaLong());
                file.putChar((char) getDeltaLat());
                if (hasSubtype)
                        file.put(subtype);
        }

        /*
         * write the point to an OutputStream - only use for outputting
         * points with extended (3 byte) types.
         *
         */

        public void write(OutputStream stream) throws IOException {
                assert hasExtendedType();
                int type = getType();
                int labelOff = getLabel().getOffset();
                byte[] extraBytes = getExtTypeExtraBytes();

                if (poi != null) {
                        labelOff = poi.getOffset();
                        labelOff |= 0x400000;
                }
                if(labelOff != 0)
                        type |= 0x20;           // has label
                if(extraBytes != null)
                        type |= 0x80;           // has extra bytes
                stream.write(type >> 8);
                stream.write(type);

                int deltaLong = getDeltaLong();
                int deltaLat = getDeltaLat();
                stream.write(deltaLong);
                stream.write(deltaLong >> 8);
                stream.write(deltaLat);
                stream.write(deltaLat >> 8);

                if(labelOff != 0) {
                        stream.write(labelOff);
                        stream.write(labelOff >> 8);
                        stream.write(labelOff >> 16);
                }

                if(extraBytes != null)
                        stream.write(extraBytes);
        }

        public void setPOIRecord(POIRecord poirecord) {
                this.poi = poirecord;
        }

        public POIRecord getPOIRecord() {
                if (poi == null)
                        return new POIRecord();
                return poi;
        }

        public Coord getLocation() {
                int shift = getSubdiv().getShift();
                Coord co = new Coord(getSubdiv().getLatitude() + (getDeltaLat() << shift),
                                getSubdiv().getLongitude() + (getDeltaLong() << shift) );
                return co;
        }
}