aboutsummaryrefslogtreecommitdiff
path: root/Src/tataki/main.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/tataki/main.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/tataki/main.cpp')
-rw-r--r--Src/tataki/main.cpp122
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;
+}