📄 skinload.c
字号:
/* * MPlayer GUI for Win32 * Copyright (C) 2003 Sascha Sommer <saschasommer@freenet.de> * Copyright (C) 2006 Erik Augustson <erik_27can@yahoo.com> * Copyright (C) 2006 Gianluigi Tiesi <sherpya@netfarm.it> * * This file is part of MPlayer. * * MPlayer is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MPlayer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MPlayer; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */#include <stdlib.h>#include <stdio.h>#include <inttypes.h>#include <windows.h>#include "mp_msg.h"#include "cpudetect.h"#include "libswscale/rgb2rgb.h"#include "libswscale/swscale.h"#include "gui.h"#include "bitmap.h"#define MAX_LINESIZE 256typedef struct{ int msg; char *name;} evName;static const evName evNames[] ={ { evNone, "evNone" }, { evPlay, "evPlay" }, { evDropFile, "evDropFile" }, { evStop, "evStop" }, { evPause, "evPause" }, { evPrev, "evPrev" }, { evNext, "evNext" }, { evLoad, "evLoad" }, { evEqualizer, "evEqualizer" }, { evEqualizer, "evEqualeaser" }, { evPlayList, "evPlaylist" }, { evExit, "evExit" }, { evIconify, "evIconify" }, { evIncBalance, "evIncBalance" }, { evDecBalance, "evDecBalance" }, { evFullScreen, "evFullScreen" }, { evFName, "evFName" }, { evMovieTime, "evMovieTime" }, { evAbout, "evAbout" }, { evLoadPlay, "evLoadPlay" }, { evPreferences, "evPreferences" }, { evSkinBrowser, "evSkinBrowser" }, { evBackward10sec, "evBackward10sec" }, { evForward10sec, "evForward10sec" }, { evBackward1min, "evBackward1min" }, { evForward1min, "evForward1min" }, { evBackward10min, "evBackward10min" }, { evForward10min, "evForward10min" }, { evIncVolume, "evIncVolume" }, { evDecVolume, "evDecVolume" }, { evMute, "evMute" }, { evIncAudioBufDelay, "evIncAudioBufDelay" }, { evDecAudioBufDelay, "evDecAudioBufDelay" }, { evPlaySwitchToPause, "evPlaySwitchToPause" }, { evPauseSwitchToPlay, "evPauseSwitchToPlay" }, { evNormalSize, "evNormalSize" }, { evDoubleSize, "evDoubleSize" }, { evSetMoviePosition, "evSetMoviePosition" }, { evSetVolume, "evSetVolume" }, { evSetBalance, "evSetBalance" }, { evHelp, "evHelp" }, { evLoadSubtitle, "evLoadSubtitle" }, { evPlayDVD, "evPlayDVD" }, { evPlayVCD, "evPlayVCD" }, { evSetURL, "evSetURL" }, { evLoadAudioFile, "evLoadAudioFile" }, { evDropSubtitle, "evDropSubtitle" }, { evSetAspect, "evSetAspect" }};static const int evBoxs = sizeof(evNames) / sizeof(evName);static char *geteventname(int event){ int i; for(i=0; i<evBoxs; i++) if(evNames[i].msg == event) return evNames[i].name; return NULL;}static inline int get_sws_cpuflags(void){ return (gCpuCaps.hasMMX ? SWS_CPU_CAPS_MMX : 0) | (gCpuCaps.hasMMX2 ? SWS_CPU_CAPS_MMX2 : 0) | (gCpuCaps.has3DNow ? SWS_CPU_CAPS_3DNOW : 0);}/* reads a complete image as is into image buffer */static image *pngRead(skin_t *skin, unsigned char *fname){ int i; txSample bmp; image *bf; char *filename = NULL; FILE *fp; if(!stricmp(fname, "NULL")) return 0; /* find filename in order file file.png */ if(!(fp = fopen(fname, "rb"))) { filename = calloc(1, strlen(skin->skindir) + strlen(fname) + 6); sprintf(filename, "%s\\%s.png", skin->skindir, fname); if(!(fp = fopen(filename, "rb"))) { mp_msg(MSGT_GPLAYER, MSGL_ERR, "[png] cannot find image %s\n", filename); free(filename); return 0; } } fclose(fp); for (i=0; i < skin->imagecount; i++) if(!strcmp(fname, skin->images[i]->name)) {#ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[png] skinfile %s already exists\n", fname);#endif free(filename); return skin->images[i]; } (skin->imagecount)++; skin->images = realloc(skin->images, sizeof(image *) * skin->imagecount); bf = skin->images[(skin->imagecount) - 1] = calloc(1, sizeof(image)); bf->name = strdup(fname); bpRead(filename ? filename : fname, &bmp); free(filename); bf->width = bmp.Width; bf->height = bmp.Height;#ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[png] loaded image %s\n", fname); mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[png] size: %dx%d bits: %d\n", bf->width, bf->height, BPP); mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[png] imagesize: %u\n", imgsize);#endif bf->size = bf->width * bf->height * skin->desktopbpp / 8; if (skin->desktopbpp == 32) bf->data = bmp.Image; else { bf->data = malloc(bf->size); rgb32tobgr32(bmp.Image, bmp.Image, bmp.ImageSize); if(skin->desktopbpp == 16) rgb32tobgr15(bmp.Image, bf->data, bmp.ImageSize); else if(skin->desktopbpp == 24) rgb32tobgr24(bmp.Image, bf->data, bmp.ImageSize); free(bmp.Image); } return bf;}/* frees all skin images */static void freeimages(skin_t *skin){ unsigned int i; for (i=0; i<skin->imagecount; i++) { if(skin->images && skin->images[i]) { if(skin->images[i]->data) free(skin->images[i]->data); if(skin->images[i]->name) free(skin->images[i]->name); free(skin->images[i]); } } free(skin->images);}#ifdef DEBUGvoid dumpwidgets(skin_t *skin){ unsigned int i; for (i=0; i<skin->widgetcount; i++) mp_msg(MSGT_GPLAYER, MSGL_V, "widget %p id %i\n", skin->widgets[i], skin->widgets[i]->id);}#endifstatic int counttonextchar(const char *s1, char c){ unsigned int i; for (i=0; i<strlen(s1); i++) if(s1[i] == c) return i; return 0;}static char *findnextstring(char *temp, const char *desc, int *base){ int len = counttonextchar(*base + desc, ','); memset(temp, 0, strlen(desc) + 1); if(!len) len = strlen(desc); memcpy(temp, *base + desc, len); *base += (len+1); return temp;}static void freeskin(skin_t *skin){ unsigned int i; if(skin->skindir) { free(skin->skindir); skin->skindir = NULL; } for (i=1; i<=skin->lastusedid; i++) skin->removewidget(skin, i); if(skin->widgets) { free(skin->widgets); skin->widgets = NULL; } freeimages(skin); for(i=0; i<skin->windowcount; i++) { if(skin->windows[i]->name) { free(skin->windows[i]->name); skin->windows[i]->name = NULL; } free(skin->windows[i]); } free(skin->windows); skin->windows = NULL; for (i=0; i<skin->fontcount; i++) { unsigned int x; if(skin->fonts[i]->name) { free(skin->fonts[i]->name); skin->fonts[i]->name = NULL; } if(skin->fonts[i]->id) { free(skin->fonts[i]->id); skin->fonts[i]->id = NULL; } for (x=0; x<skin->fonts[i]->charcount; x++) { free(skin->fonts[i]->chars[x]); skin->fonts[i]->chars[x] = NULL; } if(skin->fonts[i]->chars) { free(skin->fonts[i]->chars); skin->fonts[i]->chars = NULL; } free(skin->fonts[i]); skin->fonts[i] = NULL; } free(skin->fonts); skin->fonts = NULL;#ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[SKIN FREE] skin freed\n");#endif free(skin); skin = NULL;}static void removewidget(skin_t *skin, int id){ unsigned int i; unsigned int pos=0; widget **temp = calloc(skin->widgetcount - 1, sizeof(widget *)); for (i=0; i<skin->widgetcount; i++) { if(skin->widgets[i]->id == id) { if(skin->widgets[i]->label) free(skin->widgets[i]->label); free(skin->widgets[i]); skin->widgets[i] = NULL; } else { temp[pos] = skin->widgets[i]; pos++; } } if (pos != i) { (skin->widgetcount)--; free(skin->widgets); skin->widgets = temp;#ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "removed widget %i\n", id);#endif return; } free(temp); mp_msg(MSGT_GPLAYER, MSGL_ERR, "widget %i not found\n", id);}static void addwidget(skin_t *skin, window *win, const char *desc){ widget *mywidget; char *temp = calloc(1, strlen(desc) + 1); (skin->widgetcount)++; (skin->lastusedid)++; skin->widgets = realloc(skin->widgets, sizeof(widget *) * skin->widgetcount); mywidget = skin->widgets[(skin->widgetcount) - 1] = calloc(1, sizeof(widget)); mywidget->id = skin->lastusedid; mywidget->window = win->type; /* parse and fill widget specific info */ if(!strncmp(desc, "base", 4)) { int base = counttonextchar(desc, '=') + 1; mywidget->type = tyBase; mywidget->bitmap[0] = pngRead(skin, findnextstring(temp, desc, &base)); mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); mywidget->wwidth = mywidget->width = atoi(findnextstring(temp, desc, &base)); mywidget->wheight = mywidget->height = atoi(findnextstring(temp, desc, &base)); win->base = mywidget;#ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[SKIN] [ITEM] [BASE] %s %i %i %i %i\n", (mywidget->bitmap[0]) ? mywidget->bitmap[0]->name : NULL, mywidget->x, mywidget->y, mywidget->width, mywidget->height);#endif } else if(!strncmp(desc, "button", 6)) { int base = counttonextchar(desc, '=') + 1; int i; mywidget->type = tyButton; mywidget->bitmap[0] = pngRead(skin, findnextstring(temp, desc, &base)); mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); mywidget->wwidth = mywidget->width = atoi(findnextstring(temp, desc, &base)); mywidget->wheight = mywidget->height = atoi(findnextstring(temp, desc, &base)); findnextstring(temp, desc, &base); /* Assign corresponding event to the widget */ mywidget->msg = evNone; for (i=0; i<evBoxs; i++) { if(!strcmp(temp, evNames[i].name)) { mywidget->msg = evNames[i].msg; break; } }#ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[SKIN] [ITEM] [BUTTON] %s %i %i %i %i msg %i\n", (mywidget->bitmap[0]) ? mywidget->bitmap[0]->name : NULL, mywidget->x, mywidget->y, mywidget->width, mywidget->height, mywidget->msg);#endif } else if(!strncmp(desc, "hpotmeter", 9) || !strncmp(desc, "vpotmeter", 9)) { int base = counttonextchar(desc, '=') + 1; int i; /* hpotmeter = button, bwidth, bheight, phases, numphases, default, X, Y, width, height, message */ if(!strncmp(desc, "hpotmeter", 9)) mywidget->type = tyHpotmeter; else mywidget->type = tyVpotmeter; mywidget->bitmap[0] = pngRead(skin, findnextstring(temp, desc, &base)); mywidget->width = atoi(findnextstring(temp, desc, &base)); mywidget->height = atoi(findnextstring(temp, desc, &base));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -