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