示例#1
0
文件: garmin.c 项目: justinzane/navit
static int
poly_coord_get(void *priv_data, struct coord *c, int count)
{
    struct gobject *g = priv_data;
    struct map_rect_priv *mr = g->priv_data;
    int ndeltas = 0, total = 0;
    struct gcoord dc;

    if (!count)
        return 0;

    if (g != mr->last_itterated) {
        mr->last_itterated = g;
        mr->last_coord = 0;
    }
    ndeltas = gar_get_object_deltas(g);
    if (mr->last_coord > ndeltas + 1)
        return 0;
    while (count --) {
        if (mr->last_coord == 0) {
            gar_get_object_coord(mr->gmap, g, &dc);
            mr->last_c.x = dc.x;
            mr->last_c.y = dc.y;
        } else {
            if (!gar_get_object_dcoord(mr->gmap, g, mr->last_coord - 1, &dc)) {
                mr->last_coord = ndeltas + 2;
                return total;
            }
            mr->last_c.x += dc.x;
            mr->last_c.y += dc.y;
        }
        c->x = mr->last_c.x;
        c->y = mr->last_c.y;
        ddlog(1, "poly: x=%f y=%f\n", GARDEG(c->x), GARDEG(c->y));
//		dlog(1,"poly: x=%d y=%d\n", c->x, c->y);
        c++;
        total++;
        total++;
        mr->last_coord ++;
    }
    return total;
}
示例#2
0
int gar_parse_tdb(struct gar *gar, char *file, int data)
{
	int fd, rc;
	u_int16_t s,t;
	char *buf, *cp, *tp;
	unsigned char *uc;
	struct tdb_block block;
	int version = 0;
	int c;
	int havebase = -1;
	int td4bm = 0;
	float north, south, east, west;
	char imgname[128];
	fd = open(file, (OPENFLAGS&~O_NOATIME));
	if (fd <0) {
		log(1, "Can not open:[%s] errno=%d(%s)\n",
				file, errno, strerror(errno));
		return -1;
	}
	while (read(fd, &block, sizeof(struct tdb_block)) == 
				sizeof(struct tdb_block)) {
		log(11,"Block type: %02X size=%d\n", block.id, block.size);
		buf = malloc(block.size);
		if (!buf) {
			break;
		}
		rc = read(fd, buf, block.size);
		if (rc != block.size)
			break;
		cp = buf;
		switch (block.id) {
			case TDB_HEADER:
				log(1, "ProductID: %d\n", *(u_int16_t *)cp);
				log(1, "MapID: %d\n", *(u_int16_t *)(cp+2));
				log(1, "TDB Version: %.2f\n", (*(u_int16_t *)(cp+4))/100.0);
				version = (*(u_int16_t *)(cp+4))/100.0;
				log(1, "Map Series Name: [%s]\n", cp+16);
				cp+=16+strlen(cp+16) + 1;
				log(1, "Version: %.2f\n", (*(u_int16_t *)cp)/100.0);
				log(1, "Map Family: [%s]\n", cp+2);
				log(11, "Left bytes: %d\n", block.size - (cp - buf));
				if (version != 3 && version != 4) {
					log(1, "Unsupported TDB version\n");
					close(fd);
					return -1;
				}
				if (gar) {
					gar->tdbdir = strdup(file);
					tp = strrchr(gar->tdbdir, '/');
					if (tp)
						*tp = '\0';
					else
						*gar->tdbdir = '\0';
					gar->tdbloaded = 1;
				}
				break;
			case TDB_COPYRIGHT:
				log(1, "Map copyrights:\n");
				while (cp < buf+block.size) {
					log(1, "%s\n", cp+4);
					cp+=4+strlen(cp+4) + 1;
				}
				log(11, "Left bytes: %d\n", block.size - (cp - buf));
				break;
			case TDB_TRADEMARK:
				log(1, "Map TradeMarks:\n");
				while (cp < buf+block.size) {
					log(1, "[%02X]%s\n",
						*cp, cp + 1);
					cp+=1+ strlen(cp+1) + 1;
				}
				log(11, "Left bytes: %d\n", block.size - (cp - buf));
				break;
			case TDB_REGIONS:
				log(1, "Covered Regions:\n");
				while (cp < buf+block.size) {
					log(1, "[%02X][%02X]%s\n", *cp, *(cp+1),cp+2);
					cp+=2+strlen(cp+2) + 1;
				}
				log(11, "Left bytes: %d\n", block.size - (cp - buf));
				break;
			case TDB_BASEMAP:
				if (version == 3) {
					log(4, "BaseMap number: %08u\n", *(u_int32_t *)cp);
					log(11, "Parent map: %08u\n", *(u_int32_t *)cp+4);
					sprintf(imgname, "%08u", *(u_int32_t *)cp);
				} else if (version == 4) {
					uc = (unsigned char *)cp;
					log(4, "BaseMap number: %08u\n", *(u_int32_t *)cp);
					log(11, "BaseMap number: [%02X][%02X][%02X][%02X]\n", *uc, *(uc+1), *(uc+2), *(uc+3));
					log(11, "Parent map: [%02X][%02X][%02X][%02X]\n", *(uc+4), *(uc+5), *(uc+6), *(uc+7));
				} else {
					log(1, "Unknown TDB version\n");
					break;
				}
				if (version == 3) {
					north = GAR4DEG(*(u_int32_t *)(cp+8));
					east = GAR4DEG(*(u_int32_t *)(cp+0xc));
					south = GAR4DEG(*(u_int32_t *)(cp+0x10));
					west = GAR4DEG(*(u_int32_t *)(cp+0x14));
				} else if (version == 4) {
					c = *(int32_t *)(cp+8) >>8;
					north = GARDEG(c);
					c = *(int32_t *)(cp+12) >> 8;
					east = GARDEG(c);
					c = *(int32_t *)(cp+16) >> 8;
					south = GARDEG(c);
					c = *(int32_t *)(cp+20) >> 8;
					west = GARDEG(c);
				} else {
					log(1, "Unknown TDB version:%d\n", version);
					break;
				}
				log(9, "North: %fC West: %fC South: %fC East: %fC\n",
					north, west, south, east);
				cp+= 0x18;
				if (cp < buf+block.size) {
					log(9, "Descr:[%s]\n", cp);
					cp += strlen(cp) + 1;
				}
				log(11, "Left bytes: %d\n", block.size - (cp - buf));
				if (version == 4) {
					tp = strrchr(file, '/');
					if (tp) {
						sprintf(imgname, "%s", tp+1);
					} else {
						strncpy(imgname, file, sizeof(imgname)-1);
						imgname[sizeof(imgname)-1] = '\0';
					}
					tp = strrchr(imgname, '.');
					if (tp)
						*tp = '\0';
				}
				if (version == 3) {
					havebase = 1;
					gar_tdb_load_img(gar, imgname, 1, data,
						north, east, south, west);
				} else if (version == 4) {
					havebase = 1;
					/* IN v4 looks like there are definitions pointing in the basemap */
					if (!td4bm) {
						gar_tdb_load_img(gar, imgname, 1, data,
							north, east, south, west);
						td4bm = 1;
					}
				}
				break;
			case TDB_DETAILMAP:
				log(4, "DetailMap number: %08u\n", *(u_int32_t *)cp);
				sprintf(imgname, "%08u", *(u_int32_t *)cp);
				log(11, "Parent map: %08u\n", *(u_int32_t *)cp+4);
				if (version == 3) {
					north = GAR4DEG(*(u_int32_t *)(cp+8));
					east = GAR4DEG(*(u_int32_t *)(cp+0xc));
					south = GAR4DEG(*(u_int32_t *)(cp+0x10));
					west = GAR4DEG(*(u_int32_t *)(cp+0x14));
				} else if (version == 4) {
					c = *(int32_t *)(cp+8) >>8;
					c = SIGN3B(c);
					north = GARDEG(c);
					c = *(int32_t *)(cp+12) >> 8;
					c = SIGN3B(c);
					east = GARDEG(c);
					c = *(int32_t *)(cp+16) >> 8;
					c = SIGN3B(c);
					south = GARDEG(c);
					c = *(int32_t *)(cp+20) >> 8;
					c = SIGN3B(c);
					west = GARDEG(c);
				} else {