winamp/Src/Wasabi/api/skin/skin.h
2024-09-24 14:54:57 +02:00

151 lines
3.8 KiB
C++

#ifndef _SKIN_H
#define _SKIN_H
#include <api/skin/api_skin.h>
#include <bfc/platform/platform.h>
#include <api/wnd/basewnd.h>
#include <bfc/ptrlist.h>
#include <tataki/region/region.h>
#include <tataki/bitmap/autobitmap.h>
#include <bfc/string/bfcstring.h>
#include <api/wndmgr/container.h>
#include <api/xml/xmlreader.h>
#include <bfc/string/StringW.h>
class SkinBitmap;
#include "SkinVersion.h"
#define CB_SETSKINDEFERRED 0x5492
class SkinTimer;
class Skin
{
public:
enum {
CHKSKIN_UNKNOWN = -1,
CHKSKIN_ISWA3 = 1,
CHKSKIN_ISWA3OLD = 2,
CHKSKIN_ISWA3FUTURE = 3,
CHKSKIN_ISWA2 = 4,
CHKSKIN_DISALLOWED = 5,
};
Skin();
virtual ~Skin();
static const wchar_t *getSkinName();
static void setSkinName(const wchar_t *newskinname, const wchar_t *skinpath = NULL);
static const wchar_t *getSkinPath();
static const wchar_t *getDefaultSkinPath();
static Skin *getCurSkin();
void setBaseTexture(const wchar_t *b);
//CUT static int registerCallback(SkinCallback *cb);
//CUT static int deregisterCallback(SkinCallback *cb);
static void renderBaseTexture(ifc_window *base, Skin *s, ifc_canvas *c, const RECT &r, ifc_window *dest, int alpha = 255);
static void renderBaseTexture(ifc_window *s, ifc_canvas *c, const RECT &r, ifc_window *dest, int alpha = 255);
static void invalidateBaseTexture(Skin *s);
static void invalidateAllBaseTextures();
static Skin *baseToSkin(ifc_window *b);
static void registerBaseSkin(Skin *s, ifc_window *b);
static Skin *unregisterBaseSkin(ifc_window *b);
static void unloadAllBaseTextures();
static void reloadAllBaseTextures();
void _unloadBaseTexture();
void _reloadBaseTexture();
static wchar_t *enumLoadableSkins(int refresh = FALSE);
static int checkSkin(const wchar_t *name);
static void toggleSkin(const wchar_t *name, const wchar_t *skin_path = NULL, int deferred = 0);
static void unloadSkin();
static void parseSkinFilename(const wchar_t *filename, const wchar_t *incpath);
static int isDefaultSkin;
static void sendUnloadingCallback();
static int sendAbortCallback(const wchar_t *skinname);
static void sendResetCallback();
static void sendReloadCallback();
static void sendBeforeLoadingElementsCallback();
static void sendGuiLoadedCallback();
static void sendLoadedCallback();
static int isSkinReady();
static void setSkinReady(int i);
static int isDynamicGroupReloadEnabled() { return enable_group_reload; }
static void unloadSkinPart(int id);
static int loadSkinPart(const wchar_t *xmlfile);
static void main_notifySkinLoaded();
static int isLoading() { return loading; }
static int unloadResources();
static int reloadResources();
static bool isLoaded();
private:
void rescaleBaseTexture(int w, int h);
void _renderBaseTexture(ifc_window *base, ifc_canvas *c, const RECT &r, ifc_window *dest, int alpha);
void _invalidateBaseTexture(void);
void validateBaseTextureRect(RECT *r);
AutoSkinBitmap *base;
BltCanvas *scaled;
int scale_x, scale_y;
bool forceinvalid;
int m_x, m_y;
int lastw, lasth, maxw, maxh;
bool resizing;
RegionI *validRgn;
static int loading;
static int enable_group_reload;
static PtrList<Skin> skinList;
static PtrList<ifc_window> baseList;
static StringW skinName;
static StringW skinPath;
static StringW defSkinPath;
static int highest_id;
static int reloadingskin;
static int skin_loaded;
static SkinTimer *deferedskinset;
};
class SkinTimer : public TimerClientDI
{
public :
SkinTimer() {}
virtual ~SkinTimer() {}
void setSkinDeferred(const wchar_t *skinname)
{
skin = skinname;
timerclient_postDeferredCallback(CB_SETSKINDEFERRED, 0);
}
virtual int timerclient_onDeferredCallback(intptr_t p1, intptr_t p2)
{
if (p1 == CB_SETSKINDEFERRED)
{
Skin::toggleSkin(skin);
skin.trunc(0);
}
else
return TimerClientDI::timerclient_onDeferredCallback(p1, p2);
return 1;
}
private:
StringW skin;
};
extern Skin *tha;
#endif