42 GdkEventButton *event, gpointer user_data);
44 GdkEventExpose *event, gpointer user_data);
58 int w = size.width / scaled_size + 1;
59 int h = size.height / scaled_size + 1;
87 static gulong map_button_handler = 0;
103 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
114 LOG(
LOG_ERROR,
"map_init",
"Invalid faceset size from server");
140 cairo_set_source_surface(cr, pixmap->
map_image, dest_x, dest_y);
145 const int sx,
const int sy,
const int dx,
const int dy) {
150 cairo_set_source_surface(cr, pixmap->
map_image, dest_x - src_x, dest_y - src_y);
169 static void drawsmooth(cairo_t *cr,
int mx,
int my,
int layer,
int picx,
int picy) {
170 static int dx[8]= {0,1,1,1,0,-1,-1,-1};
171 static int dy[8]= {-1,-1,0,1,1,1,0,-1};
172 static int bweights[8]= {2,0,4,0,8,0,1,0};
173 static int cweights[8]= {0,2,0,4,0,8,0,1};
174 static int bc_exclude[8]= {
184 int partdone[8]= {0,0,0,0,0,0,0,0};
187 int i,weight,weightC;
191 for (i=0; i<=layer; i++) {
197 for (i=0; i<8; i++) {
218 for (i=0; i<8; i++) {
219 if ( (slevels[i]>0) && (!partdone[i]) &&
220 ((lowest<0) || (slevels[i]<slevels[lowest]))
240 for (i=0; i<8; i++) {
241 if ( (slevels[i]==slevels[lowest]) &&
242 (sfaces[i]==sfaces[lowest])) {
244 weight=weight+bweights[i];
245 weightC&=~bc_exclude[i];
248 weightC&=~cweights[i];
252 if (sfaces[lowest]<=0) {
255 smoothface=sfaces[lowest];
264 if ( (!
pixmaps[smoothface]->map_image) ||
282 static void map_draw_layer(cairo_t *cr,
int layer,
int mx_start,
int nx,
int my_start,
int ny) {
283 for (
int x = 0; x <= nx; x++) {
284 for (
int y = 0; y <= ny; y++) {
286 const int mx = mx_start + x;
287 const int my = my_start + y;
296 if (face > 0 &&
pixmaps[face]->map_image != NULL) {
316 static void draw_darkness(cairo_t *cr,
int nx,
int ny,
int mx_start,
int my_start) {
321 cairo_surface_t *cst_lm = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, nx+2, ny+2);
322 cairo_t *cr_lm = cairo_create(cst_lm);
323 for (
int x = -1; x <= nx+1; x++) {
324 for (
int y = -1; y <= ny+1; y++) {
325 const int dx =
MIN(MAX(0, x), nx);
326 const int dy =
MIN(MAX(0, y), ny);
329 const int mx = mx_start + dx;
330 const int my = my_start + dy;
333 const int ax = x + 1;
334 const int ay = y + 1;
336 cairo_rectangle(cr_lm, ax, ay, 1, 1);
341 cairo_destroy(cr_lm);
345 cairo_translate(cr, -1, -1);
346 cairo_set_source_surface(cr, cst_lm, 0, 0);
349 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
352 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_GOOD);
355 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BEST);
359 cairo_surface_destroy(cst_lm);
366 int x = mx - mx_start;
367 int y = my - my_start;
373 cairo_set_source_rgb(cr, 1, 0, 0);
375 cairo_set_source_rgb(cr, 1, 1, 0);
377 cairo_set_line_width(cr, 2);
380 cairo_set_source_rgb(cr, 0, 0, 0);
381 cairo_set_line_width(cr, 1);
399 const double ew = size.width / scale;
400 const double eh = size.height / scale;
413 const int mx_start = (nx > vw) ?
pl_pos.
x - (nx - vw)/2 :
pl_pos.
x;
414 const int my_start = (ny > vh) ?
pl_pos.
y - (ny - vh)/2 :
pl_pos.
y;
417 cairo_surface_t *cst = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ew, eh);
418 cairo_t *cr = cairo_create(cst);
421 cairo_set_source_rgb(cr, 0, 0, 0);
422 cairo_rectangle(cr, 0, 0, ew, eh);
430 for (
int layer = 0; layer <
MAXLAYERS; layer++) {
442 cairo_t *map_cr = gdk_cairo_create(gtk_widget_get_window(
map_drawing_area));
444 cairo_scale(map_cr, scale, scale);
446 cairo_set_source_surface(map_cr, cst, 0, 0);
448 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
451 cairo_destroy(map_cr);
453 cairo_surface_destroy(cst);
477 gint64 t_start, t_end;
478 t_start = g_get_monotonic_time();
483 t_end = g_get_monotonic_time();
484 gint64 elapsed = t_end - t_start;
486 printf(
"profile/redraw,%"G_GINT64_FORMAT
"\n", elapsed);
489 const unsigned int target_redraw = 100000;
490 const int no_resize_above = 100;
493 LOG(
LOG_DEBUG,
"draw_map",
"Increasing mapscale to %d to reduce draw time below %u us",
500 gpointer user_data) {
512 if (dx == 0 && dy == 0) {
514 }
else if (dx == 0 && dy < 0) {
516 }
else if (dx > 0 && dy < 0) {
518 }
else if (dx > 0 && dy == 0) {
520 }
else if (dx > 0 && dy > 0) {
522 }
else if (dx == 0 && dy > 0) {
524 }
else if (dx < 0 && dy > 0) {
526 }
else if (dx < 0 && dy == 0) {
528 }
else if (dx < 0 && dy < 0) {
531 g_assert_not_reached();
544 int mx = x / tile_size;
545 int my = y / tile_size;
553 const double ew = size.width / scale;
554 const double eh = size.height / scale;
586 GdkEventButton *event, gpointer user_data) {
591 switch (event->button) {
593 if (event->type == GDK_BUTTON_PRESS) {
598 if (event->type == GDK_BUTTON_RELEASE) {
605 if (event->type == GDK_BUTTON_PRESS) {