Remove unused line thickness property (although 'used' in setting up GCs, no actual line drawing takes place so the value is irrelevant). Change the colour property from a string to a proper GdkGC, so one can use the colour picker to choose the colour. The default is blue. Use this colour for height's less than then the minimum elevation property (as well as specifically for zero). Remove the unused single GC. --- src/vikdemlayer.c | 70 ++++++++++++++++------------------------------------ 1 files changed, 22 insertions(+), 48 deletions(-)
diff --git a/src/vikdemlayer.c b/src/vikdemlayer.c index 4061399..ed02752 100644 --- a/src/vikdemlayer.c +++ b/src/vikdemlayer.c @@ -69,12 +69,12 @@ #define DEM24K_DOWNLOAD_SCRIPT "dem24k.pl" #endif +#define UNUSED_LINE_THICKNESS 3 static void dem_layer_marshall( VikDEMLayer *vdl, guint8 **data, gint *len ); static VikDEMLayer *dem_layer_unmarshall( guint8 *data, gint len, VikViewport *vvp ); static gboolean dem_layer_set_param ( VikDEMLayer *vdl, guint16 id, VikLayerParamData data, VikViewport *vp, gboolean is_file_operation ); static VikLayerParamData dem_layer_get_param ( VikDEMLayer *vdl, guint16 id, gboolean is_file_operation ); -static void dem_layer_update_gc ( VikDEMLayer *vdl, VikViewport *vp, const gchar *color ); static void dem_layer_post_read ( VikLayer *vl, VikViewport *vp, gboolean from_file ); static void srtm_draw_existence ( VikViewport *vp ); @@ -86,7 +86,6 @@ static void dem24k_draw_existence ( VikViewport *vp ); static VikLayerParamScale param_scales[] = { { 0, 30000, 10, 1 }, { 1, 30000, 10, 1 }, - { 1, 10, 1, 0 }, }; static gchar *params_source[] = { @@ -119,15 +118,14 @@ enum { DEM_TYPE_HEIGHT = 0, static VikLayerParam dem_layer_params[] = { { "files", VIK_LAYER_PARAM_STRING_LIST, VIK_LAYER_GROUP_NONE, N_("DEM Files:"), VIK_LAYER_WIDGET_FILELIST }, { "source", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Download Source:"), VIK_LAYER_WIDGET_RADIOGROUP_STATIC, params_source, NULL }, - { "color", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Color:"), VIK_LAYER_WIDGET_ENTRY }, + { "color", VIK_LAYER_PARAM_COLOR, VIK_LAYER_GROUP_NONE, N_("Min Elev Color:"), VIK_LAYER_WIDGET_COLOR, 0 }, { "type", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Type:"), VIK_LAYER_WIDGET_RADIOGROUP_STATIC, params_type, NULL }, { "min_elev", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Min Elev:"), VIK_LAYER_WIDGET_SPINBUTTON, param_scales + 0 }, { "max_elev", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Max Elev:"), VIK_LAYER_WIDGET_SPINBUTTON, param_scales + 0 }, - { "line_thickness", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Line Thickness:"), VIK_LAYER_WIDGET_SPINBUTTON, param_scales + 1 }, }; -enum { PARAM_FILES=0, PARAM_SOURCE, PARAM_COLOR, PARAM_TYPE, PARAM_MIN_ELEV, PARAM_MAX_ELEV, PARAM_LINE_THICKNESS, NUM_PARAMS }; +enum { PARAM_FILES=0, PARAM_SOURCE, PARAM_COLOR, PARAM_TYPE, PARAM_MIN_ELEV, PARAM_MAX_ELEV, NUM_PARAMS }; static gpointer dem_layer_download_create ( VikWindow *vw, VikViewport *vvp); static gboolean dem_layer_download_release ( VikDEMLayer *vdl, GdkEventButton *event, VikViewport *vvp ); @@ -140,9 +138,11 @@ static VikToolInterface dem_tools[] = { }; -/* +/* HEIGHT COLORS + The first entry is blue for a default 'sea' colour, + however the value used by the corresponding gc can be configured as part of the DEM layer properties. + The other colours, shaded from brown to white are used to give an indication of height. */ - static gchar *dem_height_colors[] = { "#0000FF", "#9b793c", "#9c7d40", "#9d8144", "#9e8549", "#9f894d", "#a08d51", "#a29156", "#a3955a", "#a4995e", "#a69d63", @@ -231,14 +231,12 @@ VikLayerInterface vik_dem_layer_interface = { struct _VikDEMLayer { VikLayer vl; - GdkGC *gc; GdkGC **gcs; GdkGC **gcsgradient; GList *files; gdouble min_elev; gdouble max_elev; - guint8 line_thickness; - gchar *color; + GdkGC *color; guint source; guint type; }; @@ -279,10 +277,10 @@ static VikDEMLayer *dem_layer_unmarshall( guint8 *data, gint len, VikViewport *v /* TODO: share GCS between layers */ for ( i = 0; i < DEM_N_HEIGHT_COLORS; i++ ) - rv->gcs[i] = vik_viewport_new_gc ( vvp, dem_height_colors[i], rv->line_thickness ); + rv->gcs[i] = vik_viewport_new_gc ( vvp, dem_height_colors[i], UNUSED_LINE_THICKNESS ); for ( i = 0; i < DEM_N_GRADIENT_COLORS; i++ ) - rv->gcsgradient[i] = vik_viewport_new_gc ( vvp, dem_gradient_colors[i], rv->line_thickness ); + rv->gcsgradient[i] = vik_viewport_new_gc ( vvp, dem_gradient_colors[i], UNUSED_LINE_THICKNESS ); vik_layer_unmarshall_params ( VIK_LAYER(rv), data, len, vvp ); return rv; @@ -292,7 +290,7 @@ gboolean dem_layer_set_param ( VikDEMLayer *vdl, guint16 id, VikLayerParamData d { switch ( id ) { - case PARAM_COLOR: if ( vdl->color ) g_free ( vdl->color ); vdl->color = g_strdup ( data.s ); break; + case PARAM_COLOR: gdk_gc_set_rgb_fg_color ( vdl->gcs[0], &(data.c) ); break; case PARAM_SOURCE: vdl->source = data.u; break; case PARAM_TYPE: vdl->type = data.u; break; case PARAM_MIN_ELEV: @@ -311,7 +309,6 @@ gboolean dem_layer_set_param ( VikDEMLayer *vdl, guint16 id, VikLayerParamData d else vdl->max_elev = data.d; break; - case PARAM_LINE_THICKNESS: if ( data.u >= 1 && data.u <= 15 ) vdl->line_thickness = data.u; break; case PARAM_FILES: a_dems_load_list ( &(data.sl) ); a_dems_list_free ( vdl->files ); vdl->files = data.sl; break; } return TRUE; @@ -325,7 +322,7 @@ static VikLayerParamData dem_layer_get_param ( VikDEMLayer *vdl, guint16 id, gbo case PARAM_FILES: rv.sl = vdl->files; break; case PARAM_SOURCE: rv.u = vdl->source; break; case PARAM_TYPE: rv.u = vdl->type; break; - case PARAM_COLOR: rv.s = vdl->color ? vdl->color : ""; break; + case PARAM_COLOR: vik_gc_get_fg_color ( vdl->gcs[0], &(rv.c) ); break; case PARAM_MIN_ELEV: /* Convert for display in desired units NB file operation always in internal units (metres) */ @@ -342,18 +339,13 @@ static VikLayerParamData dem_layer_get_param ( VikDEMLayer *vdl, guint16 id, gbo else rv.d = vdl->max_elev; break; - case PARAM_LINE_THICKNESS: rv.i = vdl->line_thickness; break; } return rv; } static void dem_layer_post_read ( VikLayer *vl, VikViewport *vp, gboolean from_file ) { - VikDEMLayer *vdl = VIK_DEM_LAYER(vl); - if ( vdl->gc ) - g_object_unref ( G_OBJECT(vdl->gc) ); - - vdl->gc = vik_viewport_new_gc ( vp, vdl->color, vdl->line_thickness ); + /* nothing ATM, but keep in case it's needed the future */ } VikDEMLayer *vik_dem_layer_new ( ) @@ -364,9 +356,6 @@ VikDEMLayer *vik_dem_layer_new ( ) vdl->files = NULL; - - vdl->gc = NULL; - vdl->gcs = g_malloc(sizeof(GdkGC *)*DEM_N_HEIGHT_COLORS); vdl->gcsgradient = g_malloc(sizeof(GdkGC *)*DEM_N_GRADIENT_COLORS); /* make new gcs only if we need it (copy layer -> use old) */ @@ -375,8 +364,6 @@ VikDEMLayer *vik_dem_layer_new ( ) vdl->max_elev = 1000.0; vdl->source = DEM_SOURCE_SRTM; vdl->type = DEM_TYPE_HEIGHT; - vdl->line_thickness = 3; - vdl->color = NULL; return vdl; } @@ -549,10 +536,13 @@ static void vik_dem_layer_draw_dem ( VikDEMLayer *vdl, VikViewport *vp, VikDEM * if(box_width < 0 || box_height < 0) continue; // skip this. this is out of our viewport anyway. FIXME: why? + gboolean below_minimum = FALSE; if(vdl->type == DEM_TYPE_HEIGHT) { - if ( elev != VIK_DEM_INVALID_ELEVATION && elev < vdl->min_elev ) + if ( elev != VIK_DEM_INVALID_ELEVATION && elev < vdl->min_elev ) { // Prevent 'elev - vdl->min_elev' from being negative so can safely use as array index elev = ceil ( vdl->min_elev ); + below_minimum = TRUE; + } if ( elev != VIK_DEM_INVALID_ELEVATION && elev > vdl->max_elev ) elev = vdl->max_elev; } @@ -603,7 +593,8 @@ static void vik_dem_layer_draw_dem ( VikDEMLayer *vdl, VikViewport *vp, VikDEM * if(vdl->type == DEM_TYPE_HEIGHT) { if ( elev == VIK_DEM_INVALID_ELEVATION ) ; /* don't draw it */ - else if ( elev <= 0 ) + else if ( elev <= 0 || below_minimum ) + /* If 'sea' colour or below the defined mininum draw in the configurable colour */ vik_viewport_draw_rectangle(vp, vdl->gcs[0], TRUE, box_x, box_y, box_width, box_height); else vik_viewport_draw_rectangle(vp, vdl->gcs[(gint)floor(((elev - vdl->min_elev)/(vdl->max_elev - vdl->min_elev))*(DEM_N_HEIGHT_COLORS-2))+1], TRUE, box_x, box_y, box_width, box_height); @@ -757,11 +748,8 @@ void vik_dem_layer_draw ( VikDEMLayer *vdl, gpointer data ) void vik_dem_layer_free ( VikDEMLayer *vdl ) { gint i; - if ( vdl->gc != NULL ) - g_object_unref ( G_OBJECT(vdl->gc) ); - if ( vdl->color != NULL ) - g_free ( vdl->color ); + g_object_unref ( vdl->color ); if ( vdl->gcs ) for ( i = 0; i < DEM_N_HEIGHT_COLORS; i++ ) @@ -776,19 +764,6 @@ void vik_dem_layer_free ( VikDEMLayer *vdl ) a_dems_list_free ( vdl->files ); } -static void dem_layer_update_gc ( VikDEMLayer *vdl, VikViewport *vp, const gchar *color ) -{ - if ( vdl->color ) - g_free ( vdl->color ); - - vdl->color = g_strdup ( color ); - - if ( vdl->gc ) - g_object_unref ( G_OBJECT(vdl->gc) ); - - vdl->gc = vik_viewport_new_gc ( vp, vdl->color, vdl->line_thickness ); -} - VikDEMLayer *vik_dem_layer_create ( VikViewport *vp ) { VikDEMLayer *vdl = vik_dem_layer_new (); @@ -796,12 +771,11 @@ VikDEMLayer *vik_dem_layer_create ( VikViewport *vp ) /* TODO: share GCS between layers */ for ( i = 0; i < DEM_N_HEIGHT_COLORS; i++ ) - vdl->gcs[i] = vik_viewport_new_gc ( vp, dem_height_colors[i], vdl->line_thickness ); + vdl->gcs[i] = vik_viewport_new_gc ( vp, dem_height_colors[i], UNUSED_LINE_THICKNESS ); for ( i = 0; i < DEM_N_GRADIENT_COLORS; i++ ) - vdl->gcsgradient[i] = vik_viewport_new_gc ( vp, dem_gradient_colors[i], vdl->line_thickness ); + vdl->gcsgradient[i] = vik_viewport_new_gc ( vp, dem_gradient_colors[i], UNUSED_LINE_THICKNESS ); - dem_layer_update_gc ( vdl, vp, "red" ); return vdl; } /************************************************************** -- 1.7.1 ------------------------------------------------------------------------------ Nokia and AT&T present the 2010 Calling All Innovators-North America contest Create new apps & games for the Nokia N8 for consumers in U.S. and Canada $10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store http://p.sf.net/sfu/nokia-dev2dev _______________________________________________ Viking-devel mailing list Viking-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/viking-devel Viking home page: http://viking.sf.net/