studio works as dll now

This commit is contained in:
BADIM-PC\Vadim
2018-02-07 18:21:24 +03:00
parent 39dfdcfc4f
commit 39db956c0d
13 changed files with 686 additions and 196 deletions

116
src/fs.c
View File

@@ -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
// }
}

View File

@@ -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();
}

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);