diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/tataki/main.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/tataki/main.cpp')
-rw-r--r-- | Src/tataki/main.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/Src/tataki/main.cpp b/Src/tataki/main.cpp new file mode 100644 index 00000000..ed211aac --- /dev/null +++ b/Src/tataki/main.cpp @@ -0,0 +1,122 @@ +#include "api__tataki.h" +#include <api/service/waservicefactory.h> +#include <tataki/export.h> +#include <tataki/canvas/bltcanvas.h> +#include "../nu/ServiceWatcher.h" + +api_service *WASABI_API_SVC=0; +api_application *WASABI_API_APP=0; +api_syscb *WASABI_API_SYSCB=0; +api_font *WASABI_API_FONT=0; +wnd_api *WASABI_API_WND=0; +api_config *WASABI_API_CONFIG=0; +imgldr_api *WASABI_API_IMGLDR=0; +api_memmgr *WASABI_API_MEMMGR=0; +api_skin *WASABI_API_SKIN=0; +api_random *AGAVE_API_RANDOM=0; +api_palette *WASABI_API_PALETTE=0; +DWORD bitmap_cache_tls=TLS_OUT_OF_INDEXES; + +ServiceWatcher serviceWatcher; +template <class api_t> +api_t *GetService(GUID serviceGUID) +{ + waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(serviceGUID); + if (sf) + return reinterpret_cast<api_t *>( sf->getInterface() ); + else + return 0; + +} + +template <class api_t> +inline void ReleaseService(GUID serviceGUID, api_t *&service) +{ + if (service) + { + waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(serviceGUID); + if (sf) + sf->releaseInterface(service); + + service=0; + } +} + +static size_t refCount=0; +TATAKIAPI size_t Tataki::Init(api_service *_serviceApi) +{ + refCount++; + if (bitmap_cache_tls == TLS_OUT_OF_INDEXES) + bitmap_cache_tls=TlsAlloc(); + + if (!WASABI_API_SVC) + { + WASABI_API_SVC = _serviceApi; + WASABI_API_SYSCB = GetService<api_syscb>(syscbApiServiceGuid); + AGAVE_API_RANDOM = GetService<api_random>(randomApiGUID); + WASABI_API_PALETTE = GetService<api_palette>(PaletteManagerGUID); + + serviceWatcher.WatchWith(WASABI_API_SVC); + serviceWatcher.WatchFor(&WASABI_API_APP, applicationApiServiceGuid); + serviceWatcher.WatchFor(&WASABI_API_FONT, fontApiServiceGuid); + serviceWatcher.WatchFor(&WASABI_API_WND, wndApiServiceGuid); + serviceWatcher.WatchFor(&WASABI_API_CONFIG, configApiServiceGuid); + serviceWatcher.WatchFor(&WASABI_API_IMGLDR, imgLdrApiServiceGuid); + serviceWatcher.WatchFor(&WASABI_API_MEMMGR, memMgrApiServiceGuid); + serviceWatcher.WatchFor(&WASABI_API_SKIN, skinApiServiceGuid); + + // register for service callbacks in case any of these don't exist yet + WASABI_API_SYSCB->syscb_registerCallback(&serviceWatcher); + } + return refCount; +} + +TATAKIAPI size_t Tataki::Quit() +{ + if (!--refCount) + { + serviceWatcher.StopWatching(); + serviceWatcher.Clear(); + + ReleaseService(syscbApiServiceGuid, WASABI_API_SYSCB); + ReleaseService(applicationApiServiceGuid, WASABI_API_APP); + ReleaseService(fontApiServiceGuid,WASABI_API_FONT); + ReleaseService(wndApiServiceGuid, WASABI_API_WND); + ReleaseService(configApiServiceGuid, WASABI_API_CONFIG); + ReleaseService(imgLdrApiServiceGuid, WASABI_API_IMGLDR); + ReleaseService(memMgrApiServiceGuid, WASABI_API_MEMMGR); + ReleaseService(skinApiServiceGuid, WASABI_API_SKIN); + ReleaseService(randomApiGUID, AGAVE_API_RANDOM); + ReleaseService(PaletteManagerGUID, WASABI_API_PALETTE); + + // unregister callbacks + // release any services we have + WASABI_API_SVC = 0; + } + return refCount; +} + +extern "C" BOOL WINAPI DllMain( + HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved +) +{ + Wasabi::Std::Initialize(); + if (fdwReason == DLL_PROCESS_DETACH && bitmap_cache_tls!=TLS_OUT_OF_INDEXES) + { + TlsFree(bitmap_cache_tls); + bitmap_cache_tls=TLS_OUT_OF_INDEXES; + } + else if (fdwReason == DLL_THREAD_DETACH && bitmap_cache_tls!=TLS_OUT_OF_INDEXES) + { + BltCanvas *cache_canvas = (BltCanvas *)TlsGetValue(bitmap_cache_tls); + if (cache_canvas) + { + delete cache_canvas; + TlsSetValue(bitmap_cache_tls, 0); // this is probably unnecessary but just in case + } + + } + return TRUE; +} |