+ // calculate bounding box for drawing
+ gint box_x, box_y, box_width, box_height;
+ struct LatLon box_c;
+ box_c = counter;
+ box_c.lat += (nscale_deg * skip_factor)/2;
+ box_c.lon -= (escale_deg * skip_factor)/2;
+ vik_coord_load_from_latlon(&tmp, vik_viewport_get_coord_mode(vp), &box_c);
+ vik_viewport_coord_to_screen(vp, &tmp, &box_x, &box_y);
+ // catch box at borders
+ if(box_x < 0)
+ box_x = 0;
+ if(box_y < 0)
+ box_y = 0;
+ box_c.lat -= nscale_deg * skip_factor;
+ box_c.lon += escale_deg * skip_factor;
+ vik_coord_load_from_latlon(&tmp, vik_viewport_get_coord_mode(vp), &box_c);
+ vik_viewport_coord_to_screen(vp, &tmp, &box_width, &box_height);
+ box_width -= box_x;
+ box_height -= box_y;
+ // catch box at borders
+ 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 ) {
+ // 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;
+ }
+
+ {
+ if(box_width < 0 || box_height < 0) // FIXME: why does this happen?
+ continue;
+
+ if(vdl->type == DEM_TYPE_GRADIENT) {
+ if( elev == VIK_DEM_INVALID_ELEVATION ) {
+ /* don't draw it */
+ } else {
+ // calculate and sum gradient in all directions
+ gint16 change = 0;
+ gint32 new_y;
+
+ // calculate gradient from height points all around the current one
+ new_y = y - gradient_skip_factor;
+ if(new_y < 0)
+ new_y = y;
+ change += get_height_difference(elev, prevcolumn->points[new_y]);
+ change += get_height_difference(elev, column->points[new_y]);
+ change += get_height_difference(elev, nextcolumn->points[new_y]);
+
+ change += get_height_difference(elev, prevcolumn->points[y]);
+ change += get_height_difference(elev, nextcolumn->points[y]);
+
+ new_y = y + gradient_skip_factor;
+ if(new_y >= column->n_points)
+ new_y = y;
+ change += get_height_difference(elev, prevcolumn->points[new_y]);
+ change += get_height_difference(elev, column->points[new_y]);
+ change += get_height_difference(elev, nextcolumn->points[new_y]);
+
+ change = change / ((skip_factor > 1) ? log(skip_factor) : 0.55); // FIXME: better calc.
+
+ if(change < vdl->min_elev)
+ // Prevent 'change - vdl->min_elev' from being negative so can safely use as array index
+ change = ceil ( vdl->min_elev );
+
+ if(change > vdl->max_elev)
+ change = vdl->max_elev;
+
+ // void vik_viewport_draw_rectangle ( VikViewport *vvp, GdkGC *gc, gboolean filled, gint x1, gint y1, gint x2, gint y2 );
+ vik_viewport_draw_rectangle(vp, vdl->gcsgradient[(gint)floor(((change - vdl->min_elev)/(vdl->max_elev - vdl->min_elev))*(DEM_N_GRADIENT_COLORS-2))+1], TRUE, box_x, box_y, box_width, box_height);
+ }
+ } else {
+ if(vdl->type == DEM_TYPE_HEIGHT) {
+ if ( elev == VIK_DEM_INVALID_ELEVATION )
+ ; /* don't draw it */
+ 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);
+ }
+ }