示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
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;
}
示例#4
0
文件: osm2pak.c 项目: danmokai/texgz
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;
}