diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d193315a..bad117aac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -111,7 +111,6 @@ src/engine/platform/dummy.cpp) set(GUI_SOURCES extern/imgui/imgui.cpp -extern/imgui/imgui_demo.cpp extern/imgui/imgui_draw.cpp extern/imgui/imgui_tables.cpp extern/imgui/imgui_widgets.cpp @@ -124,6 +123,10 @@ src/gui/font_main.cpp src/gui/font_pat.cpp src/gui/gui.cpp) +if (WIN32) + list(APPEND ENGINE_SOURCES src/utfutils.cpp) +endif() + if (BUILD_GUI) add_executable(furnace ${ENGINE_SOURCES} ${AUDIO_SOURCES} ${GUI_SOURCES} src/main.cpp) target_compile_definitions(furnace PUBLIC HAVE_GUI) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index a76e62ea9..64577efef 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1156,7 +1156,6 @@ void DivEngine::renderSamples() { DivSample* s=song.sample[i]; if ((memPos&0xf00000)!=((memPos+s->adpcmRendLength)&0xf00000)) { memPos=(memPos+0xfffff)&0xf00000; - printf("aligning to %lx.\n",memPos); } memcpy(adpcmMem+memPos,s->adpcmRendData,s->adpcmRendLength); s->rendOff=memPos; @@ -1340,7 +1339,7 @@ void DivEngine::quitDispatch() { } bool DivEngine::init(String outName) { - SNDFILE* outFile; + SNDFILE* outFile=NULL; SF_INFO outInfo; if (outName!="") { // init out file diff --git a/src/engine/engine.h b/src/engine/engine.h index 73d483b4b..945f7c745 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -40,6 +40,7 @@ struct DivChannelState { volSpeed(0), cut(-1), rowDelay(0), + volMax(0), delayOrder(0), delayRow(0), vibratoDepth(0), diff --git a/src/main.cpp b/src/main.cpp index 391240223..77ae2cce4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,6 +7,7 @@ #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include +#include #else #include #endif @@ -314,3 +315,7 @@ int main(int argc, char** argv) { e.quit(); return 0; } + +#ifdef _WIN32 +#include "winMain.cpp" +#endif diff --git a/src/ta-utils.h b/src/ta-utils.h index e1e24ccf0..264f6745c 100644 --- a/src/ta-utils.h +++ b/src/ta-utils.h @@ -9,9 +9,8 @@ typedef std::string String; #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) -#ifdef _MSC_VER -#include -typedef SSIZE_T ssize_t; +#ifdef _WIN32 +typedef std::wstring WString; #endif struct TAParam { diff --git a/src/utfutils.cpp b/src/utfutils.cpp new file mode 100644 index 000000000..06650fc32 --- /dev/null +++ b/src/utfutils.cpp @@ -0,0 +1,94 @@ +#include "utfutils.h" + +int decodeUTF8(const unsigned char* data, char& len) { + int ret=0xfffd; + if (data[0]<0x80) { + ret=data[0]; + len=1; + } else if (data[0]<0xc0) { + ret=0xfffd; // invalid + len=1; + } else if (data[0]<0xe0) { + if (data[1]>=0x80 && data[1]<0xc0) { + len=2; + ret=((data[0]&31)<<6)| + (data[1]&63); + } else len=1; + } else if (data[0]<0xf0) { + if (data[1]>=0x80 && data[1]<0xc0) { + if (data[2]>=0x80 && data[2]<0xc0) { + len=3; + ret=((data[0]&15)<<12)| + ((data[1]&63)<<6)| + (data[2]&63); + } else len=2; + } else len=1; + } else if (data[0]<0xf5) { + if (data[1]>=0x80 && data[1]<0xc0) { + if (data[2]>=0x80 && data[2]<0xc0) { + if (data[3]>=0x80 && data[3]<0xc0) { + len=4; + ret=((data[0]&7)<<18)| + ((data[1]&63)<<12)| + ((data[2]&63)<<6)| + (data[3]&63); + } else len=3; + } else len=2; + } else len=1; + } else { + len=1; + return 0xfffd; + } + + if ((ret>=0xd800 && ret<=0xdfff) || ret>=0x110000) return 0xfffd; + return ret; +} + +size_t utf8len(const char* s) { + size_t p=0; + size_t r=0; + char cl; + while (s[p]!=0) { + r++; + decodeUTF8((const unsigned char*)&s[p],cl); + p+=cl; + } + return r; +} + +char utf8csize(const unsigned char* c) { + char ret; + decodeUTF8(c,ret); + return ret; +} + +WString utf8To16(const char* s) { + WString ret; + int ch, p; + char chs; + p=0; + while (s[p]!=0) { + ch=decodeUTF8((const unsigned char*)&s[p],chs); + ret+=(unsigned short)ch; + p+=chs; + } + return ret; +} + +String utf16To8(const wchar_t* s) { + String ret; + for (size_t i=0; i>6)&31)); + ret+=(0x80+((s[i])&63)); + } else { + ret+=(0xe0+((s[i]>>12)&15)); + ret+=(0x80+((s[i]>>6)&63)); + ret+=(0x80+((s[i])&63)); + + } + } + return ret; +} diff --git a/src/utfutils.h b/src/utfutils.h new file mode 100644 index 000000000..b087b5b87 --- /dev/null +++ b/src/utfutils.h @@ -0,0 +1,15 @@ +#ifndef _UTFUTILS_H +#define _UTFUTILS_H +#include "ta-utils.h" + +size_t utf8len(const char* s); +size_t utf8clen(const char* s); +size_t utf8pos(const char* s, size_t inpos); +size_t utf8cpos(const char* s, size_t inpos); +size_t utf8findcpos(const char* s, float inpos); +char utf8csize(const unsigned char* c); + +WString utf8To16(const char* in); +String utf16To8(const wchar_t* in); + +#endif diff --git a/src/winMain.cpp b/src/winMain.cpp new file mode 100644 index 000000000..f8f37a22a --- /dev/null +++ b/src/winMain.cpp @@ -0,0 +1,27 @@ +#include "utfutils.h" + +int WINAPI WinMain(HINSTANCE inst, HINSTANCE prevInst, PSTR args, int state) { + int argc=0; + wchar_t** argw=CommandLineToArgvW(GetCommandLineW(),&argc); + char** argv=new char*[argc+1]; + argv[argc]=NULL; + for (int i=0; i