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/

Reply via email to