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>
7 * This file is part of MPlayer.
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.
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.
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
30 #include "cpudetect.h"
31 #include "libswscale/rgb2rgb.h"
32 #include "libswscale/swscale.h"
34 #include "gui/bitmap.h"
36 #define MAX_LINESIZE 256
44 static const evName evNames
[] =
48 { evDropFile
, "evDropFile" },
50 { evPause
, "evPause" },
54 { evEqualizer
, "evEqualizer" },
55 { evEqualizer
, "evEqualeaser" },
56 { evPlayList
, "evPlaylist" },
58 { evIconify
, "evIconify" },
59 { evIncBalance
, "evIncBalance" },
60 { evDecBalance
, "evDecBalance" },
61 { evFullScreen
, "evFullScreen" },
62 { evFName
, "evFName" },
63 { evMovieTime
, "evMovieTime" },
64 { evAbout
, "evAbout" },
65 { evLoadPlay
, "evLoadPlay" },
66 { evPreferences
, "evPreferences" },
67 { evSkinBrowser
, "evSkinBrowser" },
68 { evBackward10sec
, "evBackward10sec" },
69 { evForward10sec
, "evForward10sec" },
70 { evBackward1min
, "evBackward1min" },
71 { evForward1min
, "evForward1min" },
72 { evBackward10min
, "evBackward10min" },
73 { evForward10min
, "evForward10min" },
74 { evIncVolume
, "evIncVolume" },
75 { evDecVolume
, "evDecVolume" },
77 { evIncAudioBufDelay
, "evIncAudioBufDelay" },
78 { evDecAudioBufDelay
, "evDecAudioBufDelay" },
79 { evPlaySwitchToPause
, "evPlaySwitchToPause" },
80 { evPauseSwitchToPlay
, "evPauseSwitchToPlay" },
81 { evNormalSize
, "evNormalSize" },
82 { evDoubleSize
, "evDoubleSize" },
83 { evSetMoviePosition
, "evSetMoviePosition" },
84 { evSetVolume
, "evSetVolume" },
85 { evSetBalance
, "evSetBalance" },
87 { evLoadSubtitle
, "evLoadSubtitle" },
88 { evPlayDVD
, "evPlayDVD" },
89 { evPlayVCD
, "evPlayVCD" },
90 { evSetURL
, "evSetURL" },
91 { evLoadAudioFile
, "evLoadAudioFile" },
92 { evDropSubtitle
, "evDropSubtitle" },
93 { evSetAspect
, "evSetAspect" }
96 static const int evBoxs
= sizeof(evNames
) / sizeof(evName
);
98 static char *geteventname(int event
)
101 for(i
=0; i
<evBoxs
; i
++)
102 if(evNames
[i
].msg
== event
)
103 return evNames
[i
].name
;
107 static inline int get_sws_cpuflags(void)
109 return (gCpuCaps
.hasMMX
? SWS_CPU_CAPS_MMX
: 0) |
110 (gCpuCaps
.hasMMX2
? SWS_CPU_CAPS_MMX2
: 0) |
111 (gCpuCaps
.has3DNow
? SWS_CPU_CAPS_3DNOW
: 0);
114 /* reads a complete image as is into image buffer */
115 static image
*pngRead(skin_t
*skin
, unsigned char *fname
)
120 char *filename
= NULL
;
123 if(!stricmp(fname
, "NULL")) return 0;
125 /* find filename in order file file.png */
126 if(!(fp
= fopen(fname
, "rb")))
128 filename
= calloc(1, strlen(skin
->skindir
) + strlen(fname
) + 6);
129 sprintf(filename
, "%s\\%s.png", skin
->skindir
, fname
);
130 if(!(fp
= fopen(filename
, "rb")))
132 mp_msg(MSGT_GPLAYER
, MSGL_ERR
, "[png] cannot find image %s\n", filename
);
139 for (i
=0; i
< skin
->imagecount
; i
++)
140 if(!strcmp(fname
, skin
->images
[i
]->name
))
143 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[png] skinfile %s already exists\n", fname
);
146 return skin
->images
[i
];
148 (skin
->imagecount
)++;
149 skin
->images
= realloc(skin
->images
, sizeof(image
*) * skin
->imagecount
);
150 bf
= skin
->images
[(skin
->imagecount
) - 1] = calloc(1, sizeof(image
));
151 bf
->name
= strdup(fname
);
152 bpRead(filename
? filename
: fname
, &bmp
);
154 bf
->width
= bmp
.Width
; bf
->height
= bmp
.Height
;
157 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[png] loaded image %s\n", fname
);
158 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[png] size: %dx%d bits: %d\n", bf
->width
, bf
->height
, BPP
);
159 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[png] imagesize: %u\n", imgsize
);
162 bf
->size
= bf
->width
* bf
->height
* skin
->desktopbpp
/ 8;
163 if (skin
->desktopbpp
== 32)
164 bf
->data
= bmp
.Image
;
166 bf
->data
= malloc(bf
->size
);
167 rgb32tobgr32(bmp
.Image
, bmp
.Image
, bmp
.ImageSize
);
168 if(skin
->desktopbpp
== 16) rgb32tobgr15(bmp
.Image
, bf
->data
, bmp
.ImageSize
);
169 else if(skin
->desktopbpp
== 24) rgb32tobgr24(bmp
.Image
, bf
->data
, bmp
.ImageSize
);
175 /* frees all skin images */
176 static void freeimages(skin_t
*skin
)
179 for (i
=0; i
<skin
->imagecount
; i
++)
181 if(skin
->images
&& skin
->images
[i
])
183 if(skin
->images
[i
]->data
) free(skin
->images
[i
]->data
);
184 if(skin
->images
[i
]->name
) free(skin
->images
[i
]->name
);
185 free(skin
->images
[i
]);
192 void dumpwidgets(skin_t
*skin
)
195 for (i
=0; i
<skin
->widgetcount
; i
++)
196 mp_msg(MSGT_GPLAYER
, MSGL_V
, "widget %p id %i\n", skin
->widgets
[i
], skin
->widgets
[i
]->id
);
200 static int counttonextchar(const char *s1
, char c
)
203 for (i
=0; i
<strlen(s1
); i
++)
204 if(s1
[i
] == c
) return i
;
208 static char *findnextstring(char *temp
, const char *desc
, int *base
)
210 int len
= counttonextchar(*base
+ desc
, ',');
211 memset(temp
, 0, strlen(desc
) + 1);
212 if(!len
) len
= strlen(desc
);
213 memcpy(temp
, *base
+ desc
, len
);
218 static void freeskin(skin_t
*skin
)
224 skin
->skindir
= NULL
;
227 for (i
=1; i
<=skin
->lastusedid
; i
++)
228 skin
->removewidget(skin
, i
);
233 skin
->widgets
= NULL
;
237 for(i
=0; i
<skin
->windowcount
; i
++)
239 if(skin
->windows
[i
]->name
)
241 free(skin
->windows
[i
]->name
);
242 skin
->windows
[i
]->name
= NULL
;
244 free(skin
->windows
[i
]);
248 skin
->windows
= NULL
;
250 for (i
=0; i
<skin
->fontcount
; i
++)
253 if(skin
->fonts
[i
]->name
)
255 free(skin
->fonts
[i
]->name
);
256 skin
->fonts
[i
]->name
= NULL
;
259 if(skin
->fonts
[i
]->id
)
261 free(skin
->fonts
[i
]->id
);
262 skin
->fonts
[i
]->id
= NULL
;
265 for (x
=0; x
<skin
->fonts
[i
]->charcount
; x
++)
267 free(skin
->fonts
[i
]->chars
[x
]);
268 skin
->fonts
[i
]->chars
[x
] = NULL
;
271 if(skin
->fonts
[i
]->chars
)
273 free(skin
->fonts
[i
]->chars
);
274 skin
->fonts
[i
]->chars
= NULL
;
277 free(skin
->fonts
[i
]);
278 skin
->fonts
[i
] = NULL
;
283 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN FREE] skin freed\n");
289 static void removewidget(skin_t
*skin
, int id
)
293 widget
**temp
= calloc(skin
->widgetcount
- 1, sizeof(widget
*));
295 for (i
=0; i
<skin
->widgetcount
; i
++)
297 if(skin
->widgets
[i
]->id
== id
)
299 if(skin
->widgets
[i
]->label
)
300 free(skin
->widgets
[i
]->label
);
301 free(skin
->widgets
[i
]);
302 skin
->widgets
[i
] = NULL
;
306 temp
[pos
] = skin
->widgets
[i
];
312 (skin
->widgetcount
)--;
314 skin
->widgets
= temp
;
316 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "removed widget %i\n", id
);
321 mp_msg(MSGT_GPLAYER
, MSGL_ERR
, "widget %i not found\n", id
);
324 static void addwidget(skin_t
*skin
, window
*win
, const char *desc
)
327 char *temp
= calloc(1, strlen(desc
) + 1);
328 (skin
->widgetcount
)++;
329 (skin
->lastusedid
)++;
330 skin
->widgets
= realloc(skin
->widgets
, sizeof(widget
*) * skin
->widgetcount
);
331 mywidget
= skin
->widgets
[(skin
->widgetcount
) - 1] = calloc(1, sizeof(widget
));
332 mywidget
->id
= skin
->lastusedid
;
333 mywidget
->window
= win
->type
;
334 /* parse and fill widget specific info */
335 if(!strncmp(desc
, "base", 4))
337 int base
= counttonextchar(desc
, '=') + 1;
338 mywidget
->type
= tyBase
;
339 mywidget
->bitmap
[0] = pngRead(skin
, findnextstring(temp
, desc
, &base
));
340 mywidget
->wx
= mywidget
->x
= atoi(findnextstring(temp
, desc
, &base
));
341 mywidget
->wy
= mywidget
->y
= atoi(findnextstring(temp
, desc
, &base
));
342 mywidget
->wwidth
= mywidget
->width
= atoi(findnextstring(temp
, desc
, &base
));
343 mywidget
->wheight
= mywidget
->height
= atoi(findnextstring(temp
, desc
, &base
));
344 win
->base
= mywidget
;
346 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [ITEM] [BASE] %s %i %i %i %i\n",
347 (mywidget
->bitmap
[0]) ? mywidget
->bitmap
[0]->name
: NULL
,
348 mywidget
->x
, mywidget
->y
, mywidget
->width
, mywidget
->height
);
351 else if(!strncmp(desc
, "button", 6))
353 int base
= counttonextchar(desc
, '=') + 1;
355 mywidget
->type
= tyButton
;
356 mywidget
->bitmap
[0] = pngRead(skin
, findnextstring(temp
, desc
, &base
));
357 mywidget
->wx
= mywidget
->x
= atoi(findnextstring(temp
, desc
, &base
));
358 mywidget
->wy
= mywidget
->y
= atoi(findnextstring(temp
, desc
, &base
));
359 mywidget
->wwidth
= mywidget
->width
= atoi(findnextstring(temp
, desc
, &base
));
360 mywidget
->wheight
= mywidget
->height
= atoi(findnextstring(temp
, desc
, &base
));
361 findnextstring(temp
, desc
, &base
);
363 /* Assign corresponding event to the widget */
364 mywidget
->msg
= evNone
;
365 for (i
=0; i
<evBoxs
; i
++)
367 if(!strcmp(temp
, evNames
[i
].name
))
369 mywidget
->msg
= evNames
[i
].msg
;
375 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [ITEM] [BUTTON] %s %i %i %i %i msg %i\n",
376 (mywidget
->bitmap
[0]) ? mywidget
->bitmap
[0]->name
: NULL
,
377 mywidget
->x
, mywidget
->y
, mywidget
->width
, mywidget
->height
, mywidget
->msg
);
380 else if(!strncmp(desc
, "hpotmeter", 9) || !strncmp(desc
, "vpotmeter", 9))
382 int base
= counttonextchar(desc
, '=') + 1;
384 /* hpotmeter = button, bwidth, bheight, phases, numphases, default, X, Y, width, height, message */
385 if(!strncmp(desc
, "hpotmeter", 9)) mywidget
->type
= tyHpotmeter
;
386 else mywidget
->type
= tyVpotmeter
;
387 mywidget
->bitmap
[0] = pngRead(skin
, findnextstring(temp
, desc
, &base
));
388 mywidget
->width
= atoi(findnextstring(temp
, desc
, &base
));
389 mywidget
->height
= atoi(findnextstring(temp
, desc
, &base
));
390 mywidget
->bitmap
[1] = pngRead(skin
, findnextstring(temp
, desc
, &base
));
391 mywidget
->phases
= atoi(findnextstring(temp
, desc
, &base
));
392 mywidget
->value
= atof(findnextstring(temp
, desc
, &base
));
393 mywidget
->x
= mywidget
->wx
= atoi(findnextstring(temp
, desc
, &base
));
394 mywidget
->y
= mywidget
->wy
= atoi(findnextstring(temp
, desc
, &base
));
395 mywidget
->wwidth
= atoi(findnextstring(temp
, desc
, &base
));
396 mywidget
->wheight
= atoi(findnextstring(temp
, desc
, &base
));
397 findnextstring(temp
, desc
, &base
);
398 mywidget
->msg
= evNone
;
399 for (i
=0; i
<evBoxs
; i
++)
401 if(!strcmp(temp
, evNames
[i
].name
))
403 mywidget
->msg
= evNames
[i
].msg
;
408 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [ITEM] %s %s %i %i %s %i %f %i %i %i %i msg %i\n",
409 (mywidget
->type
== tyHpotmeter
) ? "[HPOTMETER]" : "[VPOTMETER]",
410 (mywidget
->bitmap
[0]) ? mywidget
->bitmap
[0]->name
: NULL
,
411 mywidget
->width
, mywidget
->height
,
412 (mywidget
->bitmap
[1]) ? mywidget
->bitmap
[1]->name
: NULL
,
413 mywidget
->phases
, mywidget
->value
,
414 mywidget
->wx
, mywidget
->wy
, mywidget
->wwidth
, mywidget
->wwidth
,
418 else if(!strncmp(desc
, "potmeter", 8))
420 int base
= counttonextchar(desc
, '=') + 1;
422 /* potmeter = phases, numphases, default, X, Y, width, height, message */
423 mywidget
->type
= tyPotmeter
;
424 mywidget
->bitmap
[0] = pngRead(skin
, findnextstring(temp
, desc
, &base
));
425 mywidget
->phases
= atoi(findnextstring(temp
, desc
, &base
));
426 mywidget
->value
= atof(findnextstring(temp
, desc
, &base
));
427 mywidget
->wx
= mywidget
->x
= atoi(findnextstring(temp
, desc
, &base
));
428 mywidget
->wy
= mywidget
->y
= atoi(findnextstring(temp
, desc
, &base
));
429 mywidget
->wwidth
= mywidget
->width
= atoi(findnextstring(temp
, desc
, &base
));
430 mywidget
->wheight
= mywidget
->height
= atoi(findnextstring(temp
, desc
, &base
));
431 findnextstring(temp
, desc
, &base
);
432 mywidget
->msg
= evNone
;
433 for (i
=0; i
<evBoxs
; i
++)
435 if(!strcmp(temp
, evNames
[i
].name
))
437 mywidget
->msg
=evNames
[i
].msg
;
442 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [ITEM] [POTMETER] %s %i %i %i %f %i %i msg %i\n",
443 (mywidget
->bitmap
[0]) ? mywidget
->bitmap
[0]->name
: NULL
,
444 mywidget
->width
, mywidget
->height
,
445 mywidget
->phases
, mywidget
->value
,
446 mywidget
->x
, mywidget
->y
,
450 else if(!strncmp(desc
, "menu", 4))
452 int base
= counttonextchar(desc
, '=') + 1;
454 mywidget
->type
= tyMenu
;
455 mywidget
->wx
=atoi(findnextstring(temp
, desc
, &base
));
457 mywidget
->wy
=mywidget
->y
=atoi(findnextstring(temp
, desc
, &base
));
458 mywidget
->wwidth
=mywidget
->width
=atoi(findnextstring(temp
, desc
, &base
));
459 mywidget
->wheight
=mywidget
->height
=atoi(findnextstring(temp
, desc
, &base
));
460 findnextstring(temp
, desc
, &base
);
461 mywidget
->msg
= evNone
;
462 for (i
=0; i
<evBoxs
; i
++)
464 if(!strcmp(temp
, evNames
[i
].name
))
466 mywidget
->msg
= evNames
[i
].msg
;
471 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [ITEM] [MENU] %i %i %i %i msg %i\n",
472 mywidget
->x
, mywidget
->y
, mywidget
->width
, mywidget
->height
, mywidget
->msg
);
475 else if(!strncmp(desc
, "selected", 8))
477 win
->base
->bitmap
[1] = pngRead(skin
, (char *) desc
+ 9);
479 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [ITEM] [BASE] added image %s\n", win
->base
->bitmap
[1]->name
);
482 else if(!strncmp(desc
, "slabel",6))
484 int base
= counttonextchar(desc
, '=') + 1;
486 mywidget
->type
= tySlabel
;
487 mywidget
->wx
= mywidget
->x
= atoi(findnextstring(temp
, desc
, &base
));
488 mywidget
->wy
= mywidget
->y
= atoi(findnextstring(temp
, desc
, &base
));
489 findnextstring(temp
, desc
, &base
);
490 mywidget
->font
= NULL
;
491 for (i
=0; i
<skin
->fontcount
; i
++)
493 if(!strcmp(temp
, skin
->fonts
[i
]->name
))
495 mywidget
->font
= skin
->fonts
[i
];
499 mywidget
->label
= strdup(findnextstring(temp
, desc
, &base
));
501 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [ITEM] [SLABEL] %i %i %s %s\n",
502 mywidget
->x
, mywidget
->y
, mywidget
->font
->name
, mywidget
->label
);
505 else if(!strncmp(desc
, "dlabel", 6))
507 int base
= counttonextchar(desc
, '=') + 1;
509 mywidget
->type
= tyDlabel
;
510 mywidget
->wx
= mywidget
->x
= atoi(findnextstring(temp
, desc
, &base
));
511 mywidget
->wy
= mywidget
->y
= atoi(findnextstring(temp
, desc
, &base
));
512 mywidget
->length
= atoi(findnextstring(temp
, desc
, &base
));
513 mywidget
->align
= atoi(findnextstring(temp
, desc
, &base
));
514 findnextstring(temp
, desc
, &base
);
515 mywidget
->font
= NULL
;
516 for (i
=0; i
<skin
->fontcount
; i
++)
518 if(!strcmp(temp
, skin
->fonts
[i
]->name
))
520 mywidget
->font
=skin
->fonts
[i
];
524 mywidget
->label
=strdup(findnextstring(temp
, desc
, &base
));
526 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [ITEM] [DLABEL] %i %i %i %i %s \"%s\"\n",
527 mywidget
->x
, mywidget
->y
, mywidget
->length
, mywidget
->align
, mywidget
->font
->name
, mywidget
->label
);
533 static void loadfonts(skin_t
* skin
)
536 for (x
=0; x
<skin
->fontcount
; x
++)
541 char *tmp
= calloc(1, MAX_LINESIZE
);
542 char *desc
= calloc(1, MAX_LINESIZE
);
543 filename
= calloc(1, strlen(skin
->skindir
) + strlen(skin
->fonts
[x
]->name
) + 6);
544 sprintf(filename
, "%s\\%s.fnt", skin
->skindir
, skin
->fonts
[x
]->name
);
545 if(!(fp
= fopen(filename
,"rb")))
547 mp_msg(MSGT_GPLAYER
, MSGL_ERR
, "[FONT LOAD] Font not found \"%s\"\n", skin
->fonts
[x
]->name
);
554 fgets(tmp
, MAX_LINESIZE
, fp
);
556 memset(desc
, 0, MAX_LINESIZE
);
557 for (i
=0; i
<strlen(tmp
); i
++)
559 /* remove spaces and linebreaks */
560 if((tmp
[i
] == ' ') || (tmp
[i
] == '\n') || (tmp
[i
] == '\r')) continue;
561 /* remove comments */
562 if((tmp
[i
] == ';') && ((i
< 1) || (tmp
[i
-1] != '\"')))
565 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[FONT LOAD] Comment: %s", tmp
+ i
+ 1);
572 if(!strlen(desc
)) continue;
573 /* now we have "readable" output -> parse it */
574 if(!strncmp(desc
, "image", 5))
576 skin
->fonts
[x
]->image
= pngRead(skin
, desc
+ 6);
578 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[FONT] [IMAGE] \"%s\"\n", desc
+ 6);
584 if(*desc
!= '"') break;
585 if(*(desc
+ 1) == 0) break;
586 (skin
->fonts
[x
]->charcount
)++;
587 skin
->fonts
[x
]->chars
= realloc(skin
->fonts
[x
]->chars
, sizeof(char_t
*) *skin
->fonts
[x
]->charcount
);
588 skin
->fonts
[x
]->chars
[skin
->fonts
[x
]->charcount
- 1]=calloc(1, sizeof(char_t
));
589 skin
->fonts
[x
]->chars
[skin
->fonts
[x
]->charcount
- 1]->c
= ((*(desc
+ 1) == '"') && (*(desc
+ 2) != '"')) ? ' ': *(desc
+ 1);
590 if((*(desc
+ 1) == '"') && (*(desc
+ 2) != '"')) base
= 3;
591 skin
->fonts
[x
]->chars
[skin
->fonts
[x
]->charcount
- 1]->x
= atoi(findnextstring(tmp
, desc
, &base
));
592 skin
->fonts
[x
]->chars
[skin
->fonts
[x
]->charcount
- 1]->y
= atoi(findnextstring(tmp
, desc
, &base
));
593 skin
->fonts
[x
]->chars
[skin
->fonts
[x
]->charcount
- 1]->width
= atoi(findnextstring(tmp
, desc
, &base
));
594 skin
->fonts
[x
]->chars
[skin
->fonts
[x
]->charcount
- 1]->height
= atoi(findnextstring(tmp
, desc
, &base
));
596 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[FONT] [CHAR] %c %i %i %i %i\n",
597 skin
->fonts
[x
]->chars
[skin
->fonts
[x
]->charcount
- 1]->c
,
598 skin
->fonts
[x
]->chars
[skin
->fonts
[x
]->charcount
- 1]->x
,
599 skin
->fonts
[x
]->chars
[skin
->fonts
[x
]->charcount
- 1]->y
,
600 skin
->fonts
[x
]->chars
[skin
->fonts
[x
]->charcount
- 1]->width
,
601 skin
->fonts
[x
]->chars
[skin
->fonts
[x
]->charcount
- 1]->height
);
612 skin_t
* loadskin(char* skindir
, int desktopbpp
)
615 int reachedendofwindow
= 0;
617 skin_t
*skin
= calloc(1, sizeof(skin_t
));
619 char *tmp
= calloc(1, MAX_LINESIZE
);
620 char *desc
= calloc(1, MAX_LINESIZE
);
621 window
* mywindow
= NULL
;
624 sws_rgb2rgb_init(get_sws_cpuflags());
626 skin
->freeskin
= freeskin
;
627 skin
->pngRead
= pngRead
;
628 skin
->addwidget
= addwidget
;
629 skin
->removewidget
= removewidget
;
630 skin
->geteventname
= geteventname
;
631 skin
->desktopbpp
= desktopbpp
;
632 skin
->skindir
= strdup(skindir
);
634 filename
= calloc(1, strlen(skin
->skindir
) + strlen("skin") + 2);
635 sprintf(filename
, "%s\\skin", skin
->skindir
);
636 if(!(fp
= fopen(filename
, "rb")))
638 mp_msg(MSGT_GPLAYER
, MSGL_FATAL
, "[SKIN LOAD] Skin \"%s\" not found\n", skindir
);
639 skin
->freeskin(skin
);
648 fgets(tmp
, MAX_LINESIZE
, fp
);
650 memset(desc
, 0, MAX_LINESIZE
);
651 for (i
=0; i
<strlen(tmp
); i
++)
653 if((tmp
[i
] == '"') && !insidequote
) { insidequote
=1; continue; }
654 else if((tmp
[i
] == '"') && insidequote
) { insidequote
=0 ; continue; }
655 /* remove spaces and linebreaks */
656 if((!insidequote
&& (tmp
[i
] == ' ')) || (tmp
[i
] == '\n') || (tmp
[i
] == '\r')) continue;
657 /* remove comments */
658 else if(tmp
[i
] == ';')
661 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN LOAD] Comment: %s", tmp
+ i
+ 1);
669 if(!strlen(desc
)) continue;
670 /* now we have "readable" output -> parse it */
671 /* parse window specific info */
672 if(!strncmp(desc
, "section", 7))
675 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [SECTION] \"%s\"\n", desc
+ 8);
678 else if(!strncmp(desc
, "window", 6))
681 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [WINDOW] \"%s\"\n", desc
+ 7);
683 reachedendofwindow
= 0;
684 (skin
->windowcount
)++;
685 skin
->windows
= realloc(skin
->windows
, sizeof(window
*) * skin
->windowcount
);
686 mywindow
= skin
->windows
[(skin
->windowcount
) - 1] = calloc(1, sizeof(window
));
687 mywindow
->name
= strdup(desc
+ 7);
688 if(!strncmp(desc
+ 7, "main", 4)) mywindow
->type
= wiMain
;
689 else if(!strncmp(desc
+7, "sub", 3))
691 mywindow
->type
= wiSub
;
692 mywindow
->decoration
= 1;
694 else if(!strncmp(desc
+ 7, "menu", 4)) mywindow
->type
= wiMenu
;
695 else if(!strncmp(desc
+ 7, "playbar", 7)) mywindow
->type
= wiPlaybar
;
696 else mp_msg(MSGT_GPLAYER
, MSGL_V
, "[SKIN] warning found unknown windowtype");
698 else if(!strncmp(desc
, "decoration", 10) && !strncmp(desc
+ 11, "enable", 6))
700 mywindow
->decoration
= 1;
702 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [DECORATION] enabled decoration for window \"%s\"\n", mywindow
->name
);
705 else if(!strncmp(desc
, "background", 10))
707 int base
= counttonextchar(desc
, '=') + 1;
708 char temp
[MAX_LINESIZE
];
709 mywindow
->backgroundcolor
[0] = atoi(findnextstring(temp
, desc
, &base
));
710 mywindow
->backgroundcolor
[1] = atoi(findnextstring(temp
, desc
, &base
));
711 mywindow
->backgroundcolor
[2] = atoi(findnextstring(temp
, desc
, &base
));
713 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [BACKGROUND] window \"%s\" has backgroundcolor (%i,%i,%i)\n", mywindow
->name
,
714 mywindow
->backgroundcolor
[0],
715 mywindow
->backgroundcolor
[1],
716 mywindow
->backgroundcolor
[2]);
719 else if(!strncmp(desc
, "end", 3))
721 if(reachedendofwindow
)
724 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [END] of section\n");
729 reachedendofwindow
= 1;
731 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [END] of window \"%s\"\n", mywindow
->name
);
735 else if(!strncmp(desc
, "font", 4))
739 char temp
[MAX_LINESIZE
];
740 int base
= counttonextchar(desc
, '=')+1;
741 findnextstring(temp
, desc
, &base
);
742 findnextstring(temp
, desc
, &base
);
743 for (i
=0; i
<skin
->fontcount
; i
++)
744 if(!strcmp(skin
->fonts
[i
]->id
, temp
))
751 int base
= counttonextchar(desc
, '=') + 1;
752 findnextstring(temp
, desc
, &base
);
753 id
= skin
->fontcount
;
755 skin
->fonts
= realloc(skin
->fonts
, sizeof(font_t
*) * skin
->fontcount
);
756 skin
->fonts
[id
]=calloc(1, sizeof(font_t
));
757 skin
->fonts
[id
]->name
= strdup(temp
);
758 skin
->fonts
[id
]->id
= strdup(findnextstring(temp
, desc
, &base
));
761 mp_msg(MSGT_GPLAYER
, MSGL_DBG4
, "[SKIN] [FONT] id \"%s\" name \"%s\"\n", skin
->fonts
[id
]->name
, skin
->fonts
[id
]->id
);
765 skin
->addwidget(skin
, mywindow
, desc
);
773 mp_msg(MSGT_GPLAYER
, MSGL_V
, "[SKIN LOAD] loaded skin \"%s\"\n", skin
->skindir
);
774 /* dumpwidgets(skin); */