static void append(pak_file_t* pak, const char* fname) { assert(pak); assert(fname); LOGD("debug fname=%s", fname); if(pak_file_writek(pak, fname) == 0) { return; } FILE* f = fopen(fname, "r"); if(f == 0) { LOGE("fopen %s failed", fname); return; } unsigned char buf[4096]; int bytes = fread(buf, sizeof(unsigned char), 4096, f); while(bytes > 0) { if(pak_file_write(pak, buf, bytes, 1) != 1) { break; } bytes = fread(buf, sizeof(unsigned char), 4096, f); } fclose(f); }
static void sample_subtile(texgz_tex_t* src, pak_file_t* pak, int x, int y, int i, int j, double latT, double lonL, double latB, double lonR) { assert(src); assert(pak); LOGD("debug x=%i, y=%i, i=%i, j=%i, latT=%lf, lonL=%lf, latB=%lf, lonR=%lf", x, y, i, j, latT, lonL, latB, lonR); // create dst texgz_tex_t* dst = texgz_tex_new(SUBTILE_SIZE, SUBTILE_SIZE, SUBTILE_SIZE, SUBTILE_SIZE, TEXGZ_UNSIGNED_BYTE, TEXGZ_RGB, NULL); if(dst == NULL) { return; } int m; int n; for(m = 0; m < SUBTILE_SIZE; ++m) { for(n = 0; n < SUBTILE_SIZE; ++n) { sample_data(src, dst, x, y, i, j, m, n, latT, lonL, latB, lonR); } } // convert dst to 565 texgz_tex_convert(dst, TEXGZ_UNSIGNED_SHORT_5_6_5, TEXGZ_RGB); char key[256]; snprintf(key, 256, "%i_%i", j, i); pak_file_writek(pak, key); texgz_tex_exportf(dst, pak->f); texgz_tex_delete(&dst); }
static int sample_subtile(nedgz_tile_t* tile, int i, int j, pak_file_t* pak) { assert(tile); LOGD("debug i=%i, j=%i", i, j); texgz_tex_t* tex = texgz_tex_new(SUBTILE_SIZE, SUBTILE_SIZE, SUBTILE_SIZE, SUBTILE_SIZE, TEXGZ_SHORT, TEXGZ_LUMINANCE, NULL); if(tex == NULL) { return 0; } int m; int n; for(m = 0; m < SUBTILE_SIZE; ++m) { for(n = 0; n < SUBTILE_SIZE; ++n) { double lat; double lon; tile_coord(tile, i, j, m, n, &lat, &lon); // flt_cc most likely place to find sample // At edges of range a subtile may not be // fully covered by flt_xx short height; if((flt_cc && flt_tile_sample(flt_cc, lat, lon, &height)) || (flt_tc && flt_tile_sample(flt_tc, lat, lon, &height)) || (flt_bc && flt_tile_sample(flt_bc, lat, lon, &height)) || (flt_cl && flt_tile_sample(flt_cl, lat, lon, &height)) || (flt_cr && flt_tile_sample(flt_cr, lat, lon, &height)) || (flt_tl && flt_tile_sample(flt_tl, lat, lon, &height)) || (flt_bl && flt_tile_sample(flt_bl, lat, lon, &height)) || (flt_tr && flt_tile_sample(flt_tr, lat, lon, &height)) || (flt_br && flt_tile_sample(flt_br, lat, lon, &height))) { short* pixels = (short*) tex->pixels; pixels[m*SUBTILE_SIZE + n] = height; } else { short* pixels = (short*) tex->pixels; pixels[m*SUBTILE_SIZE + n] = NEDGZ_NODATA; } } } // j=dx, i=dy char fname[256]; snprintf(fname, 256, "%i_%i", j, i); pak_file_writek(pak, fname); texgz_tex_exportf(tex, pak->f); texgz_tex_delete(&tex); return 1; }
int main(int argc, char** argv) { // osm.list // zoom x y if(argc != 2) { LOGE("usage: %s [osm.list]", argv[0]); return EXIT_FAILURE; } // create directories if necessary char dname[256]; snprintf(dname, 256, "%s", "osm"); if(mkdir(dname, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1) { if(errno == EEXIST) { // already exists } else { LOGE("mkdir %s failed", dname); return EXIT_FAILURE; } } // open the list FILE* f = fopen(argv[1], "r"); if(f == NULL) { LOGE("failed to open %s", argv[1]); return EXIT_FAILURE; } // iteratively pak osm images char* line = NULL; size_t n = 0; int index = 0; while(getline(&line, &n, f) > 0) { int x; int y; int zoom; if(sscanf(line, "%i %i %i", &zoom, &x, &y) != 3) { LOGE("invalid line=%s", line); continue; } LOGI("%i: zoom=%i, x=%i, y=%i", index++, zoom, x, y); // create directories if necessary char dname[256]; snprintf(dname, 256, "osm/%i", zoom); if(mkdir(dname, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1) { if(errno == EEXIST) { // already exists } else { LOGE("mkdir %s failed", dname); continue; } } char fname[256]; snprintf(fname, 256, "osm/%i/%i_%i.pak", zoom, x, y); pak_file_t* pak = pak_file_open(fname, PAK_FLAG_WRITE); if(pak == NULL) { continue; } int i; int j; for(i = 0; i < 8; ++i) { for(j = 0; j < 8; ++j) { int xj = 8*x + j; int yi = 8*y + i; snprintf(fname, 256, "localhost/osm/%i/%i/%i.png", zoom, xj, yi); texgz_tex_t* tex = texgz_png_import(fname); if(tex == NULL) { continue; } if(texgz_tex_convert(tex, TEXGZ_UNSIGNED_SHORT_4_4_4_4, TEXGZ_RGBA) == 0) { texgz_tex_delete(&tex); continue; } // j=dx, i=dy snprintf(fname, 256, "%i_%i", j, i); pak_file_writek(pak, fname); texgz_tex_exportf(tex, pak->f); texgz_tex_delete(&tex); } } pak_file_close(&pak); } free(line); return EXIT_SUCCESS; }