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");
146 const int sx,
const int sy,
const int dx,
const int dy) {
151 cairo_set_source_surface(cr, pixmap->
map_image, dest_x - src_x, dest_y - src_y);
170 static void drawsmooth(cairo_t *cr,
int mx,
int my,
int layer,
int picx,
int picy) {
171 static int dx[8]= {0,1,1,1,0,-1,-1,-1};
172 static int dy[8]= {-1,-1,0,1,1,1,0,-1};
173 static int bweights[8]= {2,0,4,0,8,0,1,0};
174 static int cweights[8]= {0,2,0,4,0,8,0,1};
175 static int bc_exclude[8]= {
185 int partdone[8]= {0,0,0,0,0,0,0,0};
188 int i,weight,weightC;
192 for (i=0; i<=layer; i++) {
198 for (i=0; i<8; i++) {
219 for (i=0; i<8; i++) {
220 if ( (slevels[i]>0) && (!partdone[i]) &&
221 ((lowest<0) || (slevels[i]<slevels[lowest]))
241 for (i=0; i<8; i++) {
242 if ( (slevels[i]==slevels[lowest]) &&
243 (sfaces[i]==sfaces[lowest])) {
245 weight=weight+bweights[i];
246 weightC&=~bc_exclude[i];
249 weightC&=~cweights[i];
253 if (sfaces[lowest]<=0) {
256 smoothface=sfaces[lowest];
265 if ( (!
pixmaps[smoothface]->map_image) ||
283 static void map_draw_layer(cairo_t *cr,
int layer,
int pass,
int mx_start,
int nx,
int my_start,
int ny,
int off_x,
int off_y) {
284 for (
int x = 0; x <= nx; x++) {
285 for (
int y = 0; y <= ny; y++) {
287 const int mx = mx_start + x;
288 const int my = my_start + y;
297 if (face > 0 &&
pixmaps[face]->map_image != NULL) {
300 }
else if (pass == 1) {
302 drawsmooth(cr, mx, my, layer, x + off_x, y + off_y);
317 static void draw_darkness(cairo_t *cr,
int nx,
int ny,
int mx_start,
int my_start) {
322 cairo_surface_t *cst_lm = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, nx+2, ny+2);
323 cairo_t *cr_lm = cairo_create(cst_lm);
324 for (
int x = -1; x <= nx+1; x++) {
325 for (
int y = -1; y <= ny+1; y++) {
326 const int dx =
MIN(MAX(0, x), nx);
327 const int dy =
MIN(MAX(0, y), ny);
330 const int mx = mx_start + dx;
331 const int my = my_start + dy;
334 const int ax = x + 1;
335 const int ay = y + 1;
337 cairo_rectangle(cr_lm, ax, ay, 1, 1);
342 cairo_destroy(cr_lm);
347 cairo_translate(cr, -1, -1);
348 cairo_set_source_surface(cr, cst_lm, 0, 0);
351 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
354 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_GOOD);
357 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BEST);
361 cairo_surface_destroy(cst_lm);
377 const double ew = size.width / scale;
378 const double eh = size.height / scale;
391 const int mx_start = (nx > vw) ?
pl_pos.
x - (nx - vw)/2 :
pl_pos.
x;
392 const int my_start = (ny > vh) ?
pl_pos.
y - (ny - vh)/2 :
pl_pos.
y;
395 cairo_surface_t *cst = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ew, eh);
396 cairo_t *cr = cairo_create(cst);
399 cairo_set_source_rgb(cr, 0, 0, 0);
400 cairo_rectangle(cr, 0, 0, ew, eh);
403 for (
int layer = 0; layer <
MAXLAYERS; layer++) {
408 for (
int x = 0; x <= nx; x++) {
409 for (
int y = 0; y <= ny; y++) {
411 const int mx = mx_start + x;
412 const int my = my_start + y;
423 cairo_set_source_rgb(cr, 1, 0, 0);
425 cairo_set_source_rgb(cr, 1, 1, 0);
427 cairo_set_line_width(cr, 2);
430 cairo_set_source_rgb(cr, 0, 0, 0);
431 cairo_set_line_width(cr, 1);
443 cairo_t *map_cr = gdk_cairo_create(gtk_widget_get_window(
map_drawing_area));
445 cairo_scale(map_cr, scale, scale);
447 cairo_set_source_surface(map_cr, cst, 0, 0);
449 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
452 cairo_destroy(map_cr);
454 cairo_surface_destroy(cst);
478 gint64 t_start, t_end;
479 t_start = g_get_monotonic_time();
484 t_end = g_get_monotonic_time();
485 gint64 elapsed = t_end - t_start;
487 printf(
"profile/redraw,%"G_GINT64_FORMAT
"\n", elapsed);
490 const unsigned int target_redraw = 100000;
491 if (elapsed > target_redraw) {
492 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) {