⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skinload.c

📁 uclinux下mplayer的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -