1 /*
2  * Copyright 2009-2021 Peter Kosyh <p.kosyh at gmail.com>
3  *
4  * Permission is hereby granted, free of charge, to any person
5  * obtaining a copy of this software and associated documentation files
6  * (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  *
23  */
24 
25 #ifndef __THEMES_INCLUDED_H
26 #define __THEMES_INCLUDED_H
27 
28 #include "graphics.h"
29 #include "sound.h"
30 
31 #define DEFAULT_THEME "default"
32 #ifndef THEMES_PATH
33 #define THEMES_PATH "./themes"
34 #endif
35 
36 #define THEME_FILE	"theme.ini"
37 
38 #define THEME_GLOBAL	0
39 #define THEME_GAME	1
40 
41 struct game_theme {
42 	float	scale;
43 	float	img_scale;
44 	int	scale_aware;
45 	struct dpi {
46 		int min;
47 		int max;
48 	} dpi;
49 	int	w;
50 	int	h;
51 	int	gfx_scalable;
52 	color_t	bgcol;
53 	color_t brdcol;
54 	char	*bg_name;
55 	img_t	bg;
56 	char	*use_name;
57 	char	*cursor_name;
58 	int	cur_x;
59 	int	cur_y;
60 	img_t	use;
61 	img_t	cursor;
62 	int 	pad;
63 
64 	int	win_align;
65 	int	win_x;
66 	int	win_y;
67 	int	win_w;
68 	int	win_h;
69 	int	win_scroll_mode;
70 
71 	char	*font_name;
72 	int	font_size;
73 	float	font_height;
74 	fnt_t	font;
75 
76 	int	gfx_x;
77 	int	gfx_y;
78 	int	max_scene_w;
79 	int 	max_scene_h;
80 
81 	char	*a_up_name;
82 	char	*a_down_name;
83 	img_t	a_up;
84 	img_t	a_down;
85 	int	a_up_x; int	a_up_y;
86 	int	a_down_x; int	a_down_y;
87 
88 	color_t fgcol;
89 	color_t lcol;
90 	color_t acol;
91 
92 	int	inv_x;
93 	int 	inv_y;
94 	int 	inv_w;
95 	int 	inv_h;
96 
97 	color_t icol;
98 	color_t ilcol;
99 	color_t iacol;
100 	char	*inv_font_name;
101 	int	inv_font_size;
102 	float	inv_font_height;
103 	fnt_t	inv_font;
104 
105 	char	*inv_a_up_name;
106 	char	*inv_a_down_name;
107 	img_t	inv_a_up;
108 	img_t	inv_a_down;
109 
110 	int	inv_a_up_x; int	inv_a_up_y;
111 	int	inv_a_down_x; int	inv_a_down_y;
112 
113 /*	int	lstyle;
114 	int	ilstyle; */
115 
116 	color_t menu_bg;
117 	color_t menu_fg;
118 	color_t border_col;
119 	color_t menu_link;
120 	color_t menu_alink;
121 	int 	menu_alpha;
122 	int 	border_w;
123 	char	*menu_font_name;
124 	int	menu_font_size;
125 	float	menu_font_height;
126 	fnt_t	menu_font;
127 
128 	char	*menu_button_name;
129 	img_t	menu_button;
130 	int	menu_button_x;
131 	int 	menu_button_y;
132 	int	gfx_mode;
133 	int	inv_mode;
134 	int	ways_mode;
135 	char	*click_name;
136 	void	*click;
137 	char	*icon_name;
138 	img_t	icon;
139 	int xoff;
140 	int yoff;
141 	int	changed;
142 };
143 
144 #define CHANGED_FONT	1
145 #define CHANGED_IFONT	2
146 #define CHANGED_MFONT	4
147 #define CHANGED_BG	8
148 #define CHANGED_WIN	0x10
149 #define CHANGED_INV	0x20
150 #define CHANGED_CLICK	0x40
151 #define CHANGED_CURSOR	0x80
152 #define CHANGED_USE	0x100
153 #define CHANGED_UP	0x200
154 #define CHANGED_DOWN	0x400
155 #define CHANGED_IUP	0x800
156 #define CHANGED_IDOWN	0x1000
157 #define CHANGED_BUTTON	0x2000
158 #define CHANGED_ICON	0x4000
159 #define CHANGED_IMG (CHANGED_BG | CHANGED_CLICK | CHANGED_CURSOR | CHANGED_USE | \
160 	CHANGED_UP | CHANGED_DOWN | CHANGED_IUP |CHANGED_IDOWN | \
161 	CHANGED_BUTTON)
162 #define CHANGED_ALL 0xffff
163 
164 struct theme {
165 	char *path;
166 	char *name;
167 	char *dir;
168 	int  type;
169 	int  idf;
170 };
171 
172 extern	struct	theme *themes;
173 extern	int	themes_nr;
174 extern	char	*curtheme_dir[];
175 extern	char	*curgametheme_dir;
176 
177 extern struct 	game_theme game_theme;
178 extern struct	game_theme game_theme_unscaled;
179 
180 extern int 	game_default_theme(void);
181 extern int 	game_theme_select(const char *name);
182 
183 extern int	themes_lookup(const char *path, int type);
184 extern int	themes_lookup_idf(idf_t idf, const char *path, int type);
185 
186 extern struct theme *theme_lookup(const char *name, int type);
187 extern int 	themes_rename(void);
188 extern int	themes_count(int type);
189 extern int	themes_max(int *type);
190 extern void	themes_drop(int type);
191 
192 extern int 	game_theme_load(const char *name, int type);
193 extern int	game_theme_init(void);
194 extern int 	game_theme_free(void);
195 extern int	game_theme_optimize(void);
196 extern int	game_theme_update(void);
197 
198 extern int	theme_load(const char *name);
199 extern int	theme_load_idf(idf_t idf, const char *name);
200 extern int	theme_img_scale(img_t *p);
201 extern int	theme_gfx_scale(img_t *p, float scale);
202 extern int	theme_scalable_mode(int w, int h);
203 
204 extern int theme_relative;
205 
206 #define GFX_MODE_FLOAT 1
207 #define GFX_MODE_FIXED 2
208 #define GFX_MODE_EMBEDDED 4
209 #define GFX_MODE_DIRECT 0x100
210 #define GFX_MODE(v) ((v) & 0x1ff)
211 #define GFX_DIRECT(v) (!!((v) & 0x100))
212 #define GFX_DIRECT_SET(v) ((v)|0x100)
213 #define GFX_DIRECT_CLR(v) ((v)&(~0x100))
214 #define GFX_ALIGN(v) ((v)>>16)
215 #define GFX_ALIGN_SET(v) ((v)<<16)
216 
217 #define INV_MODE_DISABLED -1
218 #define INV_MODE_VERT 0
219 #define INV_MODE_HORIZ 1
220 #define INV_MODE(v) ((v)&0xff)
221 #define INV_ALIGN(v) ((v)>>8)
222 #define INV_ALIGN_SET(v) ((v)<<8)
223 
224 #define WAYS_BOTTOM (game_theme.ways_mode == ALIGN_BOTTOM)
225 #define DIRECT_MODE (GFX_DIRECT(game_theme.gfx_mode))
226 
227 #define SCALABLE_FONT (!(game_theme.gfx_scalable & 4))
228 #define SCALABLE_THEME (game_theme.gfx_scalable & 3)
229 #define SCALABLE_THEME_SMOOTH (game_theme.gfx_scalable & 1)
230 
231 #define DEFAULT_DPI_MIN 96
232 #define DEFAULT_DPI_MAX 96
233 
234 #endif
235