- gint a, b;
-
- vik_coord_load_from_latlon(&tmp, vik_viewport_get_coord_mode(vp), &counter);
- vik_viewport_coord_to_screen(vp, &tmp, &a, &b);
- if(vdl->type == DEM_TYPE_GRADIENT) {
- if( elev == VIK_DEM_INVALID_ELEVATION ) {
- /* don't draw it */
- } else {
- // calculate gradient, but only in two orthogonal directions.
- gint16 change = 0;
- gint16 newelev;
-
- // down
- if(y+1 == column->n_points)
- newelev = column->points[y-1];
- else
- newelev = column->points[y+1];
- if(newelev != VIK_DEM_INVALID_ELEVATION)
- change += abs(newelev - elev);
-
- // down + right
- if(y+1 == nextcolumn->n_points)
- newelev = nextcolumn->points[y-1];
- else
- newelev = nextcolumn->points[y+1];
- if(newelev != VIK_DEM_INVALID_ELEVATION)
- change += abs(newelev - elev);
-
- // right
- newelev = nextcolumn->points[y];
- if(newelev != VIK_DEM_INVALID_ELEVATION)
- change += abs(newelev - elev);
-
- // up + right
- if(y <= 1)
- newelev = nextcolumn->points[y+1];
- else
- newelev = nextcolumn->points[y-1];
- if(newelev != VIK_DEM_INVALID_ELEVATION)
- change += abs(newelev - elev);
-
- change = log(change) * log(change) * log(change);
-
- if(change < vdl->min_elev)
- change = 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, a-2, b-2, 4, 4 );
- }
+ 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);
+ }