Пример #1
0
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;
}
Пример #2
0
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;
}