Skip to content

Commit

Permalink
Remove trigger layer/half-drawn complexities as no longer relevant.
Browse files Browse the repository at this point in the history
Previously there was a concept of 'half drawn', an attempt to only draw layers necessary.
In order to do that, it would attempt to define a 'trigger layer' that would be first one needed to be drawn.
 and then use a saved pixmap (but a GTK2 only feature not imminently feasible in GTK3) for lower layers.
However this meant additional complexity in maintaining the trigger layer reference,
 and so since not relevant for GTK3, it is removed.
  • Loading branch information
rnorris committed Jan 18, 2025
1 parent 5c423d9 commit 8571b33
Show file tree
Hide file tree
Showing 10 changed files with 16 additions and 199 deletions.
35 changes: 7 additions & 28 deletions src/vikaggregatelayer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1324,42 +1324,21 @@ static void hm_draw ( VikAggregateLayer *val, VikViewport *vp )
}
}

/* Draw the aggregate layer. If vik viewport is in half_drawn mode, this means we are only
* to draw the layers above and including the trigger layer.
* To do this we don't draw any layers if in half drawn mode, unless we find the
* trigger layer, in which case we pull up the saved pixmap, turn off half drawn mode and
* start drawing layers.
* Also, if we were never in half drawn mode, we save a snapshot
* of the pixmap before drawing the trigger layer so we can use it again
* later.
/* Draw the aggregate layer.
* (And all layers within it)
* Previously there was a concept of 'half drawn', an attempt to only draw layers necessary.
* In order to do that, it would attempt to define a 'trigger layer' that would be first one needed to be drawn.
* and then use a saved pixmap (but a GTK2 only feature not imminently feasible in GTK3) for lower layers.
* However this meant additional complexity in maintaining the trigger layer reference,
* and so since not relevant for GTK3, it has been removed.
*/
void vik_aggregate_layer_draw ( VikAggregateLayer *val, VikViewport *vp )
{
GList *iter = val->children;
#if GTK_CHECK_VERSION (3,0,0)
// GTK3 Version does not use pixmaps, so no point in trigger layers ATM
while ( iter ) {
vik_layer_draw ( VIK_LAYER(iter->data), vp );
iter = iter->next;
}
#else
VikLayer *vl;
VikLayer *trigger = VIK_LAYER(vik_viewport_get_trigger( vp ));
while ( iter ) {
vl = VIK_LAYER(iter->data);
if ( vl == trigger ) {
if ( vik_viewport_get_half_drawn ( vp ) ) {
vik_viewport_set_half_drawn ( vp, FALSE );
vik_viewport_snapshot_load( vp );
} else {
vik_viewport_snapshot_save( vp );
}
}
if ( vl->type == VIK_LAYER_AGGREGATE || vl->type == VIK_LAYER_GPS || ! vik_viewport_get_half_drawn( vp ) )
vik_layer_draw ( vl, vp );
iter = iter->next;
}
#endif
// Make coverage to be drawn last (i.e. over the top of any maps)
if ( val->on[BASIC] ) {
tac_draw ( val, vp );
Expand Down
32 changes: 3 additions & 29 deletions src/vikgeocluelayer.c
Original file line number Diff line number Diff line change
Expand Up @@ -363,35 +363,9 @@ static void tracking_draw ( VikGeoclueLayer *vgl, VikViewport *vp )

static void geoclue_layer_draw ( VikGeoclueLayer *vgl, VikViewport *vp )
{
// NB I don't understand this half drawn business
// This is just copied from vikgpslayer.c
VikLayer *vl;
VikLayer *trigger = VIK_LAYER(vik_viewport_get_trigger( vp ));

vl = VIK_LAYER(vgl->trw);
if (vl == trigger) {
if ( vik_viewport_get_half_drawn ( vp ) ) {
vik_viewport_set_half_drawn ( vp, FALSE );
vik_viewport_snapshot_load( vp );
} else {
vik_viewport_snapshot_save( vp );
}
}
if ( !vik_viewport_get_half_drawn(vp) )
vik_layer_draw ( vl, vp );

if ( vgl->tracking ) {
if ( VIK_LAYER(vgl) == trigger ) {
if ( vik_viewport_get_half_drawn ( vp ) ) {
vik_viewport_set_half_drawn ( vp, FALSE );
vik_viewport_snapshot_load ( vp );
} else {
vik_viewport_snapshot_save ( vp );
}
}
if ( !vik_viewport_get_half_drawn(vp) )
tracking_draw ( vgl, vp );
}
VikLayer *vl = VIK_LAYER(vgl->trw);
vik_layer_draw ( vl, vp );
tracking_draw ( vgl, vp );
}

static void gcs_free ( VikGeoclueLayer *vgl )
Expand Down
24 changes: 2 additions & 22 deletions src/vikgpslayer.c
Original file line number Diff line number Diff line change
Expand Up @@ -778,33 +778,13 @@ static void gps_layer_draw ( VikGpsLayer *vgl, VikViewport *vp )
{
gint i;
VikLayer *vl;
VikLayer *trigger = VIK_LAYER(vik_viewport_get_trigger( vp ));

for (i = 0; i < NUM_TRW; i++) {
vl = VIK_LAYER(vgl->trw_children[i]);
if (vl == trigger) {
if ( vik_viewport_get_half_drawn ( vp ) ) {
vik_viewport_set_half_drawn ( vp, FALSE );
vik_viewport_snapshot_load( vp );
} else {
vik_viewport_snapshot_save( vp );
}
}
if (!vik_viewport_get_half_drawn(vp))
vik_layer_draw ( vl, vp );
vik_layer_draw ( vl, vp );
}
#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION)
if (vgl->realtime_tracking) {
if (VIK_LAYER(vgl) == trigger) {
if ( vik_viewport_get_half_drawn ( vp ) ) {
vik_viewport_set_half_drawn ( vp, FALSE );
vik_viewport_snapshot_load( vp );
} else {
vik_viewport_snapshot_save( vp );
}
}
if (!vik_viewport_get_half_drawn(vp))
realtime_tracking_draw(vgl, vp);
realtime_tracking_draw(vgl, vp);
}
#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */
}
Expand Down
9 changes: 2 additions & 7 deletions src/viklayer.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,6 @@ void vik_layer_redraw ( VikLayer *vl )
// Do nothing
return;

vik_window_set_redraw_trigger(vl);

// Only ever draw when there is time to do so
if ( g_thread_self() != thread ) {
// Drawing requested from another (background) thread, so handle via the gdk thread method
Expand All @@ -139,8 +137,6 @@ void vik_layer_emit_update ( VikLayer *vl, gboolean is_modified )
// Do nothing
return;

vik_window_set_redraw_trigger(vl);

// Notionally the 'refresh' function could be directly connected to the 'update' signal
// However we then have to manage the lifecycle (creation, copying, removing, etc...)
// ATM IMHO it's simpler to call/use the function here as we don't need
Expand Down Expand Up @@ -170,15 +166,14 @@ void vik_layer_emit_update ( VikLayer *vl, gboolean is_modified )

/**
* should only be done by VikLayersPanel (hence never used from the background)
* need to redraw and record trigger when we make a layer invisible.
* need to redraw when we make a layer invisible.
*/
void vik_layer_emit_update_although_invisible ( VikLayer *vl )
{
vik_window_set_redraw_trigger(vl);
(void)g_idle_add ( (GSourceFunc)idle_draw, vl );
}

/* doesn't set the trigger. should be done by aggregate layer when child emits update. */
/* should be done by aggregate layer when child emits update. */
void vik_layer_emit_update_secondary ( VikLayer *vl )
{
if ( vl->visible )
Expand Down
2 changes: 1 addition & 1 deletion src/viklayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ void vik_layer_layer_toggle_visible ( VikLayer *l );
/* TODO: put in layerspanel */
GdkPixbuf *vik_layer_load_icon ( VikLayerTypeEnum type );

void vik_layer_emit_update_secondary ( VikLayer *vl ); /* to be called by aggregate layer only. doesn't set the trigger */
void vik_layer_emit_update_secondary ( VikLayer *vl ); /* to be called by aggregate layer only.*/
void vik_layer_emit_update_although_invisible ( VikLayer *vl );

void vik_layer_expand_tree ( VikLayer *vl );
Expand Down
10 changes: 1 addition & 9 deletions src/viklayerspanel.c
Original file line number Diff line number Diff line change
Expand Up @@ -865,7 +865,7 @@ static void layers_item_toggled (VikLayersPanel *vlp, GtkTreeIter *iter)
vik_layer_layer_toggle_visible ( VIK_LAYER(p) );
if ( visible )
vik_layer_configure ( VIK_LAYER(p), vlp->vvp );
vik_layer_emit_update_although_invisible ( VIK_LAYER(p) ); /* set trigger for half-drawn */
vik_layer_emit_update_although_invisible ( VIK_LAYER(p) );
break;
case VIK_TREEVIEW_TYPE_SUBLAYER: {
VikLayer *vl = VIK_LAYER(vik_treeview_item_get_parent ( vlp->vt, iter ));
Expand Down Expand Up @@ -1169,10 +1169,6 @@ void vik_layers_panel_cut_selected ( VikLayersPanel *vlp )
VikAggregateLayer *parent = vik_treeview_item_get_parent ( vlp->vt, &iter );
if ( parent )
{
/* reset trigger if trigger deleted */
if ( vik_layers_panel_get_selected ( vlp ) == vik_viewport_get_trigger ( vlp->vvp ) )
vik_viewport_set_trigger ( vlp->vvp, NULL );

a_clipboard_copy_selected ( vlp );

if (IS_VIK_AGGREGATE_LAYER(parent)) {
Expand Down Expand Up @@ -1240,10 +1236,6 @@ void vik_layers_panel_delete_selected ( VikLayersPanel *vlp )
VikAggregateLayer *parent = vik_treeview_item_get_parent ( vlp->vt, &iter );
if ( parent )
{
/* reset trigger if trigger deleted */
if ( vik_layers_panel_get_selected ( vlp ) == vik_viewport_get_trigger ( vlp->vvp ) )
vik_viewport_set_trigger ( vlp->vvp, NULL );

if (IS_VIK_AGGREGATE_LAYER(parent)) {

g_signal_emit ( G_OBJECT(vlp), layers_panel_signals[VLP_DELETE_LAYER_SIGNAL], 0 );
Expand Down
61 changes: 0 additions & 61 deletions src/vikviewport.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,13 +120,6 @@ struct _VikViewport {
/* subset of coord types. lat lon can be plotted in 2 ways, google or exp. */
VikViewportDrawMode drawmode;

/* trigger stuff */
gpointer trigger;
#if !GTK_CHECK_VERSION (3,0,0)
GdkPixmap *snapshot_buffer;
#endif
gboolean half_drawn;

cairo_t *popup_crt;
cairo_surface_t *popup_surf;
gchar *popup_msg;
Expand Down Expand Up @@ -294,7 +287,6 @@ vik_viewport_init ( VikViewport *vvp )
vvp->draw_centermark = a_vik_get_startup_show_centermark();
vvp->draw_highlight = a_vik_get_startup_show_highlight();

vvp->trigger = NULL;
vvp->highlight_color = a_vik_get_startup_highlight_color();
#if GTK_CHECK_VERSION (3,0,0)
//(void)gdk_color_parse ( DEFAULT_BACKGROUND_COLOR, &(vvp->background_color) );
Expand All @@ -307,10 +299,7 @@ vik_viewport_init ( VikViewport *vvp )
gdk_rgba_free ( rgbaBC );
*/
//vik_viewport_set_background_color ( vvp, DEFAULT_BACKGROUND_COLOR );
#else
vvp->snapshot_buffer = NULL;
#endif
vvp->half_drawn = FALSE;

// Initiate center history
update_centers ( vvp );
Expand Down Expand Up @@ -488,11 +477,6 @@ void vik_viewport_configure_manually ( VikViewport *vvp, gint width, guint heigh
if ( vvp->scr_buffer )
g_object_unref ( G_OBJECT ( vvp->scr_buffer ) );
vvp->scr_buffer = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), vvp->width, vvp->height, -1 );

/* TODO trigger: only if this is enabled !!! */
if ( vvp->snapshot_buffer )
g_object_unref ( G_OBJECT ( vvp->snapshot_buffer ) );
vvp->snapshot_buffer = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), vvp->width, vvp->height, -1 );
#endif

configure_common ( vvp );
Expand Down Expand Up @@ -629,13 +613,6 @@ gboolean vik_viewport_configure ( VikViewport *vvp )
g_object_unref ( G_OBJECT ( vvp->scr_buffer ) );

vvp->scr_buffer = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), vvp->width, vvp->height, -1 );

/* TODO trigger: only if enabled! */
if ( vvp->snapshot_buffer )
g_object_unref ( G_OBJECT ( vvp->snapshot_buffer ) );

vvp->snapshot_buffer = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), vvp->width, vvp->height, -1 );
/* TODO trigger */
#endif

configure_common ( vvp );
Expand Down Expand Up @@ -674,8 +651,6 @@ static void viewport_finalize ( GObject *gob )
#if !GTK_CHECK_VERSION (3,0,0)
if ( vvp->scr_buffer )
g_object_unref ( G_OBJECT ( vvp->scr_buffer ) );
if ( vvp->snapshot_buffer )
g_object_unref ( G_OBJECT ( vvp->snapshot_buffer ) );
#else
if ( vvp->crt )
cairo_destroy ( vvp->crt );
Expand Down Expand Up @@ -1955,42 +1930,6 @@ VikViewportDrawMode vik_viewport_get_drawmode ( VikViewport *vvp )
return vvp->drawmode;
}

/******** triggering *******/
void vik_viewport_set_trigger ( VikViewport *vp, gpointer trigger )
{
vp->trigger = trigger;
}

gpointer vik_viewport_get_trigger ( VikViewport *vp )
{
return vp->trigger;
}

void vik_viewport_snapshot_save ( VikViewport *vp )
{
#if !GTK_CHECK_VERSION (3,0,0)
gdk_draw_drawable ( vp->snapshot_buffer, vp->background_gc, vp->scr_buffer, 0, 0, 0, 0, -1, -1 );
#endif
}

void vik_viewport_snapshot_load ( VikViewport *vp )
{
#if !GTK_CHECK_VERSION (3,0,0)
gdk_draw_drawable ( vp->scr_buffer, vp->background_gc, vp->snapshot_buffer, 0, 0, 0, 0, -1, -1 );
#endif
}

void vik_viewport_set_half_drawn(VikViewport *vp, gboolean half_drawn)
{
vp->half_drawn = half_drawn;
}

gboolean vik_viewport_get_half_drawn( VikViewport *vp )
{
return vp->half_drawn;
}


const gchar *vik_viewport_get_drawmode_name(VikViewport *vv, VikViewportDrawMode mode)
{
const gchar *name = NULL;
Expand Down
10 changes: 0 additions & 10 deletions src/vikviewport.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,16 +117,6 @@ void vik_viewport_set_drawmode ( VikViewport *vvp, VikViewportDrawMode drawmode
VikViewportDrawMode vik_viewport_get_drawmode ( VikViewport *vvp );
/* Do not forget to update vik_viewport_get_drawmode_name() if you modify VikViewportDrawMode */


/* Triggers */
void vik_viewport_set_trigger ( VikViewport *vp, gpointer trigger );
gpointer vik_viewport_get_trigger ( VikViewport *vp );
void vik_viewport_snapshot_save ( VikViewport *vp );
void vik_viewport_snapshot_load ( VikViewport *vp );
void vik_viewport_set_half_drawn(VikViewport *vp, gboolean half_drawn);
gboolean vik_viewport_get_half_drawn( VikViewport *vp );


/***************************************************************************************************
* Drawing-related operations
***************************************************************************************************/
Expand Down
30 changes: 0 additions & 30 deletions src/vikwindow.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,9 +259,6 @@ struct _VikWindow {
GtkUIManager *uim;

GThread *thread;
/* half-drawn update */
VikLayer *trigger;
VikCoord trigger_center;

/* Store at this level for highlighted selection drawing since it applies to the viewport and the layers panel */
/* Only one of these items can be selected at the same time */
Expand Down Expand Up @@ -1886,13 +1883,6 @@ static void draw_status ( VikWindow *vw )
draw_status_tool ( vw );
}

void vik_window_set_redraw_trigger(VikLayer *vl)
{
VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vl));
if (NULL != vw)
vw->trigger = vl;
}

/**
* If graphs shown, then scale pane according to saved value
*/
Expand Down Expand Up @@ -1968,24 +1958,6 @@ static gboolean window_configure_event ( VikWindow *vw, GdkEventConfigure *event

static void draw_redraw ( VikWindow *vw )
{
VikCoord old_center = vw->trigger_center;
vw->trigger_center = *(vik_viewport_get_center(vw->viking_vvp));
VikLayer *new_trigger = vw->trigger;
vw->trigger = NULL;
gpointer gp = vik_viewport_get_trigger ( vw->viking_vvp );
VikLayer *old_trigger = NULL;
if ( !gp )
vik_viewport_set_trigger ( vw->viking_vvp, new_trigger );
else
old_trigger = VIK_LAYER(gp);

if ( ! new_trigger )
; /* do nothing -- have to redraw everything. */
else if ( (old_trigger != new_trigger) || !vik_coord_equals(&old_center, &vw->trigger_center) || (new_trigger->type == VIK_LAYER_AGGREGATE) )
vik_viewport_set_trigger ( vw->viking_vvp, new_trigger ); /* todo: set to half_drawn mode if new trigger is above old */
else
vik_viewport_set_half_drawn ( vw->viking_vvp, TRUE );

/* actually draw */
vik_viewport_clear ( vw->viking_vvp);
// Main layer drawing
Expand All @@ -2007,8 +1979,6 @@ static void draw_redraw ( VikWindow *vw )
vik_viewport_draw_copyright ( vw->viking_vvp );
vik_viewport_draw_centermark ( vw->viking_vvp );
vik_viewport_draw_logo ( vw->viking_vvp );

vik_viewport_set_half_drawn ( vw->viking_vvp, FALSE ); /* just in case. */
}

gboolean draw_buf_done = TRUE;
Expand Down
2 changes: 0 additions & 2 deletions src/vikwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,6 @@ gboolean vik_window_save_file_as ( VikWindow *vw, gpointer val ); // gpointer is

void vik_window_statusbar_update (VikWindow *vw, const gchar* message, vik_statusbar_type_t vs_type);

void vik_window_set_redraw_trigger(struct _VikLayer *vl);

void vik_window_enable_layer_tool ( VikWindow *vw, gint layer_id, gint tool_id );

gpointer vik_window_get_selected_trw_layer ( VikWindow *vw ); /* return type VikTrwLayer */
Expand Down

0 comments on commit 8571b33

Please sign in to comment.