+static void trw_layer_draw ( VikTrwLayer *l, gpointer data )
+{
+ // If this layer is to be highlighted - then don't draw now - as it will be drawn later on in the specific highlight draw stage
+ // This may seem slightly inefficient to test each time for every layer
+ // but for a layer with *lots* of tracks & waypoints this can save some effort by not drawing the items twice
+ if ( vik_viewport_get_draw_highlight ( (VikViewport*)data ) &&
+ vik_window_get_selected_trw_layer ((VikWindow*)VIK_GTK_WINDOW_FROM_LAYER((VikLayer*)l)) == l )
+ return;
+ trw_layer_draw_with_highlight ( l, data, FALSE );
+}
+
+void vik_trw_layer_draw_highlight ( VikTrwLayer *vtl, VikViewport *vvp )
+{
+ // Check the layer for visibility (including all the parents visibilities)
+ if ( !vik_treeview_item_get_visible_tree (VIK_LAYER(vtl)->vt, &(VIK_LAYER(vtl)->iter)) )
+ return;
+ trw_layer_draw_with_highlight ( vtl, vvp, TRUE );
+}
+
+/**
+ * vik_trw_layer_draw_highlight_item:
+ *
+ * Only handles a single track or waypoint ATM
+ * It assumes the track or waypoint belongs to the TRW Layer (it doesn't check this is the case)
+ */
+void vik_trw_layer_draw_highlight_item ( VikTrwLayer *vtl, VikTrack *trk, VikWaypoint *wpt, VikViewport *vvp )
+{
+ // Check the layer for visibility (including all the parents visibilities)
+ if ( !vik_treeview_item_get_visible_tree (VIK_LAYER(vtl)->vt, &(VIK_LAYER(vtl)->iter)) )
+ return;
+
+ static struct DrawingParams dp;
+ init_drawing_params ( &dp, vtl, vvp, TRUE );
+
+ if ( trk ) {
+ gboolean draw = ( trk->is_route && vtl->routes_visible ) || ( !trk->is_route && vtl->tracks_visible );
+ if ( draw )
+ trw_layer_draw_track_cb ( NULL, trk, &dp );
+ }
+ if ( vtl->waypoints_visible && wpt ) {
+ trw_layer_draw_waypoint_cb ( NULL, wpt, &dp );
+ }
+}
+
+/**
+ * vik_trw_layer_draw_highlight_item:
+ *
+ * Generally for drawing all tracks or routes or waypoints
+ * trks may be actually routes
+ * It assumes they belong to the TRW Layer (it doesn't check this is the case)
+ */
+void vik_trw_layer_draw_highlight_items ( VikTrwLayer *vtl, GHashTable *trks, GHashTable *wpts, VikViewport *vvp )
+{
+ // Check the layer for visibility (including all the parents visibilities)
+ if ( !vik_treeview_item_get_visible_tree (VIK_LAYER(vtl)->vt, &(VIK_LAYER(vtl)->iter)) )
+ return;
+
+ static struct DrawingParams dp;
+ init_drawing_params ( &dp, vtl, vvp, TRUE );
+
+ if ( trks ) {
+ gboolean is_routes = (trks == vtl->routes);
+ gboolean draw = ( is_routes && vtl->routes_visible ) || ( !is_routes && vtl->tracks_visible );
+ if ( draw )
+ g_hash_table_foreach ( trks, (GHFunc) trw_layer_draw_track_cb, &dp );
+ }
+
+ if ( vtl->waypoints_visible && wpts )
+ g_hash_table_foreach ( wpts, (GHFunc) trw_layer_draw_waypoint_cb, &dp );
+}
+