studio works as dll now
This commit is contained in:
116
src/fs.c
116
src/fs.c
@@ -105,8 +105,28 @@ bool fsIsInPublicDir(FileSystem* fs)
|
||||
|
||||
#if defined(__TIC_WINDOWS__) || defined(__WINRT__)
|
||||
|
||||
#define UTF8ToString(S) (wchar_t *)SDL_iconv_string("UTF-16LE", "UTF-8", (char *)(S), SDL_strlen(S)+1)
|
||||
#define StringToUTF8(S) SDL_iconv_string("UTF-8", "UTF-16LE", (char *)(S), (SDL_wcslen(S)+1)*sizeof(wchar_t))
|
||||
// #define UTF8ToString(S) (wchar_t *)SDL_iconv_string("UTF-16LE", "UTF-8", (char *)(S), strlen(S)+1)
|
||||
// #define StringToUTF8(S) SDL_iconv_string("UTF-8", "UTF-16LE", (char *)(S), (wcslen(S)+1)*sizeof(wchar_t))
|
||||
|
||||
static const wchar_t* UTF8ToString(const char* str)
|
||||
{
|
||||
// TODO: ugly hack
|
||||
wchar_t* wstr = calloc(1, FILENAME_MAX * sizeof(wchar_t));
|
||||
|
||||
mbstowcs(wstr, str, FILENAME_MAX);
|
||||
|
||||
return wstr;
|
||||
}
|
||||
|
||||
static char* StringToUTF8(const wchar_t* wstr)
|
||||
{
|
||||
// TODO: ugly hack
|
||||
char* str = calloc(1, FILENAME_MAX);
|
||||
|
||||
wcstombs(str, wstr, FILENAME_MAX);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
FILE* _wfopen(const wchar_t *, const wchar_t *);
|
||||
int _wremove(const wchar_t *);
|
||||
@@ -154,7 +174,7 @@ void fsEnumFiles(FileSystem* fs, ListCallback callback, void* data)
|
||||
|
||||
if(isPublic(fs))
|
||||
{
|
||||
netDirRequest(fs->net, fs->work + sizeof(TIC_HOST), callback, data);
|
||||
_netDirRequest(fs->net, fs->work + sizeof(TIC_HOST), callback, data);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -701,7 +721,7 @@ void* fsLoadFile(FileSystem* fs, const char* name, s32* size)
|
||||
|
||||
char path[FILENAME_MAX] = {0};
|
||||
sprintf(path, "/cart/%s/cart.tic", loadPublicCartData.hash);
|
||||
void* data = netGetRequest(fs->net, path, size);
|
||||
void* data = _netGetRequest(fs->net, path, size);
|
||||
|
||||
if(data)
|
||||
fsSaveRootFile(fs, cachePath, data, *size, false);
|
||||
@@ -798,59 +818,57 @@ void createFileSystem(const char* path, void(*callback)(FileSystem*))
|
||||
FileSystem* fs = (FileSystem*)malloc(sizeof(FileSystem));
|
||||
memset(fs, 0, sizeof(FileSystem));
|
||||
|
||||
fs->net = createNet();
|
||||
fs->net = _createNet();
|
||||
|
||||
if(path)
|
||||
{
|
||||
strcpy(fs->dir, path);
|
||||
callback(fs);
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(fs->dir, path);
|
||||
callback(fs);
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
// else
|
||||
// {
|
||||
|
||||
strcpy(fs->dir, "/" TIC_PACKAGE "/" TIC_NAME "/");
|
||||
// #if defined(__EMSCRIPTEN__)
|
||||
|
||||
#elif defined(__ANDROID__)
|
||||
// strcpy(fs->dir, "/" TIC_PACKAGE "/" TIC_NAME "/");
|
||||
|
||||
strcpy(fs->dir, SDL_AndroidGetExternalStoragePath());
|
||||
const char AppFolder[] = "/" TIC_NAME "/";
|
||||
strcat(fs->dir, AppFolder);
|
||||
mkdir(fs->dir, 0700);
|
||||
// #elif defined(__ANDROID__)
|
||||
|
||||
#else
|
||||
// strcpy(fs->dir, SDL_AndroidGetExternalStoragePath());
|
||||
// const char AppFolder[] = "/" TIC_NAME "/";
|
||||
// strcat(fs->dir, AppFolder);
|
||||
// mkdir(fs->dir, 0700);
|
||||
|
||||
char* path = SDL_GetPrefPath(TIC_PACKAGE, TIC_NAME);
|
||||
strcpy(fs->dir, path);
|
||||
free(path);
|
||||
// #else
|
||||
|
||||
#endif
|
||||
// char* path = SDL_GetPrefPath(TIC_PACKAGE, TIC_NAME);
|
||||
// strcpy(fs->dir, path);
|
||||
// free(path);
|
||||
|
||||
// #endif
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
EM_ASM_
|
||||
(
|
||||
{
|
||||
var dir = "";
|
||||
Module.Pointer_stringify($0).split("/").forEach(function(val)
|
||||
{
|
||||
if(val.length)
|
||||
{
|
||||
dir += "/" + val;
|
||||
FS.mkdir(dir);
|
||||
}
|
||||
});
|
||||
// #if defined(__EMSCRIPTEN__)
|
||||
// EM_ASM_
|
||||
// (
|
||||
// {
|
||||
// var dir = "";
|
||||
// Module.Pointer_stringify($0).split("/").forEach(function(val)
|
||||
// {
|
||||
// if(val.length)
|
||||
// {
|
||||
// dir += "/" + val;
|
||||
// FS.mkdir(dir);
|
||||
// }
|
||||
// });
|
||||
|
||||
FS.mount(IDBFS, {}, dir);
|
||||
FS.syncfs(true, function(error)
|
||||
{
|
||||
if(error) console.log(error);
|
||||
else Runtime.dynCall('vi', $1, [$2]);
|
||||
});
|
||||
}, fs->dir, callback, fs
|
||||
);
|
||||
#else
|
||||
callback(fs);
|
||||
#endif
|
||||
}
|
||||
// FS.mount(IDBFS, {}, dir);
|
||||
// FS.syncfs(true, function(error)
|
||||
// {
|
||||
// if(error) console.log(error);
|
||||
// else Runtime.dynCall('vi', $1, [$2]);
|
||||
// });
|
||||
// }, fs->dir, callback, fs
|
||||
// );
|
||||
// #else
|
||||
// callback(fs);
|
||||
// #endif
|
||||
// }
|
||||
}
|
||||
127
src/main.c
127
src/main.c
@@ -1,6 +1,6 @@
|
||||
#include "main.h"
|
||||
#include "studio.h"
|
||||
|
||||
#include "net.h"
|
||||
#include <SDL.h>
|
||||
|
||||
#define STUDIO_UI_SCALE 3
|
||||
@@ -814,6 +814,98 @@ static void tick()
|
||||
blitSound();
|
||||
}
|
||||
|
||||
// should work async with callback
|
||||
static const char* getAppFolder()
|
||||
{
|
||||
|
||||
static char appFolder[FILENAME_MAX];
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
|
||||
strcpy(appFolder, "/" TIC_PACKAGE "/" TIC_NAME "/");
|
||||
|
||||
#elif defined(__ANDROID__)
|
||||
|
||||
strcpy(appFolder, SDL_AndroidGetExternalStoragePath());
|
||||
const char AppFolder[] = "/" TIC_NAME "/";
|
||||
strcat(appFolder, AppFolder);
|
||||
mkdir(appFolder, 0700);
|
||||
|
||||
#else
|
||||
|
||||
char* path = SDL_GetPrefPath(TIC_PACKAGE, TIC_NAME);
|
||||
strcpy(appFolder, path);
|
||||
free(path);
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
EM_ASM_
|
||||
(
|
||||
{
|
||||
var dir = "";
|
||||
Module.Pointer_stringify($0).split("/").forEach(function(val)
|
||||
{
|
||||
if(val.length)
|
||||
{
|
||||
dir += "/" + val;
|
||||
FS.mkdir(dir);
|
||||
}
|
||||
});
|
||||
|
||||
FS.mount(IDBFS, {}, dir);
|
||||
FS.syncfs(true, function(error)
|
||||
{
|
||||
if(error) console.log(error);
|
||||
else Runtime.dynCall('vi', $1, [$2]);
|
||||
});
|
||||
}, appFolder, callback, fs
|
||||
);
|
||||
#endif
|
||||
|
||||
return appFolder;
|
||||
}
|
||||
|
||||
void setClipboardText(const char* text)
|
||||
{
|
||||
SDL_SetClipboardText(text);
|
||||
}
|
||||
|
||||
bool hasClipboardText()
|
||||
{
|
||||
return SDL_HasClipboardText();
|
||||
}
|
||||
|
||||
char* getClipboardText()
|
||||
{
|
||||
return SDL_GetClipboardText();
|
||||
}
|
||||
|
||||
u64 getPerformanceCounter()
|
||||
{
|
||||
return SDL_GetPerformanceCounter();
|
||||
}
|
||||
|
||||
u64 getPerformanceFrequency()
|
||||
{
|
||||
return SDL_GetPerformanceFrequency();
|
||||
}
|
||||
|
||||
static System sysHandlers =
|
||||
{
|
||||
.setClipboardText = setClipboardText,
|
||||
.hasClipboardText = hasClipboardText,
|
||||
.getClipboardText = getClipboardText,
|
||||
.getPerformanceCounter = getPerformanceCounter,
|
||||
.getPerformanceFrequency = getPerformanceFrequency,
|
||||
|
||||
.netVersionRequest = netVersionRequest,
|
||||
.netDirRequest = netDirRequest,
|
||||
.netGetRequest = netGetRequest,
|
||||
.createNet = createNet,
|
||||
.closeNet = closeNet,
|
||||
};
|
||||
|
||||
s32 main(s32 argc, char **argv)
|
||||
{
|
||||
SDL_SetHint(SDL_HINT_WINRT_HANDLE_BACK_BUTTON, "1");
|
||||
@@ -841,14 +933,14 @@ s32 main(s32 argc, char **argv)
|
||||
#elif defined(__EMSCRIPTEN__)
|
||||
SDL_RENDERER_ACCELERATED
|
||||
#else
|
||||
// TODO: uncomment this later
|
||||
// TODO: uncomment this later, also init FS before read config
|
||||
SDL_RENDERER_ACCELERATED// | (getConfig()->useVsync ? SDL_RENDERER_PRESENTVSYNC : 0)
|
||||
#endif
|
||||
);
|
||||
|
||||
platform.texture = SDL_CreateTexture(platform.renderer, STUDIO_PIXEL_FORMAT, SDL_TEXTUREACCESS_STREAMING, TEXTURE_SIZE, TEXTURE_SIZE);
|
||||
|
||||
platform.studio = studioInit(argc, argv, platform.audio.spec.freq);
|
||||
platform.studio = studioInit(argc, argv, platform.audio.spec.freq, getAppFolder(), &sysHandlers);
|
||||
|
||||
initTouchGamepad();
|
||||
|
||||
@@ -902,32 +994,3 @@ s32 main(s32 argc, char **argv)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////
|
||||
|
||||
|
||||
void setClipboardText(const char* text)
|
||||
{
|
||||
SDL_SetClipboardText(text);
|
||||
}
|
||||
|
||||
bool hasClipboardText()
|
||||
{
|
||||
return SDL_HasClipboardText();
|
||||
}
|
||||
|
||||
char* getClipboardText()
|
||||
{
|
||||
return SDL_GetClipboardText();
|
||||
}
|
||||
|
||||
u64 getPerformanceCounter()
|
||||
{
|
||||
return SDL_GetPerformanceCounter();
|
||||
}
|
||||
|
||||
u64 getPerformanceFrequency()
|
||||
{
|
||||
return SDL_GetPerformanceFrequency();
|
||||
}
|
||||
59
src/studio.c
59
src/studio.c
@@ -88,6 +88,7 @@ static const EditorMode Modes[] =
|
||||
static struct
|
||||
{
|
||||
Studio studio;
|
||||
System* system;
|
||||
|
||||
tic80_local* tic80local;
|
||||
|
||||
@@ -2927,13 +2928,15 @@ static void emstick()
|
||||
|
||||
#endif
|
||||
|
||||
Studio* studioInit(s32 argc, char **argv, s32 samplerate)
|
||||
Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder, System* system)
|
||||
{
|
||||
setbuf(stdout, NULL);
|
||||
studioImpl.argc = argc;
|
||||
studioImpl.argv = argv;
|
||||
studioImpl.samplerate = samplerate;
|
||||
|
||||
studioImpl.system = system;
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
|
||||
if(studioImpl.argc == 2)
|
||||
@@ -2946,7 +2949,7 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate)
|
||||
|
||||
#else
|
||||
|
||||
createFileSystem(argc > 1 && fsExists(argv[1]) ? fsBasename(argv[1]) : NULL, onFSInitialized);
|
||||
createFileSystem(argc > 1 && fsExists(argv[1]) ? fsBasename(argv[1]) : folder, onFSInitialized);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -3031,7 +3034,7 @@ void studioTick(void* pixels)
|
||||
|
||||
void studioClose()
|
||||
{
|
||||
closeNet(studioImpl.surf->net);
|
||||
_closeNet(studioImpl.surf->net);
|
||||
|
||||
{
|
||||
for(s32 i = 0; i < TIC_EDITOR_BANKS; i++)
|
||||
@@ -3075,4 +3078,54 @@ void studioClose()
|
||||
// #endif
|
||||
|
||||
// exit(0);
|
||||
}
|
||||
|
||||
void setClipboardText(const char* text)
|
||||
{
|
||||
studioImpl.system->setClipboardText(text);
|
||||
}
|
||||
|
||||
bool hasClipboardText()
|
||||
{
|
||||
return studioImpl.system->hasClipboardText();
|
||||
}
|
||||
|
||||
char* getClipboardText()
|
||||
{
|
||||
return studioImpl.system->getClipboardText();
|
||||
}
|
||||
|
||||
u64 getPerformanceCounter()
|
||||
{
|
||||
return studioImpl.system->getPerformanceCounter();
|
||||
}
|
||||
|
||||
u64 getPerformanceFrequency()
|
||||
{
|
||||
return studioImpl.system->getPerformanceFrequency();
|
||||
}
|
||||
|
||||
NetVersion _netVersionRequest(Net* net)
|
||||
{
|
||||
return studioImpl.system->netVersionRequest(net);
|
||||
}
|
||||
|
||||
void _netDirRequest(Net* net, const char* path, ListCallback callback, void* data)
|
||||
{
|
||||
return studioImpl.system->netDirRequest(net, path, callback, data);
|
||||
}
|
||||
|
||||
void* _netGetRequest(Net* net, const char* path, s32* size)
|
||||
{
|
||||
return studioImpl.system->netGetRequest(net, path, size);
|
||||
}
|
||||
|
||||
Net* _createNet()
|
||||
{
|
||||
return studioImpl.system->createNet();
|
||||
}
|
||||
|
||||
void _closeNet(Net* net)
|
||||
{
|
||||
return studioImpl.system->closeNet(net);
|
||||
}
|
||||
31
src/studio.h
31
src/studio.h
@@ -37,6 +37,7 @@
|
||||
#include "ticapi.h"
|
||||
#include "defines.h"
|
||||
#include "tools.h"
|
||||
#include "net.h"
|
||||
|
||||
#define TIC_LOCAL ".local/"
|
||||
#define TIC_CACHE TIC_LOCAL "cache/"
|
||||
@@ -187,7 +188,7 @@ void showTooltip(const char* text);
|
||||
|
||||
tic_key* getKeymap();
|
||||
|
||||
const StudioConfig* getConfig();
|
||||
TIC80_API const StudioConfig* getConfig();
|
||||
|
||||
void setSpritePixel(tic_tile* tiles, s32 x, s32 y, u8 color);
|
||||
u8 getSpritePixel(tic_tile* tiles, s32 x, s32 y);
|
||||
@@ -217,9 +218,25 @@ typedef struct
|
||||
|
||||
} Studio;
|
||||
|
||||
Studio* studioInit(s32 argc, char **argv, s32 samplerate);
|
||||
void studioTick(void* pixels);
|
||||
void studioClose();
|
||||
typedef struct
|
||||
{
|
||||
void (*setClipboardText)(const char* text);
|
||||
bool (*hasClipboardText)();
|
||||
char* (*getClipboardText)();
|
||||
u64 (*getPerformanceCounter)();
|
||||
u64 (*getPerformanceFrequency)();
|
||||
|
||||
NetVersion (*netVersionRequest)(Net* net);
|
||||
void (*netDirRequest)(Net* net, const char* path, ListCallback callback, void* data);
|
||||
void* (*netGetRequest)(Net* net, const char* path, s32* size);
|
||||
Net* (*createNet)();
|
||||
void (*closeNet)(Net* net);
|
||||
|
||||
} System;
|
||||
|
||||
TIC80_API Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* appFolder, System* system);
|
||||
TIC80_API void studioTick(void* pixels);
|
||||
TIC80_API void studioClose();
|
||||
|
||||
char getKeyboardText();
|
||||
bool isKeyWasDown(tic_key key);
|
||||
@@ -231,3 +248,9 @@ char* getClipboardText();
|
||||
|
||||
u64 getPerformanceCounter();
|
||||
u64 getPerformanceFrequency();
|
||||
|
||||
NetVersion _netVersionRequest(Net* net);
|
||||
void _netDirRequest(Net* net, const char* path, ListCallback callback, void* data);
|
||||
void* _netGetRequest(Net* net, const char* path, s32* size);
|
||||
Net* _createNet();
|
||||
void _closeNet(Net* net);
|
||||
|
||||
@@ -478,7 +478,7 @@ static void* requestCover(Surf* surf, const char* hash, s32* size)
|
||||
|
||||
char path[FILENAME_MAX] = {0};
|
||||
sprintf(path, "/cart/%s/cover.gif", hash);
|
||||
void* data = netGetRequest(surf->net, path, size);
|
||||
void* data = _netGetRequest(surf->net, path, size);
|
||||
|
||||
if(data)
|
||||
{
|
||||
@@ -865,7 +865,7 @@ void initSurf(Surf* surf, tic_mem* tic, struct Console* console)
|
||||
.items = NULL,
|
||||
.count = 0,
|
||||
},
|
||||
.net = createNet(),
|
||||
.net = _createNet(),
|
||||
};
|
||||
|
||||
fsMakeDir(surf->fs, TIC_CACHE);
|
||||
|
||||
@@ -51,4 +51,4 @@ bool tic_tool_parse_note(const char* noteStr, s32* note, s32* octave);
|
||||
s32 tic_tool_get_pattern_id(const tic_track* track, s32 frame, s32 channel);
|
||||
void tic_tool_set_pattern_id(tic_track* track, s32 frame, s32 channel, s32 id);
|
||||
u32 tic_tool_find_closest_color(const tic_rgb* palette, const tic_rgb* color);
|
||||
u32* tic_palette_blit(const tic_palette* src);
|
||||
TIC80_API u32* tic_palette_blit(const tic_palette* src);
|
||||
Reference in New Issue
Block a user