//--------------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; }
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); } }
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; }