diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/import_tiger.c | 59 | ||||
-rw-r--r-- | src/map.c | 8 | ||||
-rw-r--r-- | src/test_poly.c | 110 | ||||
-rw-r--r-- | src/util.c | 6 | ||||
-rw-r--r-- | src/util.h | 1 |
5 files changed, 83 insertions, 101 deletions
diff --git a/src/import_tiger.c b/src/import_tiger.c index 06abd7d..97e1050 100644 --- a/src/import_tiger.c +++ b/src/import_tiger.c @@ -103,6 +103,13 @@ typedef struct tiger_record_rt2 GPtrArray* pPointsArray; } tiger_record_rt2_t; +void callback_free_rt2(gpointer p) +{ + tiger_record_rt2_t* pRT2 = (tiger_record_rt2_t*)p; + g_ptr_array_foreach(pRT2->pPointsArray, util_g_free_with_param, NULL); + g_free(pRT2); +} + #define TIGER_LANDMARK_NAME_LEN (30) typedef struct tiger_record_rt7 { @@ -125,19 +132,6 @@ typedef struct tiger_rt1_link gint nPointBTZID; // the unique # for the rt1's PointB } tiger_rt1_link_t; -typedef struct tiger_import_process { - gchar* pszFileDescription; - - GHashTable* pTableRT1; - GHashTable* pTableRT2; - GHashTable* pTableRT7; - GHashTable* pTableRT8; - GHashTable* pTableRTi; - GHashTable* pTableRTc; - - GPtrArray* pBoundaryRT1s; -} tiger_import_process_t; - typedef struct tiger_record_rti { // store a list of TLIDs for a polygonID @@ -145,6 +139,13 @@ typedef struct tiger_record_rti GPtrArray* pRT1LinksArray; } tiger_record_rti_t; +void callback_free_rti(gpointer p) +{ + tiger_record_rti_t* pRTi = (tiger_record_rti_t*)p; + g_ptr_array_foreach(pRTi->pRT1LinksArray, util_g_free_with_param, NULL); + g_free(pRTi); +} + #define TIGER_CITY_NAME_LEN (60) #define TIGER_FIPS55_LEN (5) typedef struct tiger_record_rtc @@ -155,6 +156,19 @@ typedef struct tiger_record_rtc gint nCityID; // a database ID, stored here after it is inserted } tiger_record_rtc_t; +typedef struct tiger_import_process { + gchar* pszFileDescription; + + GHashTable* pTableRT1; + GHashTable* pTableRT2; + GHashTable* pTableRT7; + GHashTable* pTableRT8; + GHashTable* pTableRTi; + GHashTable* pTableRTc; + + GPtrArray* pBoundaryRT1s; +} tiger_import_process_t; + // #define MAP_OBJECT_TYPE_NONE (0) // #define MAP_OBJECT_TYPE_MINORROAD (1) // #define MAP_OBJECT_TYPE_MAJORROAD (2) @@ -1303,7 +1317,7 @@ static gboolean import_tiger_from_buffers( importProcess.pBoundaryRT1s = g_ptr_array_new(); g_print("parsing RT1\n"); - importProcess.pTableRT1 = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRT1 = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free); import_tiger_parse_table_1(pBufferRT1, nLengthRT1, importProcess.pTableRT1, importProcess.pBoundaryRT1s); g_print("RT1: %d records\n", g_hash_table_size(importProcess.pTableRT1)); @@ -1311,7 +1325,7 @@ static gboolean import_tiger_from_buffers( importwindow_progress_pulse(); g_print("parsing RT2\n"); - importProcess.pTableRT2 = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRT2 = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, callback_free_rt2); import_tiger_parse_table_2(pBufferRT2, nLengthRT2, importProcess.pTableRT2); g_print("RT2: %d records\n", g_hash_table_size(importProcess.pTableRT2)); @@ -1319,7 +1333,7 @@ static gboolean import_tiger_from_buffers( importwindow_progress_pulse(); g_print("parsing RT7\n"); - importProcess.pTableRT7 = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRT7 = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free); import_tiger_parse_table_7(pBufferRT7, nLengthRT7, importProcess.pTableRT7); g_print("RT7: %d records\n", g_hash_table_size(importProcess.pTableRT7)); @@ -1327,7 +1341,7 @@ static gboolean import_tiger_from_buffers( importwindow_progress_pulse(); g_print("parsing RT8\n"); - importProcess.pTableRT8 = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRT8 = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free); import_tiger_parse_table_8(pBufferRT8, nLengthRT8, importProcess.pTableRT8); g_print("RT8: %d records\n", g_hash_table_size(importProcess.pTableRT8)); @@ -1335,12 +1349,12 @@ static gboolean import_tiger_from_buffers( importwindow_progress_pulse(); g_print("parsing RTc\n"); - importProcess.pTableRTc = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRTc = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free); import_tiger_parse_table_c(pBufferRTc, nLengthRTc, importProcess.pTableRTc); g_print("RTc: %d records\n", g_hash_table_size(importProcess.pTableRTc)); g_print("parsing RTi\n"); - importProcess.pTableRTi = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRTi = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, callback_free_rti); import_tiger_parse_table_i(pBufferRTi, nLengthRTi, importProcess.pTableRTi); g_print("RTi: %d records\n", g_hash_table_size(importProcess.pTableRTi)); @@ -1385,11 +1399,12 @@ g_print("cleaning up\n"); g_hash_table_destroy(importProcess.pTableRT7); g_hash_table_destroy(importProcess.pTableRT8); g_hash_table_destroy(importProcess.pTableRTc); + // XXX: this call sometimes segfaults: - g_warning("leaking some memory due to unsolved bug in import. just restart roadster after/between imports ;)\n"); - //g_hash_table_destroy(importProcess.pTableRTi); - g_free(importProcess.pszFileDescription); + //g_warning("leaking some memory due to unsolved bug in import. just restart roadster after/between imports ;)\n"); + g_hash_table_destroy(importProcess.pTableRTi); + g_free(importProcess.pszFileDescription); return TRUE; } @@ -98,10 +98,10 @@ zoomlevel_t g_sZoomLevels[NUM_ZOOM_LEVELS] = { { 3300000, UNIT_MILES, 5, UNIT_KILOMETERS, 7, 3, 2}, // 15 { 2750000, UNIT_MILES, 5, UNIT_KILOMETERS, 7, 3, 2}, // 16 - { 2200000, UNIT_MILES, 8, UNIT_KILOMETERS, 5, 4, 1}, // *17 - { 1832250, UNIT_MILES, 8, UNIT_KILOMETERS, 5, 4, 1}, // 18 - { 1464500, UNIT_MILES, 8, UNIT_KILOMETERS, 5, 4, 1}, // 19 - { 1100000, UNIT_MILES, 8, UNIT_KILOMETERS, 5, 4, 1}, // 20 + { 2200000, UNIT_MILES,20, UNIT_KILOMETERS,15, 4, 1}, // *17 + { 1832250, UNIT_MILES,20, UNIT_KILOMETERS,15, 4, 1}, // 18 + { 1464500, UNIT_MILES,20, UNIT_KILOMETERS,15, 4, 1}, // 19 + { 1100000, UNIT_MILES,20, UNIT_KILOMETERS,15, 4, 1}, // 20 { 729000, UNIT_MILES,10, UNIT_KILOMETERS, 8, 5, 1}, // *21 { 607500, UNIT_MILES,10, UNIT_KILOMETERS, 8, 5, 1}, // 22 diff --git a/src/test_poly.c b/src/test_poly.c index 6208806..ff3d6f3 100644 --- a/src/test_poly.c +++ b/src/test_poly.c @@ -19,14 +19,14 @@ struct { GtkButton* pClearButton; GtkDrawingArea* pDrawingArea; GtkLabel* pLabel; + GtkCheckButton* pHideDrawingCheckButton; GArray* pPointsArray; } g_Test_Poly; -static gboolean on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event, gpointer data); -static void test_poly_draw(); -static gboolean on_mouse_button_click(GtkWidget* w, GdkEventButton *event); -static gboolean on_clear_clicked(GtkWidget* w, GdkEventButton *event); +static gboolean test_poly_on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event, gpointer data); +static gboolean test_poly_on_mouse_button_click(GtkWidget* w, GdkEventButton *event); +static gboolean test_poly_on_clearbutton_clicked(GtkWidget* w, GdkEventButton *event); void test_poly_init(GladeXML* pGladeXML) { @@ -36,22 +36,23 @@ void test_poly_init(GladeXML* pGladeXML) GLADE_LINK_WIDGET(pGladeXML, g_Test_Poly.pClearButton, GTK_BUTTON, "test_poly_clear_button"); GLADE_LINK_WIDGET(pGladeXML, g_Test_Poly.pLabel, GTK_LABEL, "test_polylabel"); GLADE_LINK_WIDGET(pGladeXML, g_Test_Poly.pDrawingArea, GTK_DRAWING_AREA, "test_polydrawingarea"); + GLADE_LINK_WIDGET(pGladeXML, g_Test_Poly.pHideDrawingCheckButton, GTK_CHECK_BUTTON, "test_polyhidecheck"); g_Test_Poly.pPointsArray = g_array_new(FALSE, FALSE, sizeof(mappoint_t)); // Drawing area gtk_widget_set_double_buffered(GTK_WIDGET(g_Test_Poly.pDrawingArea), FALSE); gtk_widget_add_events(GTK_WIDGET(g_Test_Poly.pDrawingArea), GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); - g_signal_connect(G_OBJECT(g_Test_Poly.pDrawingArea), "expose-event", G_CALLBACK(on_time_to_update), NULL); - g_signal_connect(G_OBJECT(g_Test_Poly.pDrawingArea), "button_press_event", G_CALLBACK(on_mouse_button_click), NULL); + g_signal_connect(G_OBJECT(g_Test_Poly.pDrawingArea), "expose-event", G_CALLBACK(test_poly_on_time_to_update), NULL); + g_signal_connect(G_OBJECT(g_Test_Poly.pDrawingArea), "button_press_event", G_CALLBACK(test_poly_on_mouse_button_click), NULL); // Scale - g_signal_connect(G_OBJECT(g_Test_Poly.pScale), "value-changed", G_CALLBACK(on_time_to_update), NULL); + g_signal_connect(G_OBJECT(g_Test_Poly.pScale), "value-changed", G_CALLBACK(test_poly_on_time_to_update), NULL); // make it instant-change using our hacky callback //g_signal_connect(G_OBJECT(g_Test_Poly.pScale), "change-value", G_CALLBACK(util_gtk_range_instant_set_on_value_changing_callback), NULL); // "Clear" button - g_signal_connect(G_OBJECT(g_Test_Poly.pClearButton), "clicked", G_CALLBACK(on_clear_clicked), NULL); + g_signal_connect(G_OBJECT(g_Test_Poly.pClearButton), "clicked", G_CALLBACK(test_poly_on_clearbutton_clicked), NULL); // don't delete window on X, just hide it g_signal_connect(G_OBJECT(g_Test_Poly.pWindow), "delete_event", G_CALLBACK(gtk_widget_hide), NULL); @@ -62,13 +63,22 @@ void test_poly_show(GtkMenuItem *menuitem, gpointer user_data) gtk_widget_show(GTK_WIDGET(g_Test_Poly.pWindow)); } -static gboolean on_clear_clicked(GtkWidget* w, GdkEventButton *event) +// +// callbacks etc. +// +static gboolean test_poly_on_clearbutton_clicked(GtkWidget* w, GdkEventButton *event) { g_array_remove_range(g_Test_Poly.pPointsArray, 0, g_Test_Poly.pPointsArray->len); gtk_widget_queue_draw(GTK_WIDGET(g_Test_Poly.pDrawingArea)); + return TRUE; } -static gboolean on_mouse_button_click(GtkWidget* w, GdkEventButton *event) +gboolean test_poly_on_hidecheck_toggled(GtkWidget* w, GdkEventButton *event) +{ + gtk_widget_queue_draw(GTK_WIDGET(g_Test_Poly.pDrawingArea)); +} + +static gboolean test_poly_on_mouse_button_click(GtkWidget* w, GdkEventButton *event) { gint nX, nY; gdk_window_get_pointer(w->window, &nX, &nY, NULL); @@ -81,10 +91,11 @@ static gboolean on_mouse_button_click(GtkWidget* w, GdkEventButton *event) point.fLatitude = (gdouble)nY / (gdouble)nHeight; g_array_append_val(g_Test_Poly.pPointsArray, point); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_Test_Poly.pHideDrawingCheckButton), FALSE); gtk_widget_queue_draw(GTK_WIDGET(g_Test_Poly.pDrawingArea)); } -void test_poly_draw_array(cairo_t* pCairo, GArray* pArray) +static void test_poly_draw_array(cairo_t* pCairo, GArray* pArray) { if(pArray->len >= 1) { mappoint_t* pPoint; @@ -103,18 +114,16 @@ void test_poly_draw_array(cairo_t* pCairo, GArray* pArray) } } -static gboolean on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event, gpointer data) +static gboolean test_poly_on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event, gpointer data) { - Display* dpy; - Drawable drawable; - dpy = gdk_x11_drawable_get_xdisplay(GTK_WIDGET(g_Test_Poly.pDrawingArea)->window); + Display* dpy = gdk_x11_drawable_get_xdisplay(GTK_WIDGET(g_Test_Poly.pDrawingArea)->window); Visual *visual = DefaultVisual (dpy, DefaultScreen (dpy)); + Drawable drawable = gdk_x11_drawable_get_xid(GTK_WIDGET(g_Test_Poly.pDrawingArea)->window); gint width, height; - drawable = gdk_x11_drawable_get_xid(GTK_WIDGET(g_Test_Poly.pDrawingArea)->window); gdk_drawable_get_size (GTK_WIDGET(g_Test_Poly.pDrawingArea)->window, &width, &height); cairo_surface_t *pSurface = cairo_xlib_surface_create (dpy, drawable, visual, width, height); - gdouble fValue = gtk_range_get_value(g_Test_Poly.pScale); + gdouble fValue = gtk_range_get_value(GTK_RANGE(g_Test_Poly.pScale)); cairo_t* pCairo = cairo_create (pSurface); @@ -125,13 +134,15 @@ static gboolean on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event cairo_fill(pCairo); // Draw lines - cairo_set_line_join(pCairo, CAIRO_LINE_JOIN_ROUND); - cairo_save(pCairo); - cairo_set_line_width(pCairo, 0.02); - cairo_set_source_rgba(pCairo, 1.0, 0.0, 0.0, 1.0); - test_poly_draw_array(pCairo, g_Test_Poly.pPointsArray); - cairo_stroke(pCairo); - cairo_restore(pCairo); + if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_Test_Poly.pHideDrawingCheckButton)) == FALSE) { + cairo_set_line_join(pCairo, CAIRO_LINE_JOIN_ROUND); + cairo_save(pCairo); + cairo_set_line_width(pCairo, 0.02); + cairo_set_source_rgba(pCairo, 1.0, 0.0, 0.0, 1.0); + test_poly_draw_array(pCairo, g_Test_Poly.pPointsArray); + cairo_stroke(pCairo); + cairo_restore(pCairo); + } cairo_save(pCairo); GArray* pSimplified = g_array_new(FALSE, FALSE, sizeof(mappoint_t)); @@ -156,54 +167,3 @@ static gboolean on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event g_array_free(pSimplified, TRUE); return TRUE; } - -// static void paint (GtkWidget *widget,GdkEventExpose *eev,gpointer data) -// { -// gint width, height; -// gint i; -// cairo_t *cr; -// -// width = widget->allocation.width; -// height = widget->allocation.height; -// -// cr = gdk_cairo_create (widget->window); -// -// /* clear background */ -// cairo_set_source_rgb (cr, 1,1,1); -// cairo_paint (cr); -// -// -// cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, -// CAIRO_FONT_WEIGHT_BOLD); -// -// /* enclosing in a save/restore pair since we alter the -// * font size -// */ -// cairo_save (cr); -// cairo_set_font_size (cr, 40); -// cairo_move_to (cr, 40, 60); -// cairo_set_source_rgb (cr, 0,0,0); -// cairo_show_text (cr, "Hello World"); -// cairo_restore (cr); -// -// cairo_set_source_rgb (cr, 1,0,0); -// cairo_set_font_size (cr, 20); -// cairo_move_to (cr, 50, 100); -// cairo_show_text (cr, "greetings from gtk and cairo"); -// -// cairo_set_source_rgb (cr, 0,0,1); -// -// cairo_move_to (cr, 0, 150); -// for (i=0; i< width/10; i++) -// { -// cairo_rel_line_to (cr, 5, 10); -// cairo_rel_line_to (cr, 5, -10); -// } -// cairo_stroke (cr); -// -// cairo_destroy (cr); -// } -// -// static gboolean on_expose_event(GtkWidget *pDrawingArea, GdkEventExpose *event, gpointer data) -// { -// } @@ -540,3 +540,9 @@ gchar* util_format_gdouble(gdouble d) g_ascii_dtostr(achBuffer, 20, d); return g_strdup(achBuffer); } + +void util_g_free_with_param(gpointer pMemory, gpointer _unused) +{ + g_assert(pMemory != NULL); + g_free(pMemory); +} @@ -87,5 +87,6 @@ gdouble util_get_percent_of_range(gint nMiddle, gint nA, gint nB); gchar* util_format_gdouble(gdouble d); +void util_g_free_with_param(gpointer pMemory, gpointer _unused); #endif |