summaryrefslogtreecommitdiffstats
path: root/draw.c
blob: f782ddda3a5908ca223347685bb4d5b847f89244 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "draw.h"
#include "level.h"
#include "geometry.h"
#include <gtk/gtk.h>
#include <cairo/cairo.h>


static double scale = 100.0;
static double xTranslate = 0.0, yTranslate = 0.0;


static void room2path(cairo_t *cr, ROOM *room, RECTANGLE *rect) {
  int i;
  ROOM room2 = {0, NULL};
  
  // no vertices
  if(room->nVertices == 0) return;
  
  if(rect)
    simplifyPolygon(room, rect, &room2);
  else
    room2 = *room;
  
  if(room2.nVertices == 0) return;
  
  cairo_new_sub_path(cr);
  
  for(i = 0; i < room2.nVertices; i++) {
    cairo_line_to(cr, room2.vertices[i].x, room2.vertices[i].y);
  }
  
  cairo_close_path(cr);
  
  if(rect && room2.vertices)
    free(room2.vertices);
}

gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, gpointer data) {
  VERTEX vertices[4] = {{-1,-1}, {-1,1}, {1,1}, {1,-1}};
  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};
  int i;
  
  
  cr = gdk_cairo_create(widget->window);
  
  gdk_cairo_region(cr, event->region);
  cairo_clip(cr);
  
  cairo_translate(cr, getImageWidth()/2-xTranslate, getImageHeight()/2-yTranslate);
  cairo_scale(cr, scale, scale);
  
  cairo_device_to_user(cr, &rect.x, &rect.y);
  cairo_device_to_user_distance(cr, &rect.width, &rect.height);
  
  cairo_set_line_width(cr, 1.0/scale);
  cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
  
  for(i = 0; i < lvl.nRooms; i++)
    room2path(cr, &lvl.rooms[i], &rect);
  
  cairo_set_source_rgba(cr, 0.0, 0.7, 1.0, 0.3);
  cairo_fill_preserve(cr);
  
  cairo_set_source_rgba(cr, 0.0, 0.7, 1.0, 0.7);
  cairo_stroke(cr);
  
  cairo_destroy (cr);
  
  return FALSE;
}

double getScale() {
  return scale;
}

void setScale(double s) {
  scale = s;
}

double getImageWidth() {
  return 5*scale;
}

double getImageHeight() {
  return 5*scale;
}

double getXTranslate() {
  return xTranslate;
}

void setXTranslate(double x) {
  xTranslate = x;
}

double getYTranslate() {
  return yTranslate;
}

void setYTranslate(double y) {
  yTranslate = y;
}