Mercurial > mplayer.hg
annotate gui/win32/skinload.c @ 36770:ee000da6fa82
ad_ffmpeg: avoid deprecated request_channels.
author | reimar |
---|---|
date | Sun, 16 Feb 2014 16:30:05 +0000 |
parents | 28ea255e40ce |
children | 511047e8e0a2 |
rev | line source |
---|---|
23077 | 1 /* |
23079 | 2 * MPlayer GUI for Win32 |
3 * Copyright (C) 2003 Sascha Sommer <saschasommer@freenet.de> | |
4 * Copyright (C) 2006 Erik Augustson <erik_27can@yahoo.com> | |
5 * Copyright (C) 2006 Gianluigi Tiesi <sherpya@netfarm.it> | |
6 * | |
7 * This file is part of MPlayer. | |
8 * | |
9 * MPlayer is free software; you can redistribute it and/or modify | |
10 * it under the terms of the GNU General Public License as published by | |
11 * the Free Software Foundation; either version 2 of the License, or | |
12 * (at your option) any later version. | |
13 * | |
14 * MPlayer is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Public License for more details. | |
18 * | |
26457 | 19 * You should have received a copy of the GNU General Public License along |
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
23079 | 22 */ |
23077 | 23 |
33761 | 24 #include <string.h> |
23077 | 25 #include <stdlib.h> |
23796 | 26 #include <stdio.h> |
23077 | 27 #include <inttypes.h> |
28 #include <windows.h> | |
29 | |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
30 #include "mp_msg.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
31 #include "cpudetect.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
32 #include "libswscale/swscale.h" |
32833
c4891d10ddbb
Adjust #include paths after the merge of libavcore into libavutil in FFmpeg.
diego
parents:
32537
diff
changeset
|
33 #include "libavutil/imgutils.h" |
23077 | 34 #include "gui.h" |
33770 | 35 #include "gui/util/mem.h" |
33046 | 36 #include "gui/util/bitmap.h" |
23077 | 37 |
38 #define MAX_LINESIZE 256 | |
39 | |
40 typedef struct | |
41 { | |
42 int msg; | |
43 char *name; | |
44 } evName; | |
45 | |
46 static const evName evNames[] = | |
47 { | |
48 { evNone, "evNone" }, | |
49 { evPlay, "evPlay" }, | |
50 { evStop, "evStop" }, | |
51 { evPause, "evPause" }, | |
52 { evPrev, "evPrev" }, | |
53 { evNext, "evNext" }, | |
54 { evLoad, "evLoad" }, | |
34317 | 55 { evLoadPlay, "evLoadPlay" }, |
56 { evLoadAudioFile, "evLoadAudioFile" }, | |
57 { evLoadSubtitle, "evLoadSubtitle" }, | |
58 { evDropSubtitle, "evDropSubtitle" }, | |
34321
daebf766dea6
Cosmetic: Synchronize evPlaylist event and message names.
ib
parents:
34320
diff
changeset
|
59 { evPlaylist, "evPlaylist" }, |
34387 | 60 { evPlayCD, "evPlayCD" }, |
34317 | 61 { evPlayVCD, "evPlayVCD" }, |
62 { evPlayDVD, "evPlayDVD" }, | |
34324 | 63 { evLoadURL, "evSetURL" }, // legacy |
64 { evLoadURL, "evLoadURL" }, | |
36429 | 65 { evPlayTV, "evPlayTV" }, |
34317 | 66 { evPlaySwitchToPause, "evPlaySwitchToPause" }, |
67 { evPauseSwitchToPlay, "evPauseSwitchToPlay" }, | |
23077 | 68 { evBackward10sec, "evBackward10sec" }, |
69 { evForward10sec, "evForward10sec" }, | |
70 { evBackward1min, "evBackward1min" }, | |
71 { evForward1min, "evForward1min" }, | |
72 { evBackward10min, "evBackward10min" }, | |
73 { evForward10min, "evForward10min" }, | |
34317 | 74 { evSetMoviePosition, "evSetMoviePosition" }, |
34320 | 75 { evHalfSize, "evHalfSize" }, |
34317 | 76 { evDoubleSize, "evDoubleSize" }, |
77 { evFullScreen, "evFullScreen" }, | |
78 { evNormalSize, "evNormalSize" }, | |
34322 | 79 { evSetAspect, "evSetAspect" }, |
23077 | 80 { evIncVolume, "evIncVolume" }, |
81 { evDecVolume, "evDecVolume" }, | |
34317 | 82 { evSetVolume, "evSetVolume" }, |
23077 | 83 { evMute, "evMute" }, |
34317 | 84 { evSetBalance, "evSetBalance" }, |
85 { evEqualizer, "evEqualizer" }, | |
86 { evAbout, "evAbout" }, | |
87 { evPreferences, "evPreferences" }, | |
88 { evSkinBrowser, "evSkinBrowser" }, | |
34458 | 89 { evMenu, "evMenu" }, |
34317 | 90 { evIconify, "evIconify" }, |
34326 | 91 { evExit, "evExit" } |
23077 | 92 }; |
93 | |
94 static const int evBoxs = sizeof(evNames) / sizeof(evName); | |
95 | |
96 static char *geteventname(int event) | |
97 { | |
98 int i; | |
99 for(i=0; i<evBoxs; i++) | |
100 if(evNames[i].msg == event) | |
101 return evNames[i].name; | |
102 return NULL; | |
103 } | |
104 | |
105 /* reads a complete image as is into image buffer */ | |
33784 | 106 static image *pngRead(skin_t *skin, const char *fname) |
23077 | 107 { |
34996
ebcc17a3c165
Fix compiler warnings (comparison between signed and unsigned).
ib
parents:
34697
diff
changeset
|
108 unsigned int i; |
33555 | 109 guiImage bmp; |
23077 | 110 image *bf; |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
111 char *filename = NULL; |
23077 | 112 FILE *fp; |
113 | |
114 if(!stricmp(fname, "NULL")) return 0; | |
115 | |
116 /* find filename in order file file.png */ | |
117 if(!(fp = fopen(fname, "rb"))) | |
118 { | |
119 filename = calloc(1, strlen(skin->skindir) + strlen(fname) + 6); | |
34092
dbf5042ab255
Don't use the Windows style path separator character in Win32 GUI.
ib
parents:
33784
diff
changeset
|
120 sprintf(filename, "%s/%s.png", skin->skindir, fname); |
23077 | 121 if(!(fp = fopen(filename, "rb"))) |
122 { | |
123 mp_msg(MSGT_GPLAYER, MSGL_ERR, "[png] cannot find image %s\n", filename); | |
124 free(filename); | |
125 return 0; | |
126 } | |
127 } | |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
128 fclose(fp); |
23077 | 129 |
130 for (i=0; i < skin->imagecount; i++) | |
131 if(!strcmp(fname, skin->images[i]->name)) | |
132 { | |
34450 | 133 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[png] skinfile %s already exists\n", fname); |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
134 free(filename); |
23077 | 135 return skin->images[i]; |
136 } | |
137 (skin->imagecount)++; | |
138 skin->images = realloc(skin->images, sizeof(image *) * skin->imagecount); | |
139 bf = skin->images[(skin->imagecount) - 1] = calloc(1, sizeof(image)); | |
140 bf->name = strdup(fname); | |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
141 bpRead(filename ? filename : fname, &bmp); |
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
142 free(filename); |
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
143 bf->width = bmp.Width; bf->height = bmp.Height; |
23077 | 144 |
145 bf->size = bf->width * bf->height * skin->desktopbpp / 8; | |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
146 if (skin->desktopbpp == 32) |
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
147 bf->data = bmp.Image; |
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
148 else { |
32028
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
149 const uint8_t *src[4] = { bmp.Image, NULL, NULL, NULL}; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
150 int src_stride[4] = { 4 * bmp.Width, 0, 0, 0 }; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
151 uint8_t *dst[4] = { NULL, NULL, NULL, NULL }; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
152 int dst_stride[4]; |
35707
4ba6b8d3197e
Replace PixelFormat and PIX_FMT_FOO by their AV_-prefixed counterparts.
diego
parents:
35501
diff
changeset
|
153 enum AVPixelFormat out_pix_fmt = PIX_FMT_NONE; |
32028
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
154 struct SwsContext *sws; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
155 if (skin->desktopbpp == 16) out_pix_fmt = PIX_FMT_RGB555; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
156 else if (skin->desktopbpp == 24) out_pix_fmt = PIX_FMT_RGB24; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
157 av_image_fill_linesizes(dst_stride, out_pix_fmt, bmp.Width); |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
158 sws = sws_getContext(bmp.Width, bmp.Height, PIX_FMT_RGB32, |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
159 bmp.Width, bmp.Height, out_pix_fmt, |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
160 SWS_POINT, NULL, NULL, NULL); |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
161 bf->data = malloc(bf->size); |
32028
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
162 dst[0] = bf->data; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
163 sws_scale(sws, src, src_stride, 0, bmp.Height, dst, dst_stride); |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
164 sws_freeContext(sws); |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
165 free(bmp.Image); |
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
166 } |
23077 | 167 return bf; |
168 } | |
169 | |
170 /* frees all skin images */ | |
171 static void freeimages(skin_t *skin) | |
172 { | |
173 unsigned int i; | |
174 for (i=0; i<skin->imagecount; i++) | |
175 { | |
176 if(skin->images && skin->images[i]) | |
177 { | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32028
diff
changeset
|
178 free(skin->images[i]->data); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32028
diff
changeset
|
179 free(skin->images[i]->name); |
23077 | 180 free(skin->images[i]); |
181 } | |
182 } | |
183 free(skin->images); | |
184 } | |
185 | |
33621
18b47d32b0d0
win32 gui: Mark debug function only used within the file as static.
diego
parents:
33620
diff
changeset
|
186 static void dumpwidgets(skin_t *skin) |
23077 | 187 { |
188 unsigned int i; | |
189 for (i=0; i<skin->widgetcount; i++) | |
34450 | 190 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "widget %p id %i\n", skin->widgets[i], skin->widgets[i]->id); |
23077 | 191 } |
192 | |
193 static int counttonextchar(const char *s1, char c) | |
194 { | |
195 unsigned int i; | |
196 for (i=0; i<strlen(s1); i++) | |
197 if(s1[i] == c) return i; | |
198 return 0; | |
199 } | |
200 | |
201 static char *findnextstring(char *temp, const char *desc, int *base) | |
202 { | |
203 int len = counttonextchar(*base + desc, ','); | |
204 memset(temp, 0, strlen(desc) + 1); | |
205 if(!len) len = strlen(desc); | |
206 memcpy(temp, *base + desc, len); | |
207 *base += (len+1); | |
208 return temp; | |
209 } | |
210 | |
211 static void freeskin(skin_t *skin) | |
212 { | |
213 unsigned int i; | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32028
diff
changeset
|
214 |
33770 | 215 nfree(skin->skindir); |
23077 | 216 |
217 for (i=1; i<=skin->lastusedid; i++) | |
218 skin->removewidget(skin, i); | |
219 | |
33770 | 220 nfree(skin->widgets); |
23077 | 221 |
222 freeimages(skin); | |
223 for(i=0; i<skin->windowcount; i++) | |
224 { | |
33770 | 225 nfree(skin->windows[i]->name); |
23077 | 226 free(skin->windows[i]); |
227 } | |
228 | |
33770 | 229 nfree(skin->windows); |
23077 | 230 |
231 for (i=0; i<skin->fontcount; i++) | |
232 { | |
233 unsigned int x; | |
234 | |
33770 | 235 nfree(skin->fonts[i]->name); |
236 nfree(skin->fonts[i]->id); | |
23077 | 237 |
238 for (x=0; x<skin->fonts[i]->charcount; x++) | |
33770 | 239 nfree(skin->fonts[i]->chars[x]); |
240 | |
241 nfree(skin->fonts[i]->chars); | |
23077 | 242 |
33770 | 243 nfree(skin->fonts[i]); |
23077 | 244 } |
33770 | 245 nfree(skin->fonts); |
34450 | 246 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN FREE] skin freed\n"); |
33770 | 247 nfree(skin); |
23077 | 248 } |
249 | |
250 static void removewidget(skin_t *skin, int id) | |
251 { | |
252 unsigned int i; | |
253 unsigned int pos=0; | |
254 widget **temp = calloc(skin->widgetcount - 1, sizeof(widget *)); | |
255 | |
256 for (i=0; i<skin->widgetcount; i++) | |
257 { | |
258 if(skin->widgets[i]->id == id) | |
259 { | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32028
diff
changeset
|
260 free(skin->widgets[i]->label); |
33770 | 261 nfree(skin->widgets[i]); |
23077 | 262 } |
263 else | |
264 { | |
265 temp[pos] = skin->widgets[i]; | |
266 pos++; | |
267 } | |
268 } | |
269 if (pos != i) | |
270 { | |
271 (skin->widgetcount)--; | |
272 free(skin->widgets); | |
273 skin->widgets = temp; | |
34450 | 274 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "removed widget %i\n", id); |
23077 | 275 return; |
276 } | |
277 free(temp); | |
278 mp_msg(MSGT_GPLAYER, MSGL_ERR, "widget %i not found\n", id); | |
279 } | |
280 | |
281 static void addwidget(skin_t *skin, window *win, const char *desc) | |
282 { | |
283 widget *mywidget; | |
284 char *temp = calloc(1, strlen(desc) + 1); | |
285 (skin->widgetcount)++; | |
286 (skin->lastusedid)++; | |
287 skin->widgets = realloc(skin->widgets, sizeof(widget *) * skin->widgetcount); | |
288 mywidget = skin->widgets[(skin->widgetcount) - 1] = calloc(1, sizeof(widget)); | |
289 mywidget->id = skin->lastusedid; | |
290 mywidget->window = win->type; | |
291 /* parse and fill widget specific info */ | |
292 if(!strncmp(desc, "base", 4)) | |
293 { | |
294 int base = counttonextchar(desc, '=') + 1; | |
295 mywidget->type = tyBase; | |
296 mywidget->bitmap[0] = pngRead(skin, findnextstring(temp, desc, &base)); | |
297 mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); | |
298 mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); | |
299 mywidget->wwidth = mywidget->width = atoi(findnextstring(temp, desc, &base)); | |
300 mywidget->wheight = mywidget->height = atoi(findnextstring(temp, desc, &base)); | |
301 win->base = mywidget; | |
34450 | 302 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [BASE] %s %i %i %i %i\n", |
23077 | 303 (mywidget->bitmap[0]) ? mywidget->bitmap[0]->name : NULL, |
304 mywidget->x, mywidget->y, mywidget->width, mywidget->height); | |
305 } | |
306 else if(!strncmp(desc, "button", 6)) | |
307 { | |
308 int base = counttonextchar(desc, '=') + 1; | |
309 int i; | |
310 mywidget->type = tyButton; | |
311 mywidget->bitmap[0] = pngRead(skin, findnextstring(temp, desc, &base)); | |
312 mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); | |
313 mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); | |
314 mywidget->wwidth = mywidget->width = atoi(findnextstring(temp, desc, &base)); | |
315 mywidget->wheight = mywidget->height = atoi(findnextstring(temp, desc, &base)); | |
316 findnextstring(temp, desc, &base); | |
317 | |
318 /* Assign corresponding event to the widget */ | |
319 mywidget->msg = evNone; | |
320 for (i=0; i<evBoxs; i++) | |
321 { | |
322 if(!strcmp(temp, evNames[i].name)) | |
323 { | |
324 mywidget->msg = evNames[i].msg; | |
325 break; | |
326 } | |
327 } | |
328 | |
34450 | 329 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [BUTTON] %s %i %i %i %i msg %i\n", |
23077 | 330 (mywidget->bitmap[0]) ? mywidget->bitmap[0]->name : NULL, |
331 mywidget->x, mywidget->y, mywidget->width, mywidget->height, mywidget->msg); | |
332 } | |
333 else if(!strncmp(desc, "hpotmeter", 9) || !strncmp(desc, "vpotmeter", 9)) | |
334 { | |
335 int base = counttonextchar(desc, '=') + 1; | |
336 int i; | |
337 /* hpotmeter = button, bwidth, bheight, phases, numphases, default, X, Y, width, height, message */ | |
338 if(!strncmp(desc, "hpotmeter", 9)) mywidget->type = tyHpotmeter; | |
339 else mywidget->type = tyVpotmeter; | |
340 mywidget->bitmap[0] = pngRead(skin, findnextstring(temp, desc, &base)); | |
341 mywidget->width = atoi(findnextstring(temp, desc, &base)); | |
342 mywidget->height = atoi(findnextstring(temp, desc, &base)); | |
343 mywidget->bitmap[1] = pngRead(skin, findnextstring(temp, desc, &base)); | |
344 mywidget->phases = atoi(findnextstring(temp, desc, &base)); | |
345 mywidget->value = atof(findnextstring(temp, desc, &base)); | |
346 mywidget->x = mywidget->wx = atoi(findnextstring(temp, desc, &base)); | |
347 mywidget->y = mywidget->wy = atoi(findnextstring(temp, desc, &base)); | |
348 mywidget->wwidth = atoi(findnextstring(temp, desc, &base)); | |
349 mywidget->wheight = atoi(findnextstring(temp, desc, &base)); | |
350 findnextstring(temp, desc, &base); | |
351 mywidget->msg = evNone; | |
352 for (i=0; i<evBoxs; i++) | |
353 { | |
354 if(!strcmp(temp, evNames[i].name)) | |
355 { | |
356 mywidget->msg = evNames[i].msg; | |
357 break; | |
358 } | |
359 } | |
34450 | 360 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] %s %s %i %i %s %i %f %i %i %i %i msg %i\n", |
23077 | 361 (mywidget->type == tyHpotmeter) ? "[HPOTMETER]" : "[VPOTMETER]", |
362 (mywidget->bitmap[0]) ? mywidget->bitmap[0]->name : NULL, | |
363 mywidget->width, mywidget->height, | |
364 (mywidget->bitmap[1]) ? mywidget->bitmap[1]->name : NULL, | |
365 mywidget->phases, mywidget->value, | |
366 mywidget->wx, mywidget->wy, mywidget->wwidth, mywidget->wwidth, | |
367 mywidget->msg); | |
368 } | |
369 else if(!strncmp(desc, "potmeter", 8)) | |
370 { | |
371 int base = counttonextchar(desc, '=') + 1; | |
372 int i; | |
373 /* potmeter = phases, numphases, default, X, Y, width, height, message */ | |
374 mywidget->type = tyPotmeter; | |
375 mywidget->bitmap[0] = pngRead(skin, findnextstring(temp, desc, &base)); | |
376 mywidget->phases = atoi(findnextstring(temp, desc, &base)); | |
377 mywidget->value = atof(findnextstring(temp, desc, &base)); | |
378 mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); | |
379 mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); | |
380 mywidget->wwidth = mywidget->width = atoi(findnextstring(temp, desc, &base)); | |
381 mywidget->wheight = mywidget->height = atoi(findnextstring(temp, desc, &base)); | |
382 findnextstring(temp, desc, &base); | |
383 mywidget->msg = evNone; | |
384 for (i=0; i<evBoxs; i++) | |
385 { | |
386 if(!strcmp(temp, evNames[i].name)) | |
387 { | |
388 mywidget->msg=evNames[i].msg; | |
389 break; | |
390 } | |
391 } | |
34450 | 392 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [POTMETER] %s %i %i %i %f %i %i msg %i\n", |
23077 | 393 (mywidget->bitmap[0]) ? mywidget->bitmap[0]->name : NULL, |
394 mywidget->width, mywidget->height, | |
395 mywidget->phases, mywidget->value, | |
396 mywidget->x, mywidget->y, | |
397 mywidget->msg); | |
398 } | |
399 else if(!strncmp(desc, "menu", 4)) | |
400 { | |
401 int base = counttonextchar(desc, '=') + 1; | |
402 int i; | |
403 mywidget->type = tyMenu; | |
404 mywidget->wx=atoi(findnextstring(temp, desc, &base)); | |
405 mywidget->x=0; | |
406 mywidget->wy=mywidget->y=atoi(findnextstring(temp, desc, &base)); | |
407 mywidget->wwidth=mywidget->width=atoi(findnextstring(temp, desc, &base)); | |
408 mywidget->wheight=mywidget->height=atoi(findnextstring(temp, desc, &base)); | |
409 findnextstring(temp, desc, &base); | |
410 mywidget->msg = evNone; | |
411 for (i=0; i<evBoxs; i++) | |
412 { | |
413 if(!strcmp(temp, evNames[i].name)) | |
414 { | |
415 mywidget->msg = evNames[i].msg; | |
416 break; | |
417 } | |
418 } | |
34450 | 419 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [MENU] %i %i %i %i msg %i\n", |
23077 | 420 mywidget->x, mywidget->y, mywidget->width, mywidget->height, mywidget->msg); |
421 } | |
422 else if(!strncmp(desc, "selected", 8)) | |
423 { | |
424 win->base->bitmap[1] = pngRead(skin, (char *) desc + 9); | |
34450 | 425 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [BASE] added image %s\n", win->base->bitmap[1]->name); |
23077 | 426 } |
427 else if(!strncmp(desc, "slabel",6)) | |
428 { | |
429 int base = counttonextchar(desc, '=') + 1; | |
430 unsigned int i; | |
431 mywidget->type = tySlabel; | |
432 mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); | |
433 mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); | |
434 findnextstring(temp, desc, &base); | |
435 mywidget->font = NULL; | |
436 for (i=0; i<skin->fontcount; i++) | |
437 { | |
438 if(!strcmp(temp, skin->fonts[i]->name)) | |
439 { | |
440 mywidget->font = skin->fonts[i]; | |
441 break; | |
442 } | |
443 } | |
444 mywidget->label = strdup(findnextstring(temp, desc, &base)); | |
34450 | 445 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [SLABEL] %i %i %s %s\n", |
23077 | 446 mywidget->x, mywidget->y, mywidget->font->name, mywidget->label); |
447 } | |
448 else if(!strncmp(desc, "dlabel", 6)) | |
449 { | |
450 int base = counttonextchar(desc, '=') + 1; | |
451 unsigned int i; | |
452 mywidget->type = tyDlabel; | |
453 mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); | |
454 mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); | |
455 mywidget->length = atoi(findnextstring(temp, desc, &base)); | |
456 mywidget->align = atoi(findnextstring(temp, desc, &base)); | |
457 findnextstring(temp, desc, &base); | |
458 mywidget->font = NULL; | |
459 for (i=0; i<skin->fontcount; i++) | |
460 { | |
461 if(!strcmp(temp, skin->fonts[i]->name)) | |
462 { | |
463 mywidget->font=skin->fonts[i]; | |
464 break; | |
465 } | |
466 } | |
467 mywidget->label=strdup(findnextstring(temp, desc, &base)); | |
34450 | 468 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [DLABEL] %i %i %i %i %s \"%s\"\n", |
23077 | 469 mywidget->x, mywidget->y, mywidget->length, mywidget->align, mywidget->font->name, mywidget->label); |
470 } | |
471 free(temp); | |
472 } | |
473 | |
474 static void loadfonts(skin_t* skin) | |
475 { | |
476 unsigned int x; | |
477 for (x=0; x<skin->fontcount; x++) | |
478 { | |
479 FILE *fp; | |
480 int linenumber=0; | |
481 char *filename; | |
482 char *tmp = calloc(1, MAX_LINESIZE); | |
483 char *desc = calloc(1, MAX_LINESIZE); | |
484 filename = calloc(1, strlen(skin->skindir) + strlen(skin->fonts[x]->name) + 6); | |
34092
dbf5042ab255
Don't use the Windows style path separator character in Win32 GUI.
ib
parents:
33784
diff
changeset
|
485 sprintf(filename, "%s/%s.fnt", skin->skindir, skin->fonts[x]->name); |
23077 | 486 if(!(fp = fopen(filename,"rb"))) |
487 { | |
488 mp_msg(MSGT_GPLAYER, MSGL_ERR, "[FONT LOAD] Font not found \"%s\"\n", skin->fonts[x]->name); | |
33783 | 489 free(tmp); |
490 free(desc); | |
491 free(filename); | |
23077 | 492 return; |
493 } | |
494 while(!feof(fp)) | |
495 { | |
496 int pos = 0; | |
497 unsigned int i; | |
498 fgets(tmp, MAX_LINESIZE, fp); | |
499 linenumber++; | |
500 memset(desc, 0, MAX_LINESIZE); | |
501 for (i=0; i<strlen(tmp); i++) | |
502 { | |
503 /* remove spaces and linebreaks */ | |
504 if((tmp[i] == ' ') || (tmp[i] == '\n') || (tmp[i] == '\r')) continue; | |
505 /* remove comments */ | |
506 if((tmp[i] == ';') && ((i < 1) || (tmp[i-1] != '\"'))) | |
507 { | |
34450 | 508 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[FONT LOAD] Comment: %s", tmp + i + 1); |
23077 | 509 break; |
510 } | |
511 desc[pos] = tmp[i]; | |
512 pos++; | |
513 } | |
514 if(!strlen(desc)) continue; | |
515 /* now we have "readable" output -> parse it */ | |
516 if(!strncmp(desc, "image", 5)) | |
517 { | |
518 skin->fonts[x]->image = pngRead(skin, desc + 6); | |
34450 | 519 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[FONT] [IMAGE] \"%s\"\n", desc + 6); |
23077 | 520 } |
521 else | |
522 { | |
523 int base = 4; | |
524 if(*desc != '"') break; | |
525 if(*(desc + 1) == 0) break; | |
526 (skin->fonts[x]->charcount)++; | |
527 skin->fonts[x]->chars = realloc(skin->fonts[x]->chars, sizeof(char_t *) *skin->fonts[x]->charcount); | |
528 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]=calloc(1, sizeof(char_t)); | |
529 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->c = ((*(desc + 1) == '"') && (*(desc + 2) != '"')) ? ' ': *(desc + 1); | |
530 if((*(desc + 1) == '"') && (*(desc + 2) != '"')) base = 3; | |
531 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->x = atoi(findnextstring(tmp, desc, &base)); | |
532 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->y = atoi(findnextstring(tmp, desc, &base)); | |
533 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->width = atoi(findnextstring(tmp, desc, &base)); | |
534 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->height = atoi(findnextstring(tmp, desc, &base)); | |
34450 | 535 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[FONT] [CHAR] %c %i %i %i %i\n", |
23077 | 536 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->c, |
537 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->x, | |
538 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->y, | |
539 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->width, | |
540 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->height); | |
541 } | |
542 } | |
543 free(desc); | |
544 free(filename); | |
545 free(tmp); | |
546 fclose(fp); | |
547 } | |
548 } | |
549 | |
550 skin_t* loadskin(char* skindir, int desktopbpp) | |
551 { | |
552 FILE *fp; | |
35501 | 553 int reachedendofwindow = FALSE; |
23077 | 554 int linenumber = 0; |
555 skin_t *skin = calloc(1, sizeof(skin_t)); | |
556 char *filename; | |
557 char *tmp = calloc(1, MAX_LINESIZE); | |
558 char *desc = calloc(1, MAX_LINESIZE); | |
559 window* mywindow = NULL; | |
560 | |
561 /* setup funcs */ | |
562 skin->freeskin = freeskin; | |
563 skin->pngRead = pngRead; | |
564 skin->addwidget = addwidget; | |
565 skin->removewidget = removewidget; | |
566 skin->geteventname = geteventname; | |
567 skin->desktopbpp = desktopbpp; | |
568 skin->skindir = strdup(skindir); | |
569 | |
570 filename = calloc(1, strlen(skin->skindir) + strlen("skin") + 2); | |
34092
dbf5042ab255
Don't use the Windows style path separator character in Win32 GUI.
ib
parents:
33784
diff
changeset
|
571 sprintf(filename, "%s/skin", skin->skindir); |
23077 | 572 if(!(fp = fopen(filename, "rb"))) |
573 { | |
574 mp_msg(MSGT_GPLAYER, MSGL_FATAL, "[SKIN LOAD] Skin \"%s\" not found\n", skindir); | |
575 skin->freeskin(skin); | |
33783 | 576 free(tmp); |
577 free(desc); | |
578 free(filename); | |
23077 | 579 return NULL; |
580 } | |
581 | |
582 while(!feof(fp)) | |
583 { | |
584 int pos = 0; | |
585 unsigned int i; | |
35501 | 586 int insidequote = FALSE; |
23077 | 587 fgets(tmp, MAX_LINESIZE, fp); |
588 linenumber++; | |
589 memset(desc, 0, MAX_LINESIZE); | |
590 for (i=0; i<strlen(tmp); i++) | |
591 { | |
35501 | 592 if((tmp[i] == '"') && !insidequote) { insidequote=TRUE; continue; } |
593 else if((tmp[i] == '"') && insidequote) { insidequote=FALSE ; continue; } | |
23077 | 594 /* remove spaces and linebreaks */ |
595 if((!insidequote && (tmp[i] == ' ')) || (tmp[i] == '\n') || (tmp[i] == '\r')) continue; | |
596 /* remove comments */ | |
597 else if(tmp[i] == ';') | |
598 { | |
34450 | 599 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN LOAD] Comment: %s", tmp + i + 1); |
23077 | 600 break; |
601 } | |
602 desc[pos] = tmp[i]; | |
603 pos++; | |
604 } | |
605 | |
606 if(!strlen(desc)) continue; | |
607 /* now we have "readable" output -> parse it */ | |
608 /* parse window specific info */ | |
609 if(!strncmp(desc, "section", 7)) | |
610 { | |
34450 | 611 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [SECTION] \"%s\"\n", desc + 8); |
23077 | 612 } |
613 else if(!strncmp(desc, "window", 6)) | |
614 { | |
34450 | 615 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [WINDOW] \"%s\"\n", desc + 7); |
35501 | 616 reachedendofwindow = FALSE; |
23077 | 617 (skin->windowcount)++; |
618 skin->windows = realloc(skin->windows, sizeof(window *) * skin->windowcount); | |
619 mywindow = skin->windows[(skin->windowcount) - 1] = calloc(1, sizeof(window)); | |
620 mywindow->name = strdup(desc + 7); | |
621 if(!strncmp(desc + 7, "main", 4)) mywindow->type = wiMain; | |
34697 | 622 else if(!strncmp(desc+7, "video", 5) || !strncmp(desc+7, "sub", 3)) // legacy |
23077 | 623 { |
34697 | 624 mywindow->type = wiVideo; |
35501 | 625 mywindow->decoration = TRUE; |
23077 | 626 } |
627 else if(!strncmp(desc + 7, "menu", 4)) mywindow->type = wiMenu; | |
628 else if(!strncmp(desc + 7, "playbar", 7)) mywindow->type = wiPlaybar; | |
629 else mp_msg(MSGT_GPLAYER, MSGL_V, "[SKIN] warning found unknown windowtype"); | |
630 } | |
631 else if(!strncmp(desc, "decoration", 10) && !strncmp(desc + 11, "enable", 6)) | |
632 { | |
35501 | 633 mywindow->decoration = TRUE; |
34450 | 634 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [DECORATION] enabled decoration for window \"%s\"\n", mywindow->name); |
23077 | 635 } |
636 else if(!strncmp(desc, "background", 10)) | |
637 { | |
638 int base = counttonextchar(desc, '=') + 1; | |
639 char temp[MAX_LINESIZE]; | |
640 mywindow->backgroundcolor[0] = atoi(findnextstring(temp, desc, &base)); | |
641 mywindow->backgroundcolor[1] = atoi(findnextstring(temp, desc, &base)); | |
642 mywindow->backgroundcolor[2] = atoi(findnextstring(temp, desc, &base)); | |
34450 | 643 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [BACKGROUND] window \"%s\" has backgroundcolor (%i,%i,%i)\n", mywindow->name, |
23077 | 644 mywindow->backgroundcolor[0], |
645 mywindow->backgroundcolor[1], | |
646 mywindow->backgroundcolor[2]); | |
647 } | |
648 else if(!strncmp(desc, "end", 3)) | |
649 { | |
650 if(reachedendofwindow) | |
651 { | |
34450 | 652 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [END] of section\n"); |
23077 | 653 } |
654 else | |
655 { | |
35501 | 656 reachedendofwindow = TRUE; |
34450 | 657 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [END] of window \"%s\"\n", mywindow->name); |
23077 | 658 } |
659 } | |
660 else if(!strncmp(desc, "font", 4)) | |
661 { | |
662 unsigned int i; | |
663 int id = 0; | |
664 char temp[MAX_LINESIZE]; | |
665 int base = counttonextchar(desc, '=')+1; | |
666 findnextstring(temp, desc, &base); | |
667 findnextstring(temp, desc, &base); | |
668 for (i=0; i<skin->fontcount; i++) | |
669 if(!strcmp(skin->fonts[i]->id, temp)) | |
670 { | |
671 id = i; | |
672 break; | |
673 } | |
674 if(!id) | |
675 { | |
676 int base = counttonextchar(desc, '=') + 1; | |
677 findnextstring(temp, desc, &base); | |
678 id = skin->fontcount; | |
679 (skin->fontcount)++; | |
680 skin->fonts = realloc(skin->fonts, sizeof(font_t *) * skin->fontcount); | |
681 skin->fonts[id]=calloc(1, sizeof(font_t)); | |
682 skin->fonts[id]->name = strdup(temp); | |
683 skin->fonts[id]->id = strdup(findnextstring(temp, desc, &base)); | |
684 } | |
34450 | 685 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [FONT] id \"%s\" name \"%s\"\n", skin->fonts[id]->name, skin->fonts[id]->id); |
23077 | 686 } |
687 else | |
688 skin->addwidget(skin, mywindow, desc); | |
689 } | |
690 | |
691 free(desc); | |
692 free(filename); | |
693 free(tmp); | |
694 fclose(fp); | |
695 loadfonts(skin); | |
696 mp_msg(MSGT_GPLAYER, MSGL_V, "[SKIN LOAD] loaded skin \"%s\"\n", skin->skindir); | |
34450 | 697 dumpwidgets(skin); |
23077 | 698 return skin; |
699 } |