int main(int argc, char** argv) { unsigned char dx = 0; unsigned char dy = 0; const char* arg_format = NULL; const char* arg_src = NULL; const char* arg_dst = NULL; if(argc == 6) { dx = (unsigned char) strtoul(argv[2], (char**) NULL, 10); dy = (unsigned char) strtoul(argv[3], (char**) NULL, 10); arg_format = argv[1]; arg_src = argv[4]; arg_dst = argv[5]; } else if(argc == 4) { arg_format = argv[1]; arg_src = argv[2]; arg_dst = argv[3]; if(check_ext(arg_src, "mgm")) { usage(argv[0]); return EXIT_FAILURE; } } else { usage(argv[0]); return EXIT_FAILURE; } // parse format int type; int format; if(strcmp(arg_format, "RGBA-8888") == 0) { type = TEXGZ_UNSIGNED_BYTE; format = TEXGZ_RGBA; } else if(strcmp(arg_format, "BGRA-8888") == 0) { type = TEXGZ_UNSIGNED_BYTE; format = TEXGZ_BGRA; } else if(strcmp(arg_format, "RGB-565") == 0) { type = TEXGZ_UNSIGNED_SHORT_5_6_5; format = TEXGZ_RGB; } else if(strcmp(arg_format, "RGBA-4444") == 0) { type = TEXGZ_UNSIGNED_SHORT_4_4_4_4; format = TEXGZ_RGBA; } else if(strcmp(arg_format, "RGB-888") == 0) { type = TEXGZ_UNSIGNED_BYTE; format = TEXGZ_RGB; } else if(strcmp(arg_format, "RGBA-5551") == 0) { type = TEXGZ_UNSIGNED_SHORT_5_5_5_1; format = TEXGZ_RGBA; } else if(strcmp(arg_format, "LUMINANCE") == 0) { type = TEXGZ_UNSIGNED_BYTE; format = TEXGZ_LUMINANCE; } else if(strcmp(arg_format, "LUMINANCE-F") == 0) { type = TEXGZ_FLOAT; format = TEXGZ_LUMINANCE; } else { LOGE("invalid format=%s", arg_format); return EXIT_FAILURE; } // import src texgz_tex_t* tex = NULL; if(check_ext(arg_src, "texgz")) { tex = texgz_tex_import(arg_src); } else if(check_ext(arg_src, "jpg")) { tex = texgz_jpeg_import(arg_src); } else if(check_ext(arg_src, "png")) { tex = texgz_png_import(arg_src); } else if(check_ext(arg_src, "mgm")) { tex = texgz_mgm_import(arg_src, dx, dy); } else { LOGE("invalid src=%s", arg_src); return EXIT_FAILURE; } if(tex == NULL) { return EXIT_FAILURE; } // convert to format if(texgz_tex_convert(tex, type, format) == 0) { goto fail_convert; } // export dst int ret = 0; if(check_ext(arg_dst, "texgz")) { ret = texgz_tex_export(tex, arg_dst); } else if(check_ext(arg_dst, "jpg")) { ret = texgz_jpeg_export(tex, arg_dst); } else if(check_ext(arg_dst, "png")) { ret = texgz_png_export(tex, arg_dst); } else { LOGE("invalid dst=%s", arg_dst); goto fail_dst; } if(ret == 0) { goto fail_export; } texgz_tex_delete(&tex); // success return EXIT_SUCCESS; // failure fail_export: fail_dst: fail_convert: texgz_tex_delete(&tex); return EXIT_FAILURE; }
static texgz_tex_t* naip_sampleNode(int zoom, int x, int y) { // restart the saved node if it exists char sname[256]; if((zoom == 12) || (zoom == 3)) { snprintf(sname, 256, "naipsave/%i/%i/%i.texz", zoom, x, y); sname[255] = '\0'; if(access(sname, F_OK) == 0) { // assume this LOD already completed texgz_tex_t* down = texgz_tex_importz(sname); if(down) { LOGI("restart %s", sname); return down; } } } // terrain tiles only exist up to zoom 15 // and zoom > 15 is covered by zoom 15 short min; short max; int flags = TERRAIN_NEXT_ALL; if(zoom < 15) { if(terrain_tile_header(".", x, y, zoom, &min, &max, &flags) == 0) { return NULL; } } // create a working texture texgz_tex_t* tex = texgz_tex_new(256, 256, 256, 256, TEXGZ_UNSIGNED_BYTE, TEXGZ_RGBA, NULL); if(tex == NULL) { return NULL; } // prefetch images used by z17 (naip_sampleEnd) // cache should easily hold all images needed for z12-z17 // z12=256, z13=512, z14=1024 // z15=2048, z16=4096, z17=8192 if(zoom == 12) { naip_cache_prefetch(zoom, x, y); } // sample the next/end LOD // naip data roughly corresponds to zoom 17 if(zoom == 17) { if(naip_cache_isCached(zoom, x, y)) { naip_sampleEnd(tex, zoom, x, y); } } else { texgz_tex_t* tmp; if(flags & TERRAIN_NEXT_TL) { tmp = naip_sampleNode(zoom + 1, 2*x, 2*y); if(tmp) { texgz_tex_blit(tmp, tex, 128, 128, 0, 0, 0, 0); texgz_tex_delete(&tmp); } } if(flags & TERRAIN_NEXT_BL) { tmp = naip_sampleNode(zoom + 1, 2*x, 2*y + 1); if(tmp) { texgz_tex_blit(tmp, tex, 128, 128, 0, 0, 0, 128); texgz_tex_delete(&tmp); } } if(flags & TERRAIN_NEXT_TR) { tmp = naip_sampleNode(zoom + 1, 2*x + 1, 2*y); if(tmp) { texgz_tex_blit(tmp, tex, 128, 128, 0, 0, 128, 0); texgz_tex_delete(&tmp); } } if(flags & TERRAIN_NEXT_BR) { tmp = naip_sampleNode(zoom + 1, 2*x + 1, 2*y + 1); if(tmp) { texgz_tex_blit(tmp, tex, 128, 128, 0, 0, 128, 128); texgz_tex_delete(&tmp); } } } // export the JPEG texture char fname[256]; snprintf(fname, 256, "naipjpg/%i/%i/%i.jpg", zoom, x, y); fname[255] = '\0'; { char pname[256]; snprintf(pname, 256, "naipjpg/%i/%i/%i.jpg.part", zoom, x, y); pname[255] = '\0'; if(naip_mkdir(fname) == 0) { goto fail_export; } if(texgz_jpeg_export(tex, pname) == 0) { goto fail_export; } if(rename(pname, fname) != 0) { LOGE("rename failed %s", fname); unlink(pname); goto fail_export; } LOGI("export %s", fname); } // compute the downscaled texture for the next LOD texgz_tex_t* down = texgz_tex_downscale(tex); if(down == NULL) { goto fail_down; } // save the output for restart if((zoom == 12) || (zoom == 3)) { char pname[256]; snprintf(pname, 256, "naipsave/%i/%i/%i.texz.part", zoom, x, y); pname[255] = '\0'; if(naip_mkdir(sname) == 0) { goto fail_save; } if(texgz_tex_exportz(down, pname) == 0) { goto fail_save; } if(rename(pname, sname) != 0) { LOGE("rename failed %s", sname); unlink(pname); goto fail_save; } LOGI("export %s", sname); } texgz_tex_delete(&tex); // success return down; // failure fail_save: texgz_tex_delete(&down); fail_down: unlink(fname); fail_export: texgz_tex_delete(&tex); return NULL; }