--- trunk/src/osm-gps-map-osd-classic.c 2009/10/19 13:02:41 136 +++ trunk/src/osm-gps-map-osd-classic.c 2009/10/27 13:28:41 146 @@ -135,6 +135,8 @@ #define CLOSE_BUTTON_RADIUS (BALLOON_CORNER_RADIUS) +#define FIN printf("entering function %s\n", __func__); +#define FOUT printf("leaving function %s\n", __func__); /* draw the bubble shape. this is used twice, once for the shape and once */ /* for the shadow */ @@ -142,6 +144,8 @@ osm_gps_map_draw_balloon_shape (cairo_t *cr, int x0, int y0, int x1, int y1, gboolean bottom, int px, int py, int px0, int px1) { + FIN; + cairo_move_to (cr, x0, y0 + BALLOON_CORNER_RADIUS); cairo_arc (cr, x0 + BALLOON_CORNER_RADIUS, y0 + BALLOON_CORNER_RADIUS, BALLOON_CORNER_RADIUS, -M_PI, -M_PI/2); @@ -170,10 +174,14 @@ BALLOON_CORNER_RADIUS, M_PI/2, M_PI); cairo_close_path (cr); + + FOUT; } static void osd_render_balloon(osm_gps_map_osd_t *osd) { + FIN; + osd_priv_t *priv = (osd_priv_t*)osd->priv; /* get zoom */ @@ -284,6 +292,8 @@ } cairo_destroy(cr); + + FOUT; } /* return true if balloon is being displayed and if */ @@ -291,6 +301,8 @@ static gboolean osd_balloon_check(osm_gps_map_osd_t *osd, gboolean click, gboolean down, gint x, gint y) { + FIN; + osd_priv_t *priv = (osd_priv_t*)osd->priv; if(!priv->balloon.surface) @@ -340,11 +352,13 @@ priv->balloon.cb(&event, priv->balloon.data); } } - + FOUT; return is_in; } void osm_gps_map_osd_clear_balloon (OsmGpsMap *map) { + FIN; + g_return_if_fail (OSM_IS_GPS_MAP (map)); osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map); @@ -360,11 +374,13 @@ priv->balloon.lon = OSM_GPS_MAP_INVALID; } osm_gps_map_redraw(map); + FOUT; } void osm_gps_map_osd_draw_balloon (OsmGpsMap *map, float latitude, float longitude, OsmGpsMapBalloonCallback cb, gpointer data) { + FIN; g_return_if_fail (OSM_IS_GPS_MAP (map)); osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map); @@ -391,6 +407,7 @@ osd_render_balloon(osd); osm_gps_map_redraw(map); + FOUT; } #endif // OSD_BALLOON @@ -535,6 +552,7 @@ static gboolean osm_gps_map_in_circle(gint x, gint y, gint cx, gint cy, gint rad) { + FIN; return( pow(cx - x, 2) + pow(cy - y, 2) < rad * rad); } @@ -625,7 +643,7 @@ /* internal value to draw the arrow on the "puller" */ #define OSD_S_D0 (OSD_S_RAD/2) #ifndef OSD_FONT_SIZE -#define OSD_FONT_SIZE 16.0 +#define OSD_FONT_SIZE (16.0) #endif #define OSD_TEXT_BORDER (OSD_FONT_SIZE/2) #define OSD_TEXT_SKIP (OSD_FONT_SIZE/8) @@ -733,6 +751,8 @@ static void osd_render_source_sel(osm_gps_map_osd_t *osd, gboolean force_rerender) { + FIN; + osd_priv_t *priv = (osd_priv_t*)osd->priv; if(priv->source_sel.rendered && !force_rerender) @@ -779,12 +799,14 @@ cairo_stroke (cr); cairo_destroy(cr); + FOUT; } /* re-allocate the buffer used to draw the menu. This is used */ /* to collapse/expand the buffer */ static void osd_source_reallocate(osm_gps_map_osd_t *osd) { + FIN; osd_priv_t *priv = (osd_priv_t*)osd->priv; /* re-allocate offscreen bitmap */ @@ -825,12 +847,14 @@ cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w+2, h+2); osd_render_source_sel(osd, TRUE); + FOUT; } #define OSD_HZ 15 #define OSD_TIME 500 static gboolean osd_source_animate(gpointer data) { + FIN; osm_gps_map_osd_t *osd = (osm_gps_map_osd_t*)data; osd_priv_t *priv = (osd_priv_t*)osd->priv; int diff = OSD_S_EXP_W - OSD_S_W - OSD_S_X; @@ -869,6 +893,7 @@ if(done) priv->source_sel.handler_id = 0; + FOUT; return !done; } @@ -876,6 +901,7 @@ static void osd_source_toggle(osm_gps_map_osd_t *osd) { + FIN; osd_priv_t *priv = (osd_priv_t*)osd->priv; /* ignore clicks while animation is running */ @@ -901,11 +927,13 @@ /* start timer to handle animation */ priv->source_sel.handler_id = gtk_timeout_add(OSD_TIME/OSD_HZ, osd_source_animate, osd); + FOUT; } /* check if the user clicked inside the source selection area */ static osd_button_t osd_source_check(osm_gps_map_osd_t *osd, gboolean down, gint x, gint y) { + FIN; osd_priv_t *priv = (osd_priv_t*)osd->priv; if(!priv->source_sel.expanded) @@ -963,19 +991,21 @@ osm_gps_map_repaint(OSM_GPS_MAP(osd->widget)); } } - + /* return "clicked in OSD background" to prevent further */ /* processing by application */ return OSD_BG; } } + FOUT; return OSD_NONE; } #endif // OSD_SOURCE_SEL static osd_button_t osd_check_int(osm_gps_map_osd_t *osd, gboolean click, gboolean down, gint x, gint y) { + FIN; osd_button_t but = OSD_NONE; #ifdef OSD_BALLOON @@ -1021,6 +1051,7 @@ } #endif + FOUT; return but; } @@ -1097,7 +1128,7 @@ #ifdef OSD_COORDINATES #ifndef OSD_COORDINATES_FONT_SIZE -#define OSD_COORDINATES_FONT_SIZE 12 +#define OSD_COORDINATES_FONT_SIZE (12.0) #endif #define OSD_COORDINATES_OFFSET (OSD_COORDINATES_FONT_SIZE/6) @@ -1164,18 +1195,57 @@ /* render a string at the given screen position */ static int osd_render_centered_text(cairo_t *cr, int y, int width, char *text) { - char *p = g_strdup(text); + FIN; + + printf("params: %p %d %d %p\n", cr, y, width, text); // XXX + + if(!text) return y; + + printf("text given: %s\n", text); // XXX + + char *p = g_malloc(strlen(text)+4); // space for "...\n" + strcpy(p, text); + cairo_text_extents_t extents; + + printf("test extents of \"abc\"\n"); + memset(&extents, 0, sizeof(cairo_text_extents_t)); + cairo_text_extents (cr, "abc", &extents); + printf("-> %f\n", extents.width); + + printf("test extents of \"49 00.000\"\n"); + memset(&extents, 0, sizeof(cairo_text_extents_t)); + cairo_text_extents (cr, "49 00.000", &extents); + printf("-> %f\n", extents.width); + + printf("test extents of \"49° 00.000\"\n"); + memset(&extents, 0, sizeof(cairo_text_extents_t)); + cairo_text_extents (cr, "49° 00.000", &extents); + printf("-> %f\n", extents.width); + + printf("getting extents for \"%s\"\n", p); // XXX + memset(&extents, 0, sizeof(cairo_text_extents_t)); cairo_text_extents (cr, p, &extents); + printf("initial extents.width = %f\n", extents.width); // XXX /* check if text needs to be truncated */ - int len = strlen(text)-2; + int trunc_at = strlen(text)-1; while(extents.width > width) { - len--; - strcpy(p+len, "..."); + g_assert(trunc_at > 0); + + printf("trunc at %d\n", trunc_at); // XXX + + trunc_at--; + strcpy(p+trunc_at, "..."); + printf("getting extents for \"%s\"\n", p); // XXX + + memset(&extents, 0, sizeof(cairo_text_extents_t)); cairo_text_extents (cr, p, &extents); + printf("extents.width = %f > %d\n", extents.width, width); // XXX } + printf("painting\n"); // XXX + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); cairo_set_line_width (cr, OSD_COORDINATES_FONT_SIZE/6); cairo_move_to (cr, (width - extents.width)/2, y - extents.y_bearing); @@ -1188,13 +1258,15 @@ g_free(p); - /* skip + 1/4 line */ - return y + 5*OSD_COORDINATES_FONT_SIZE/4; + /* skip + 1/5 line */ + FOUT; + return y + 6*OSD_COORDINATES_FONT_SIZE/5; } static void osd_render_coordinates(osm_gps_map_osd_t *osd) { + FIN; osd_priv_t *priv = (osd_priv_t*)osd->priv; /* get current map position */ @@ -1235,6 +1307,7 @@ g_free(longitude); cairo_destroy(cr); + FOUT; } #endif // OSD_COORDINATES @@ -1262,6 +1335,7 @@ static void osd_render_nav(osm_gps_map_osd_t *osd) { + FIN; osd_priv_t *priv = (osd_priv_t*)osd->priv; if(!priv->nav.surface || isnan(priv->nav.lat) || isnan(priv->nav.lon)) @@ -1366,9 +1440,11 @@ } cairo_destroy(cr); + FOUT; } void osm_gps_map_osd_clear_nav (OsmGpsMap *map) { + FIN; g_return_if_fail (OSM_IS_GPS_MAP (map)); osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map); @@ -1385,11 +1461,13 @@ if(priv->nav.name) g_free(priv->nav.name); } osm_gps_map_redraw(map); + FOUT; } void osm_gps_map_osd_draw_nav (OsmGpsMap *map, gboolean imperial, float latitude, float longitude, char *name) { + FIN; g_return_if_fail (OSM_IS_GPS_MAP (map)); osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map); @@ -1413,6 +1491,7 @@ osd_render_nav(osd); osm_gps_map_redraw(map); + FOUT; } #endif // OSD_NAV @@ -1431,6 +1510,7 @@ static void osd_render_crosshair_shape(cairo_t *cr) { + FIN; cairo_arc (cr, OSD_CROSSHAIR_W/2, OSD_CROSSHAIR_H/2, OSD_CROSSHAIR_RADIUS, 0, 2*M_PI); @@ -1449,11 +1529,13 @@ cairo_rel_line_to (cr, 0, OSD_CROSSHAIR_TICK); cairo_stroke (cr); + FOUT; } static void osd_render_crosshair(osm_gps_map_osd_t *osd) { + FIN; osd_priv_t *priv = (osd_priv_t*)osd->priv; if(priv->crosshair.rendered) @@ -1479,13 +1561,14 @@ osd_render_crosshair_shape(cr); cairo_destroy(cr); + FOUT; } #endif #ifdef OSD_SCALE #ifndef OSD_SCALE_FONT_SIZE -#define OSD_SCALE_FONT_SIZE 12 +#define OSD_SCALE_FONT_SIZE (12.0) #endif #define OSD_SCALE_W (10*OSD_SCALE_FONT_SIZE) #define OSD_SCALE_H (5*OSD_SCALE_FONT_SIZE/2) @@ -1500,6 +1583,7 @@ static void osd_render_scale(osm_gps_map_osd_t *osd) { + FIN; osd_priv_t *priv = (osd_priv_t*)osd->priv; /* this only needs to be rendered if the zoom has changed */ @@ -1623,12 +1707,14 @@ cairo_stroke(cr); cairo_destroy(cr); + FOUT; } #endif static void osd_render_controls(osm_gps_map_osd_t *osd) { + FIN; osd_priv_t *priv = (osd_priv_t*)osd->priv; if(priv->controls.rendered @@ -1902,11 +1988,13 @@ #endif cairo_destroy(cr); + FOUT; } static void osd_free(osm_gps_map_osd_t *osd) { + FIN; osd_priv_t *priv = (osd_priv_t *)(osd->priv); if (priv->controls.surface) @@ -1946,11 +2034,13 @@ #endif g_free(priv); + FOUT; } static gboolean osd_busy(osm_gps_map_osd_t *osd) { + FIN; #ifdef OSD_SOURCE_SEL osd_priv_t *priv = (osd_priv_t *)(osd->priv); return (priv->source_sel.handler_id != 0); @@ -1961,6 +2051,7 @@ static osd_button_t osd_check(osm_gps_map_osd_t *osd, gboolean down, gint x, gint y) { + FIN; return osd_check_int(osd, TRUE, down, x, y); } @@ -1983,6 +2074,7 @@ void osm_gps_map_osd_classic_init(OsmGpsMap *map) { + FIN; osd_priv_t *priv = osd_classic.priv = g_new0(osd_priv_t, 1); #ifdef OSD_BALLOON @@ -1993,6 +2085,7 @@ osd_classic.priv = priv; osm_gps_map_register_osd(map, &osd_classic); + FOUT; } #ifdef OSD_GPS_BUTTON @@ -2000,6 +2093,7 @@ /* but instead are to be used by the main application */ void osm_gps_map_osd_enable_gps (OsmGpsMap *map, OsmGpsMapOsdCallback cb, gpointer data) { + FIN; osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map); g_return_if_fail (osd); @@ -2011,11 +2105,13 @@ osd->render(osd); osm_gps_map_redraw(map); + FOUT; } #endif osd_button_t osm_gps_map_osd_check(OsmGpsMap *map, gint x, gint y) { + FIN; osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map); g_return_val_if_fail (osd, OSD_NONE);