Exemplo n.º 1
0
//--------------Traffic download--------------------------------
int
load_trf(data_of_thread *local)
{

GdkPixbuf	*pixbuf = NULL;
GError		*error = NULL;
GdkGC		*gc_map = NULL;

//static GtkWidget	*drawingarea11 = NULL;

	printf("* load_trf()\n");
	
	gchar* filename;

	gchar* key;

	filename = g_strdup_printf("%s/%d/%d/%d.png", curr_trf->dir, local->zoom, local->x, local->y);

	pixbuf = gdk_pixbuf_new_from_file (
			filename,
			&error);
	if(pixbuf)
	{
		gdk_threads_enter();
			gdk_draw_pixbuf (
					pixmap,
					gc_map,
					pixbuf,
					0,0,
					local->offset_x-(global_x-local->x_glob),local->offset_y-(global_y-local->y_glob),
					TILESIZE,TILESIZE,
					GDK_RGB_DITHER_NONE, 0, 0);
		
		
			g_object_unref (pixbuf);
				
			drawingarea11 = lookup_widget(window1, "drawingarea1");
			
			gtk_widget_queue_draw_area (
				drawingarea11, 
				local->offset_x-(global_x-local->x_glob),local->offset_y-(global_y-local->y_glob),
				TILESIZE,TILESIZE);
		gdk_threads_leave();
	}	

	if (global_trf_auto && !host_failed)
	{
//Информация о загрузке данного тайла пробок
	key = g_strdup_printf("%s/%d/%d/%d_time", curr_trf->dir, local->zoom, local->x, local->y);

	static time_t	load_time=0; //время, когда был загружен tile пробок
	time_t* temp;
	temp= g_hash_table_lookup(ht,key);
	if (temp==0)
		{
			struct stat file_info;
			if (!stat(filename,&file_info) && pixbuf)
				load_time=file_info.st_mtime;
			else load_time=0;
		}
	else
		load_time=*temp;

				global_time=time(NULL);
				struct tm*  local_time;
				local_time=localtime(&global_time);//local time of this machine
				printf ("%d:%d:%d\n", local_time->tm_hour,  local_time->tm_min,  local_time->tm_sec);
				int temptime=local_time->tm_min*60+local_time->tm_sec;//Прошло времени с момента начала нового часа
				traffic_time=global_time-temptime+(int)(temptime/240)*240-240;
				printf("Возраст пробок %i\n", global_time-traffic_time);//время с момента создания новых карт движения, т.е. возраст последних пробок на яндексе.
				printf("global_time = %i\n", global_time);
				printf("traffic_time = %i\n", traffic_time);
				printf("load_time = %i\n", load_time);
		if (traffic_time > load_time) // Появились новые тайлы пробок
		{
			printf ("Закачиваем пробки\n");
			time_t *temp_time=malloc(sizeof(time_t));
			memcpy(temp_time,&traffic_time,sizeof(temp_time));
			g_hash_table_replace(ht,key,temp_time);
			download_tile(curr_trf,local->zoom,local->x,local->y);
			if (local->zoom!=global_zoom) return ERR_ZOOM;
			pixbuf = gdk_pixbuf_new_from_file (
					filename,
					&error);
			if (!pixbuf) return ERR_LOAD;
			else 
			{
				g_object_unref (pixbuf);
				return LOAD_OK;
			}
		}
//неправильно Если буфер пустой (мы уже закачиваем)
/*		if (found!=NULL)
		if (!host_failed && strcmp(found,"The requested URL returned error: 404")==0 && traffic_old_factor<5) //карта не была загружена, инет есть	
			{	
//написать обнуление хеша,где 			The requested URL returned error: 404`
		//		traffic_old_factor++;
				printf ("found = %s\n",found);
				printf ("Закачиваем старые пробки\n");
				trf_old=TRUE;
				printf ("показатель старости пробок - %d",traffic_old_factor);
				pixbuf_is_null = TRUE;
				download_tile(curr_trf,global_zoom,x,y);
			}	
*/	}
	
//	if(pixbuf == NULL)
//	{
//		printf("PIXBUF: error loading png\n");
//		error = NULL;
//	}
//	else
//		printf("PIXBUF: loading okay\n");
//	
//
//gdk_threads_enter();
//	gdk_draw_pixbuf (
//			pixmap,
//			gc_map,
//			pixbuf,
//			0,0,
//			local->offset_x-(global_x-local->x_glob),local->offset_y-(global_y-local->y_glob),
//			TILESIZE,TILESIZE,
//			GDK_RGB_DITHER_NONE, 0, 0);
//
//
//	g_object_unref (pixbuf);
//		
//	drawingarea11 = lookup_widget(window1, "drawingarea1");
//	
//	gtk_widget_queue_draw_area (
//		drawingarea11, 
//		local->offset_x-(global_x-local->x_glob),local->offset_y-(global_y-local->y_glob),
//		TILESIZE,TILESIZE);
//gdk_threads_leave();
return 0;
}
Exemplo n.º 2
0
void
load_tile(	gchar *dir,
		int zoom,
		int x,
		int y,
		int offset_x,
		int offset_y)
{
	int		detail_zoom	= global_detail_zoom; /* round (dpi/96.0) */
	int		detail_scale	= (int) pow (2.0, (float) detail_zoom);
	int 		overzoom	= 0;
	int 		upscale		= 1;
	gboolean	hash_not_found = TRUE;
	static gchar 	filename[256];
	static gchar	wanted_filename[256];

	GdkPixbuf	*pixbuf		= NULL;
	repo_t 		*repo;
	tile_hash_t	*tile_hash;

	
	if(gc_map)
		g_object_unref(gc_map);
	if(pixmap)
	{
		gc_map = gdk_gc_new(pixmap);
	}
	else printf("no drawable -> NULL\n");

	upscale = detail_scale;
	zoom -= detail_zoom;

	g_snprintf(wanted_filename, 255, "%s/%u/%u/%u.png", dir, zoom, x, y);
	tile_hash = g_hash_table_lookup(hash_table, wanted_filename);
	
	if(tile_hash)
	{
		pixbuf = tile_hash->pixbuf;
		
		tile_hash->reused = TRUE;
		hash_not_found	  = FALSE;
	}
	
	else
	{
		
		for(overzoom=0; overzoom<=3; overzoom++)
		{
			g_snprintf(filename, 255, "%s/%u/%u/%u.png", dir, zoom-overzoom, x/upscale, y/upscale);
	
			pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
	
			if(pixbuf)
				break;
	
			upscale *= 2;
		}
		
		if(pixbuf && upscale > 1)
		{
			GdkPixbuf	*pixbuf_scaled	= NULL;
			pixbuf_scaled = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 256, 256); 
	
			gdk_pixbuf_scale (	pixbuf, pixbuf_scaled,
						0, 0,
						TILESIZE, TILESIZE,
						-TILESIZE*(x%upscale), -TILESIZE*(y%upscale),
						upscale, upscale,
						GDK_INTERP_BILINEAR );

			if (pixbuf) {
				g_object_unref (pixbuf);
			}

			pixbuf = pixbuf_scaled;
		}
	}
	
	if(!pixbuf)
	{
		
		GtkWidget *widget;
			
		widget = lookup_widget(window1, "drawingarea1");
			
		gdk_draw_rectangle (
			pixmap,
			widget->style->white_gc,
			TRUE,
			offset_x, offset_y,
			256,
			256);
						
		gtk_widget_queue_draw_area (
			widget,
			offset_x,offset_y,256,256);
	}
	
	else
	{
		
		gdk_draw_pixbuf (
			pixmap,
			gc_map,
			pixbuf,
			0,0,
			offset_x,offset_y,
			TILESIZE,TILESIZE,
			GDK_RGB_DITHER_NONE, 0, 0);

		
		if(hash_not_found)
		{
			tile_hash = g_new0(tile_hash_t,1);
			tile_hash->pixbuf = pixbuf;
			tile_hash->reused = TRUE;
	
			g_hash_table_insert(hash_table, g_strdup(wanted_filename), tile_hash);
		}
	}

	
	drawingarea11 = lookup_widget(window1, "drawingarea1");
	
	gtk_widget_queue_draw_area (
		drawingarea11, 
		offset_x,offset_y,
		TILESIZE,TILESIZE);

	if(overzoom && global_auto_download)
	{
		repo = global_curr_repo->data;
		download_tile(repo,zoom,x/detail_scale,y/detail_scale);
	}	
}
Exemplo n.º 3
0
int
load_tile(data_of_thread *local)
{
GdkPixbuf	*pixbuf=NULL;
GError		*error = NULL;
GdkGC		*gc_map = NULL;

//static GtkWidget	*drawingarea11 = NULL;
	gchar filename[256];

	printf("* load tile()\n");
	
/*	if(gc_map)
		g_object_unref(gc_map);
*/	
	g_sprintf(filename, "%s/%u/%u/%u.png", local->repo->dir, local->zoom, local->x, local->y);
	printf("IMG: %s\n",filename);

	pixbuf = gdk_pixbuf_new_from_file (
			filename,
			&error);

		GtkWidget *widget;
			
		widget = lookup_widget(window1, "drawingarea1");
			
	if(pixbuf == NULL || ((local->x < 0) || (local->y < 0) || (local->x > exp(local->zoom * M_LN2)) || (local->y > exp(local->zoom * M_LN2))))
	{
		printf("*** Not downloading tile \n");
gdk_threads_enter();
		gdk_draw_rectangle (
			pixmap,
			widget->style->white_gc,
			TRUE,
			local->offset_x, local->offset_y,
			256,
			256);
						
		gtk_widget_queue_draw_area (
			widget, 
			local->offset_x,local->offset_y,256,256);
gdk_threads_leave();
		
		printf("load_tile: error loading png\n");
		error = NULL;

		if (global_auto_download && !host_failed)
		{
			download_tile(local->repo,local->zoom,local->x,local->y);
			if (local->zoom!=global_zoom) return ERR_ZOOM;
			if (local->repo!=global_curr_repo->data) return ERR_REPO;
			pixbuf = gdk_pixbuf_new_from_file (       // ?????????
					filename,
					&error);
			if (pixbuf==NULL)
				return ERR_LOAD;
		}
		else
		{
			return ERR_LOAD;
		}
	}	
gdk_threads_enter();
	gdk_draw_pixbuf (
			pixmap,
			gc_map,
			pixbuf,
			0,0,
			local->offset_x-(global_x-local->x_glob),local->offset_y-(global_y-local->y_glob),
			TILESIZE,TILESIZE,
			GDK_RGB_DITHER_NONE, 0, 0);

		g_object_unref (pixbuf);
	
	drawingarea11 = lookup_widget(window1, "drawingarea1");
	
	gtk_widget_queue_draw_area (
		drawingarea11, 
		local->offset_x-(global_x-local->x_glob),local->offset_y-(global_y-local->y_glob),
		TILESIZE,TILESIZE);
gdk_threads_leave();
return 0;
}