diff options
author | neoraider <devnull@localhost> | 2007-06-24 19:33:00 +0200 |
---|---|---|
committer | neoraider <devnull@localhost> | 2007-06-24 19:33:00 +0200 |
commit | a686a31daece494006e3ce841a5883472a0f412a (patch) | |
tree | 7536e62017177a5ca6c819069a75df25bd2f121a | |
parent | 4e9abadc47d96ed9bcfce49ad941570ef9b86922 (diff) | |
download | zoomedit-a686a31daece494006e3ce841a5883472a0f412a.tar zoomedit-a686a31daece494006e3ce841a5883472a0f412a.zip |
zoomedit: Added scales to grid.
-rw-r--r-- | draw.c | 46 |
1 files changed, 32 insertions, 14 deletions
@@ -3,6 +3,7 @@ #include "geometry.h" #include <math.h> #include <gtk/gtk.h> +#include <glib/gprintf.h> #include <cairo/cairo.h> @@ -14,31 +15,48 @@ static void drawGrid(cairo_t *cr, const RECTANGLE *rect) { double depth = log10(scale)-0.75; double depth2 = floor(depth); double step = pow(0.1, depth2); - double x; + double d; int i; + gchar buffer[10]; - cairo_set_source_rgb(cr, 0.2*(depth-depth2), 0.2*(depth-depth2), 0.2*(depth-depth2)); - for(i = 0; i < 3; i++) { - for(x = rect->x - fmod(rect->x, step); x <= rect->x+rect->width; x+=step) { - cairo_move_to(cr, x, rect->y); - cairo_line_to(cr, x, rect->y+rect->height); + cairo_set_font_size(cr, 10.0/scale); + + for(i = 0; 0.2*(depth-depth2+i-1) < 0.3; i++) { + d = MIN(0.2*(depth-depth2+i), 0.3); + cairo_set_source_rgb(cr, d, d, d); + + for(d = rect->x - fmod(rect->x, step) - step; d <= rect->x+rect->width; d+=step) { + cairo_move_to(cr, d, rect->y); + cairo_line_to(cr, d, rect->y+rect->height); cairo_stroke(cr); + + if(step > 0.2) + g_snprintf(buffer, sizeof(buffer), "%i", (int)rint(d)); + else + g_snprintf(buffer, sizeof(buffer), "%.*f", -(int)floor(log10(step*1.1)), d+step/10); + buffer[sizeof(buffer)-1] = '\0'; + cairo_move_to(cr, d+1/scale, rect->y+11/scale); + cairo_show_text(cr, buffer); } - for(x = rect->y - fmod(rect->y, step); x <= rect->y+rect->height; x+=step) { - cairo_move_to(cr, rect->x, x); - cairo_line_to(cr, rect->x+rect->width, x); + for(d = rect->y - fmod(rect->y, step) - step; d <= rect->y+rect->height; d+=step) { + cairo_move_to(cr, rect->x, d); + cairo_line_to(cr, rect->x+rect->width, d); cairo_stroke(cr); + + if(step > 0.5) + g_snprintf(buffer, sizeof(buffer), "%i", (int)rint(d)); + else + g_snprintf(buffer, sizeof(buffer), "%.*f", -(int)floor(log10(step*1.1)), d+step/10); + buffer[sizeof(buffer)-1] = '\0'; + cairo_move_to(cr, rect->x+3/scale, d+11/scale); + cairo_show_text(cr, buffer); } step *= 10; - if(i == 0 && 0.2*(depth-depth2+1) < 0.3) - cairo_set_source_rgb(cr, 0.2*(depth-depth2+1), 0.2*(depth-depth2+1), 0.2*(depth-depth2+1)); - else - cairo_set_source_rgb(cr, 0.3, 0.3, 0.3); } } @@ -73,7 +91,7 @@ gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, gpointer data) { ROOM room = {sizeof(vertices)/sizeof(vertices[0]), vertices}; LEVEL lvl = {1, &room}; cairo_t *cr; - RECTANGLE rect = {-5, -5, widget->allocation.width+10, widget->allocation.height+10}; + RECTANGLE rect = {-1, -1, widget->allocation.width+2, widget->allocation.height+2}; int i; |