Freeciv-3.3
Loading...
Searching...
No Matches
mapview.c
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12***********************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18#include <stdio.h>
19
20#ifdef HAVE_UNISTD_H
21#include <unistd.h>
22#endif
23
24#include <gtk/gtk.h>
25
26/* utility */
27#include "fcintl.h"
28#include "log.h"
29#include "mem.h"
30#include "rand.h"
31#include "support.h"
32#include "timing.h"
33
34/* common */
35#include "game.h"
36#include "government.h" /* government_graphic() */
37#include "map.h"
38#include "nation.h"
39#include "player.h"
40
41/* client */
42#include "client_main.h"
43#include "climap.h"
44#include "climisc.h"
45#include "colors.h"
46#include "control.h" /* get_unit_in_focus() */
47#include "editor.h"
48#include "options.h"
49#include "overview_common.h"
50#include "tilespec.h"
51#include "text.h"
52#include "zoom.h"
53
54/* client/gui-gtk-3.22 */
55#include "citydlg.h" /* For reset_city_dialogs() */
56#include "editgui.h"
57#include "graphics.h"
58#include "gui_main.h"
59#include "gui_stuff.h"
60#include "mapctrl.h"
61#include "repodlgs.h"
62#include "wldlg.h"
63
64#include "mapview.h"
65
67static int cursor_timer_id = 0, cursor_type = -1, cursor_frame = 0;
68static int mapview_frozen_level = 0;
69
70/**********************************************************************/
77{
78 static bool flip = FALSE;
79
81 return;
82 }
83
84 if ((do_restore && flip) || !do_restore) {
87
88 if (tdb_provider == NULL) {
90
92 ".lighted {\n"
93 "color: rgba(235, 127, 235, 255);\n"
94 "background-color: rgba(127, 127, 127, 255);\n"
95 "}\n",
96 -1, NULL);
97
98 /* Turn Done button is persistent, so we only need to do this
99 * once too. */
103 }
104
105 if (flip) {
107 } else {
109 }
110
111 flip = !flip;
112 }
113}
114
115/**********************************************************************/
119{
121
122 if (current_turn_timeout() > 0) {
124 _("Time to forced turn change,\n"
125 "or estimated time to finish turn change "
126 "processing."));
127 } else {
129 _("Turn timeout disabled.\n"
130 "Between turns this shows estimated time "
131 "to finish turn change processing."));
132 }
133}
134
135/**********************************************************************/
139{
140 GtkWidget *label;
141 const struct player *pplayer = client_player();
142
144 if (pplayer != NULL) {
145 const gchar *name;
146 gunichar c;
147
148 /* Capitalize the first character of the translated nation
149 * plural name so that the frame label looks good. */
152 if ((gunichar) -1 != c && (gunichar) -2 != c) {
153 const char *obstext = NULL;
154 int obstextlen = 0;
155
156 if (client_is_observer()) {
157 obstext = _(" (observer)");
159 }
160
161 {
163 gchar *next;
164 gint len;
165
167 nation[len] = '\0';
169 if (NULL != next) {
170 sz_strlcat(nation, next);
171 }
172 if (obstext != NULL) {
174 }
176 }
177 } else {
179 }
180 } else {
181 gtk_label_set_text(GTK_LABEL(label), "-");
182 }
183
186
191
192 if (NULL != pplayer) {
193 int d = 0;
194
195 for (; d < pplayer->economic.luxury / 10; d++) {
197
199 }
200
201 for (; d < (pplayer->economic.science
202 + pplayer->economic.luxury) / 10; d++) {
204
206 }
207
208 for (; d < 10; d++) {
210
212 }
213 }
214
216
217 /* Update tooltips. */
219 _("Shows your current luxury/science/tax rates; "
220 "click to toggle them."));
221
226}
227
228/**********************************************************************/
232{
233 if (!cursor_timer_id) {
234 return FALSE;
235 }
236
237 cursor_frame++;
239 cursor_frame = 0;
240 }
241
244 cursor_timer_id = 0;
245 return FALSE;
246 }
247
251 return TRUE;
252}
253
254/**********************************************************************/
264
265/**********************************************************************/
288
289/**********************************************************************/
296
297/**********************************************************************/
310
311/**********************************************************************/
322
323/**********************************************************************/
333
334/**********************************************************************/
338{
339#if 0
340 static struct canvas store;
341
342 store.surface = NULL;
344
345 return &store;
346#endif /* 0 */
349 }
350 return NULL;
351}
352
353/**********************************************************************/
369
370/**********************************************************************/
374{
376}
377
378/**********************************************************************/
381void mapview_thaw(void)
382{
383 if (1 < mapview_frozen_level) {
385 } else {
388 dirty_all();
389 }
390}
391
392/**********************************************************************/
396{
397 return (0 < mapview_frozen_level);
398}
399
400/**********************************************************************/
404 gpointer data)
405{
406 map_canvas_resized(ev->width, ev->height);
407
408 return TRUE;
409}
410
411/**********************************************************************/
415{
416 /* Needed only with full screen zoom mode.
417 * Not needed, nor implemented, in this client. */
419}
420
421/**********************************************************************/
425{
427 /* First we mark the area to be updated as dirty. Then we unqueue
428 * any pending updates, to make sure only the most up-to-date data
429 * is written (otherwise drawing bugs happen when old data is copied
430 * to screen). Then we draw all changed areas to the screen. */
434 cairo_paint(cr);
435 }
436 return TRUE;
437}
438
439/**********************************************************************/
452
453/**********************************************************************/
462
463/**********************************************************************/
474
475/**********************************************************************/
484
485/**********************************************************************/
492
493/**********************************************************************/
497{
498 struct canvas store = FC_STATIC_CANVAS_INIT;
499 int width;
500
501 if (height <= 0) {
503 }
505
507 width, height);
508
509 put_unit(punit, &store, 1.0, 0, 0);
510
513}
514
515/**********************************************************************/
522 int height,
523 int *upkeep_cost, int happy_cost)
524{
525 struct canvas store = FC_STATIC_CANVAS_INIT;
527
529 width, height);
530
531 put_unit(punit, &store, 1.0, 0, 0);
532
534 upkeep_cost, happy_cost);
535
538}
539
540/**********************************************************************/
562
563/**********************************************************************/
567 int canvas_x, int canvas_y,
568 struct sprite *ssprite,
569 bool fog)
570{
571 cairo_t *cr;
572 int sswidth, ssheight;
573 const double bright = 0.65; /* Fogged brightness compared to unfogged */
574
575 if (!ssprite) {
576 return;
577 }
578
580
581 if (fog) {
582 struct color *fogcol = color_alloc(0.0, 0.0, 0.0); /* black */
584 struct sprite *fogged;
585 unsigned char *mask_in;
586 unsigned char *mask_out;
587 int i, j;
588
589 /* Create sprites initially fully transparent */
590 fogcol->color.alpha = 0.0;
593
594 /* Calculate black fog mask from the original sprite's alpha channel;
595 * we don't want to blacken transparent parts of the sprite. */
598
599 for (i = 0; i < sswidth; i++) {
600 for (j = 0; j < ssheight; j++) {
601 /* In order to darken pixels of ssprite to 'bright' fraction of
602 * their original value, we need to overlay blackness of
603 * (1-bright) transparency. */
604 if (!is_bigendian()) {
605 mask_out[(j * sswidth + i) * 4 + 3]
606 = (1-bright) * mask_in[(j * sswidth + i) * 4 + 3];
607 } else {
608 mask_out[(j * sswidth + i) * 4 + 0]
609 = (1-bright) * mask_in[(j * sswidth + i) * 4 + 0];
610 }
611 }
612 }
613
615
616 /* First copy original sprite canvas to intermediate sprite canvas */
617 cr = cairo_create(fogged->surface);
618 cairo_set_source_surface(cr, ssprite->surface, 0, 0);
619 cairo_paint(cr);
620
621 /* Then apply created fog to the intermediate sprite to darken it */
623 cairo_paint(cr);
624 cairo_destroy(cr);
625
626 /* Put intermediate sprite to the target canvas */
628 fogged, 0, 0, sswidth, ssheight);
629
630 /* Free intermediate stuff */
634 } else {
636 ssprite, 0, 0, sswidth, ssheight);
637 }
638}
639
640/**********************************************************************/
653
654/**********************************************************************/
677
678/**********************************************************************/
692
693/**********************************************************************/
717
718/**********************************************************************/
739
740/**********************************************************************/
749void draw_selection_rectangle(int canvas_x, int canvas_y, int w, int h)
750{
751 double dashes[2] = {4.0, 4.0};
752 struct color *pcolor;
753 cairo_t *cr;
756
757 if (w == 0 || h == 0) {
758 return;
759 }
760
762 if (!pcolor) {
763 return;
764 }
765
771 cairo_set_line_width(cr, 2.0);
772 cairo_set_dash(cr, dashes, 2, 0);
775 cairo_stroke(cr);
777}
778
779/**********************************************************************/
783{
789
790 /* keep the icon of the executable on Windows (see PR#36491) */
791#ifndef FREECIV_MSWINDOWS
792 {
794
795 /* Only call this after tileset_load_tiles is called. */
798 }
799#endif /* FREECIV_MSWINDOWS */
800}
801
802/**********************************************************************/
805void start_turn(void)
806{}
struct canvas int int struct sprite int int int int height
Definition canvas_g.h:44
struct canvas int int int int struct sprite *sprite struct canvas struct color * pcolor
Definition canvas_g.h:56
struct canvas int int canvas_y
Definition canvas_g.h:43
struct canvas int canvas_x
Definition canvas_g.h:43
canvas_put_sprite
Definition canvas_g.h:42
struct canvas * pcanvas
Definition canvas_g.h:42
struct canvas int int struct sprite int int int width
Definition canvas_g.h:44
bool client_is_observer(void)
bool can_client_change_view(void)
#define client_player()
struct sprite * client_warming_sprite(void)
Definition climisc.c:377
struct sprite * client_cooling_sprite(void)
Definition climisc.c:394
struct sprite * client_research_sprite(void)
Definition climisc.c:354
struct sprite * client_government_sprite(void)
Definition climisc.c:412
struct color * get_color(const struct tileset *t, enum color_std stdcolor)
char * incite_cost
Definition comments.c:76
void update_unit_pix_label(struct unit_list *punitlist)
Definition control.c:985
void control_mouse_cursor(struct tile *ptile)
Definition control.c:1215
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit * punit
Definition dialogs_g.h:74
bool get_turn_done_button_state()
#define MAX_LEN_NAME
Definition fc_types.h:66
@ O_SCIENCE
Definition fc_types.h:101
@ O_LUXURY
Definition fc_types.h:101
@ O_GOLD
Definition fc_types.h:101
#define _(String)
Definition fcintl.h:67
int current_turn_timeout(void)
Definition game.c:853
#define FC_STATIC_CANVAS_INIT
Definition canvas.h:28
void reset_city_dialogs(void)
Definition citydlg.c:365
struct color * color_alloc(int r, int g, int b)
Definition colors.c:38
void color_free(struct color *color)
Definition colors.c:53
void editgui_tileset_changed(void)
Definition editgui.c:1862
static GtkWidget * source
Definition gotodlg.c:58
GdkCursor * fc_cursors[CURSOR_LAST][NUM_CURSOR_FRAMES]
Definition graphics.c:48
GtkWidget * map_vertical_scrollbar
Definition gui_main.c:110
GtkWidget * main_label_info
Definition gui_main.c:139
GtkWidget * unit_info_label
Definition gui_main.c:152
GtkWidget * timeout_label
Definition gui_main.c:149
GtkWidget * overview_scrolled_window
Definition gui_main.c:113
GtkWidget * econ_ebox
Definition gui_main.c:156
GtkWidget * government_label
Definition gui_main.c:148
GtkWidget * sun_label
Definition gui_main.c:146
GtkWidget * turn_done_button
Definition gui_main.c:150
void reset_unit_table(void)
Definition gui_main.c:1024
GtkWidget * unit_info_frame
Definition gui_main.c:154
GdkWindow * root_window
Definition gui_main.c:127
GtkWidget * sun_ebox
Definition gui_main.c:158
GtkWidget * bulb_ebox
Definition gui_main.c:157
GtkWidget * flake_label
Definition gui_main.c:147
GtkWidget * bulb_label
Definition gui_main.c:145
GtkWidget * overview_canvas
Definition gui_main.c:112
GtkWidget * toplevel
Definition gui_main.c:126
GtkWidget * map_horizontal_scrollbar
Definition gui_main.c:109
GtkWidget * map_canvas
Definition gui_main.c:108
GtkWidget * econ_label[10]
Definition gui_main.c:144
GtkWidget * government_ebox
Definition gui_main.c:160
GtkWidget * flake_ebox
Definition gui_main.c:159
int overview_canvas_store_width
Definition gui_main.c:123
int overview_canvas_store_height
Definition gui_main.c:124
GtkWidget * main_frame_civ_name
Definition gui_main.c:138
#define GUI_GTK_OPTION(optname)
Definition gui_main.h:25
void update_timeout_label(void)
Definition mapview.c:118
void flush_dirty(void)
Definition mapview.c:468
static int cursor_frame
Definition mapview.c:67
void update_info_label(void)
Definition mapview.c:138
void update_turn_done_button(bool do_restore)
Definition mapview.c:76
void scrollbar_jump_callback(GtkAdjustment *adj, gpointer hscrollbar)
Definition mapview.c:721
void dirty_all(void)
Definition mapview.c:456
void tileset_changed(void)
Definition mapview.c:782
void put_cross_overlay_tile(struct tile *ptile)
Definition mapview.c:643
void draw_selection_rectangle(int canvas_x, int canvas_y, int w, int h)
Definition mapview.c:749
void update_map_canvas_scrollbars_size(void)
Definition mapview.c:696
void get_overview_area_dimensions(int *width, int *height)
Definition mapview.c:317
void mapview_freeze(void)
Definition mapview.c:373
GdkPixbuf * get_thumb_pixbuf(int onoff)
Definition mapview.c:292
void start_turn(void)
Definition mapview.c:805
void update_unit_info_label(struct unit_list *punits)
Definition mapview.c:275
void update_overview_scroll_window_pos(int x, int y)
Definition mapview.c:657
void update_city_descriptions(void)
Definition mapview.c:488
gboolean map_canvas_draw(GtkWidget *w, cairo_t *cr, gpointer data)
Definition mapview.c:424
void pixmap_put_overlay_tile(GdkWindow *pixmap, float zoom, int canvas_x, int canvas_y, struct sprite *ssprite)
Definition mapview.c:543
void gui_flush(void)
Definition mapview.c:480
void put_unit_image_city_overlays(struct unit *punit, GtkImage *p, int height, int *upkeep_cost, int happy_cost)
Definition mapview.c:521
void pixmap_put_overlay_tile_draw(struct canvas *pcanvas, int canvas_x, int canvas_y, struct sprite *ssprite, bool fog)
Definition mapview.c:566
void update_map_canvas_scrollbars(void)
Definition mapview.c:681
bool mapview_is_frozen(void)
Definition mapview.c:395
static gboolean anim_cursor_cb(gpointer data)
Definition mapview.c:231
void overview_size_changed(void)
Definition mapview.c:326
void map_canvas_size_refresh(void)
Definition mapview.c:414
static int cursor_timer_id
Definition mapview.c:67
static GtkAdjustment * map_vadj
Definition mapview.c:66
static int mapview_frozen_level
Definition mapview.c:68
void mapview_thaw(void)
Definition mapview.c:381
struct canvas * get_overview_window(void)
Definition mapview.c:337
gboolean map_canvas_configure(GtkWidget *w, GdkEventConfigure *ev, gpointer data)
Definition mapview.c:403
void put_unit_image(struct unit *punit, GtkImage *p, int height)
Definition mapview.c:496
void update_mouse_cursor(enum cursor_type new_cursor_type)
Definition mapview.c:257
static GtkAdjustment * map_hadj
Definition mapview.c:66
void set_indicator_icons(struct sprite *bulb, struct sprite *sol, struct sprite *flake, struct sprite *gov)
Definition mapview.c:302
gboolean overview_canvas_draw(GtkWidget *w, cairo_t *cr, gpointer data)
Definition mapview.c:356
#define CURSOR_INTERVAL
Definition mapview.h:32
void science_report_dialog_redraw(void)
Definition repodlgs.c:761
void free_sprite(struct sprite *s)
Definition sprite.c:278
struct sprite * create_sprite(int width, int height, struct color *pcolor)
Definition sprite.c:84
GdkPixbuf * sprite_get_pixbuf(struct sprite *sprite)
Definition sprite.c:402
void blank_max_unit_size(void)
Definition wldlg.c:79
const char * name
Definition inputfile.c:127
#define fc_assert(condition)
Definition log.h:177
bool map_is_empty(void)
Definition map.c:148
const char * get_timeout_label_text()
Definition text.c:1604
void update_map_canvas_visible(void)
struct view mapview
void put_unit(const struct unit *punit, struct canvas *pcanvas, float zoom, int canvas_x, int canvas_y)
void get_mapview_scroll_pos(int *scroll_x, int *scroll_y)
void get_mapview_scroll_window(float *xmin, float *ymin, float *xmax, float *ymax, int *xsize, int *ysize)
void unqueue_mapview_updates(bool write_to_screen)
void get_mapview_scroll_step(int *xstep, int *ystep)
void set_mapview_scroll_pos(int scroll_x, int scroll_y, float zoom)
void put_unit_city_overlays(struct unit *punit, struct canvas *pcanvas, int canvas_x, int canvas_y, int *upkeep_cost, int happy_cost)
void update_animation(void)
bool map_canvas_resized(int width, int height)
bool tile_to_canvas_pos(float *canvas_x, float *canvas_y, float zoom, const struct tile *ptile)
dirty_rect
Definition mapview_g.h:47
int int int pixel_width
Definition mapview_g.h:48
const char * nation_plural_for_player(const struct player *pplayer)
Definition nation.c:178
struct client_options gui_options
Definition options.c:71
#define GUI_GTK_OVERVIEW_MIN_XSIZE
Definition options.h:634
#define GUI_GTK_OVERVIEW_MIN_YSIZE
Definition options.h:635
int len
Definition packhand.c:127
const char * get_government_tooltip(void)
Definition text.c:1525
const char * get_nuclear_winter_tooltip(void)
Definition text.c:1498
const char * get_bulb_tooltip(void)
Definition text.c:1414
const char * get_info_label_text(bool)
Definition text.c:964
const char * get_global_warming_tooltip(void)
Definition text.c:1471
#define MIN(x, y)
Definition shared.h:55
#define BOOL_VAL(x)
Definition shared.h:70
struct sprite int int y
Definition sprite_g.h:31
struct sprite int x
Definition sprite_g.h:31
struct sprite int int int int struct sprite int int float bool smooth get_sprite_dimensions
Definition sprite_g.h:36
float zoom
Definition canvas.h:25
cairo_surface_t * surface
Definition canvas.h:23
cairo_t * drawable
Definition canvas.h:24
struct overview overview
Definition options.h:462
Definition colors.h:21
int width
Definition options.h:94
struct canvas * window
Definition options.h:100
int height
Definition options.h:94
struct player_economic economic
Definition player.h:284
struct nation_type * nation
Definition player.h:260
cairo_surface_t * surface
Definition sprite.h:23
Definition tile.h:50
Definition unit.h:140
struct canvas * store
static bool is_bigendian(void)
Definition support.h:235
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
#define sz_strlcat(dest, src)
Definition support.h:196
const char * get_unit_info_label_text2(struct unit_list *punits, int linebreaks)
Definition text.c:1126
const char * get_unit_info_label_text1(struct unit_list *punits)
Definition text.c:1101
struct sprite * get_attention_crosshair_sprite(const struct tileset *t)
Definition tilespec.c:7214
int tileset_full_tile_height(const struct tileset *t)
Definition tilespec.c:815
int tileset_unit_layout_offset_y(const struct tileset *t)
Definition tilespec.c:908
struct sprite * get_treaty_thumb_sprite(const struct tileset *t, bool on_off)
Definition tilespec.c:7133
struct sprite * get_icon_sprite(const struct tileset *t, enum icon_type icon)
Definition tilespec.c:7203
int tileset_full_tile_width(const struct tileset *t)
Definition tilespec.c:802
struct sprite * get_tax_sprite(const struct tileset *t, Output_type_id otype)
Definition tilespec.c:7103
#define NUM_CURSOR_FRAMES
Definition tilespec.h:305
@ ICON_FREECIV
Definition tilespec.h:315
cursor_type
Definition tilespec.h:289
@ CURSOR_DEFAULT
Definition tilespec.h:302
float mouse_zoom
Definition zoom.c:28
float map_zoom
Definition zoom.c:25