add ability to externally load fonts and activate japanese/korean

translations.
This commit is contained in:
Daryl Borth 2019-01-05 17:14:22 -07:00
parent a49567d4b2
commit f490574b9e
11 changed files with 186 additions and 7 deletions

BIN
fonts/jp.ttf Normal file

Binary file not shown.

BIN
fonts/ko.ttf Normal file

Binary file not shown.

View File

@ -38,6 +38,13 @@ https://github.com/dborth/fceugx/releases
|0O×øo· UPDATE HISTORY ·oø×O0| |0O×øo· UPDATE HISTORY ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨' `¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
[3.4.2]
* Fixed GameCube controllers not working
* Added ability to load external fonts and activated Japanese/Korean
translations. Simply put the ko.ttf or jp.ttf in the app directory
* Added ability to change preview image source with + button (thanks Zalo!)
[3.4.1 - January 4, 2019] [3.4.1 - January 4, 2019]
* Improved WiiFlow integration * Improved WiiFlow integration

View File

@ -41,6 +41,9 @@
#include "gui/gui.h" #include "gui/gui.h"
#include "utils/wiidrc.h" #include "utils/wiidrc.h"
#include "utils/FreeTypeGX.h" #include "utils/FreeTypeGX.h"
#ifdef HW_RVL
#include "mem2.h"
#endif
#ifdef USE_VM #ifdef USE_VM
#include "vmalloc.h" #include "vmalloc.h"
#endif #endif
@ -400,6 +403,8 @@ int main(int argc, char *argv[])
// store path app was loaded from // store path app was loaded from
if(argc > 0 && argv[0] != NULL) if(argc > 0 && argv[0] != NULL)
CreateAppPath(argv[0]); CreateAppPath(argv[0]);
InitMem2Manager();
#endif #endif
DefaultSettings(); // Set defaults DefaultSettings(); // Set defaults

View File

@ -35,9 +35,14 @@
#include "filebrowser.h" #include "filebrowser.h"
#include "gui/gui.h" #include "gui/gui.h"
#ifdef HW_RVL
#include "mem2.h"
#endif
#define THREAD_SLEEP 100 #define THREAD_SLEEP 100
unsigned char *savebuffer = NULL; unsigned char *savebuffer = NULL;
u8 *ext_font_ttf = NULL;
static mutex_t bufferLock = LWP_MUTEX_NULL; static mutex_t bufferLock = LWP_MUTEX_NULL;
FILE * file; // file pointer - the only one we should ever use! FILE * file; // file pointer - the only one we should ever use!
bool unmountRequired[7] = { false, false, false, false, false, false, false }; bool unmountRequired[7] = { false, false, false, false, false, false, false };
@ -854,6 +859,43 @@ size_t LoadFile(char * filepath, bool silent)
return LoadFile((char *)savebuffer, filepath, 0, SAVEBUFFERSIZE, silent); return LoadFile((char *)savebuffer, filepath, 0, SAVEBUFFERSIZE, silent);
} }
#ifdef HW_RVL
size_t LoadFont(char * filepath)
{
FILE *file = fopen (filepath, "rb");
if(!file) {
ErrorPrompt("Font file not found!");
return 0;
}
fseeko(file,0,SEEK_END);
size_t loadSize = ftello(file);
if(loadSize == 0) {
ErrorPrompt("Error loading font!");
return 0;
}
if(ext_font_ttf) {
mem2_free(ext_font_ttf);
}
ext_font_ttf = (u8 *)mem2_malloc(loadSize);
if(!ext_font_ttf) {
ErrorPrompt("Font file is too large!");
fclose(file);
return 0;
}
fseeko(file,0,SEEK_SET);
fread (ext_font_ttf, 1, loadSize, file);
fclose(file);
return loadSize;
}
#endif
/**************************************************************************** /****************************************************************************
* SaveFile * SaveFile
* Write buffer to file * Write buffer to file

View File

@ -37,10 +37,12 @@ void FreeSaveBuffer();
size_t LoadFile(char * rbuffer, char *filepath, size_t length, size_t buffersize, bool silent); size_t LoadFile(char * rbuffer, char *filepath, size_t length, size_t buffersize, bool silent);
size_t LoadFile(char * filepath, bool silent); size_t LoadFile(char * filepath, bool silent);
size_t LoadSzFile(char * filepath, unsigned char * rbuffer); size_t LoadSzFile(char * filepath, unsigned char * rbuffer);
size_t LoadFont(char *filepath);
size_t SaveFile(char * buffer, char *filepath, size_t datasize, bool silent); size_t SaveFile(char * buffer, char *filepath, size_t datasize, bool silent);
size_t SaveFile(char * filepath, size_t datasize, bool silent); size_t SaveFile(char * filepath, size_t datasize, bool silent);
extern unsigned char *savebuffer; extern unsigned char *savebuffer;
extern u8 *ext_font_ttf;
extern FILE * file; extern FILE * file;
extern bool unmountRequired[]; extern bool unmountRequired[];
extern bool isMounted[]; extern bool isMounted[];

44
source/mem2.cpp Normal file
View File

@ -0,0 +1,44 @@
/****************************************************************************
* FCE Ultra
* Nintendo Wii/Gamecube Port
*
* Tantric 2010
*
* mem2.cpp
*
* MEM2 memory allocator
***************************************************************************/
#ifdef HW_RVL
#include <ogc/machine/asm.h>
#include <ogc/lwp_heap.h>
#include <ogc/system.h>
#include <ogc/machine/processor.h>
static heap_cntrl mem2_heap;
u32 InitMem2Manager ()
{
int size = (10*1024*1024);
u32 level;
_CPU_ISR_Disable(level);
size &= ~0x1f; // round down, because otherwise we may exceed the area
void *mem2_heap_ptr = (void *)((u32)SYS_GetArena2Hi()-size);
SYS_SetArena2Hi(mem2_heap_ptr);
_CPU_ISR_Restore(level);
size = __lwp_heap_init(&mem2_heap, mem2_heap_ptr, size, 32);
return size;
}
void* mem2_malloc(u32 size)
{
return __lwp_heap_allocate(&mem2_heap, size);
}
bool mem2_free(void *ptr)
{
return __lwp_heap_free(&mem2_heap, ptr);
}
#endif

23
source/mem2.h Normal file
View File

@ -0,0 +1,23 @@
/****************************************************************************
* FCE Ultra
* Nintendo Wii/Gamecube Port
*
* Tantric 2010
*
* mem2.h
*
* MEM2 memory allocator
***************************************************************************/
#ifdef HW_RVL
#ifndef _MEM2MANAGER_H_
#define _MEM2MANAGER_H_
u32 InitMem2Manager ();
void* mem2_malloc(u32 size);
bool mem2_free(void *ptr);
#endif
#endif

View File

@ -41,6 +41,7 @@
#include "cheatmgr.h" #include "cheatmgr.h"
#include "gui/gui.h" #include "gui/gui.h"
#include "utils/gettext.h" #include "utils/gettext.h"
#include "utils/FreeTypeGX.h"
#define THREAD_SLEEP 100 #define THREAD_SLEEP 100
@ -48,6 +49,10 @@
static GuiImageData * pointer[4]; static GuiImageData * pointer[4];
#endif #endif
#ifdef HW_RVL
#include "mem2.h"
#endif
#ifdef USE_VM #ifdef USE_VM
#include "vmalloc.h" #include "vmalloc.h"
#define MEM_ALLOC(A) (u8*)vm_malloc(A) #define MEM_ALLOC(A) (u8*)vm_malloc(A)
@ -126,7 +131,7 @@ HaltGui()
usleep(THREAD_SLEEP); usleep(THREAD_SLEEP);
} }
void ResetText() static void ResetText()
{ {
LoadLanguage(); LoadLanguage();
@ -134,6 +139,58 @@ void ResetText()
mainWindow->ResetText(); mainWindow->ResetText();
} }
static int currentLanguage = -1;
void ChangeLanguage() {
if(currentLanguage == GCSettings.language) {
return;
}
if(GCSettings.language == LANG_JAPANESE || GCSettings.language == LANG_KOREAN) {
#ifdef HW_RVL
char filepath[MAXPATHLEN];
switch(GCSettings.language) {
case LANG_KOREAN:
sprintf(filepath, "%s/ko.ttf", appPath);
break;
case LANG_JAPANESE:
sprintf(filepath, "%s/jp.ttf", appPath);
break;
}
size_t fontSize = LoadFont(filepath);
if(fontSize > 0) {
HaltGui();
DeinitFreeType();
InitFreeType((u8*)ext_font_ttf, fontSize);
}
else {
GCSettings.language = currentLanguage;
}
#else
GCSettings.language = currentLanguage;
ErrorPrompt("Unsupported language!");
#endif
}
#ifdef HW_RVL
else {
if(ext_font_ttf != NULL) {
HaltGui();
DeinitFreeType();
mem2_free(ext_font_ttf);
ext_font_ttf = NULL;
InitFreeType((u8*)font_ttf, font_ttf_size);
}
}
#endif
HaltGui();
ResetText();
currentLanguage = GCSettings.language;
ResumeGui();
}
/**************************************************************************** /****************************************************************************
* WindowPrompt * WindowPrompt
* *
@ -3735,6 +3792,7 @@ static int MenuSettingsMenu()
int i = 0; int i = 0;
bool firstRun = true; bool firstRun = true;
OptionList options; OptionList options;
currentLanguage = GCSettings.language;
sprintf(options.name[i++], "Exit Action"); sprintf(options.name[i++], "Exit Action");
sprintf(options.name[i++], "Wiimote Orientation"); sprintf(options.name[i++], "Wiimote Orientation");
@ -3822,9 +3880,7 @@ static int MenuSettingsMenu()
GCSettings.language = LANG_JAPANESE; GCSettings.language = LANG_JAPANESE;
if(GCSettings.language == LANG_SIMP_CHINESE) if(GCSettings.language == LANG_SIMP_CHINESE)
GCSettings.language = LANG_PORTUGUESE; GCSettings.language = LANG_KOREAN;
else if(GCSettings.language == LANG_JAPANESE)
GCSettings.language = LANG_ENGLISH;
break; break;
case 6: case 6:
@ -3920,11 +3976,11 @@ static int MenuSettingsMenu()
menu = MENU_SETTINGS; menu = MENU_SETTINGS;
} }
} }
ChangeLanguage();
HaltGui(); HaltGui();
mainWindow->Remove(&optionBrowser); mainWindow->Remove(&optionBrowser);
mainWindow->Remove(&w); mainWindow->Remove(&w);
mainWindow->Remove(&titleTxt); mainWindow->Remove(&titleTxt);
ResetText();
return menu; return menu;
} }

View File

@ -21,7 +21,7 @@ void InfoPrompt(const char * msg);
void ShowAction (const char *msg); void ShowAction (const char *msg);
void CancelAction(); void CancelAction();
void ShowProgress (const char *msg, int done, int total); void ShowProgress (const char *msg, int done, int total);
void ResetText(); void ChangeLanguage();
enum enum
{ {

View File

@ -624,6 +624,6 @@ bool LoadPrefs()
} }
ResetText(); ChangeLanguage();
return prefFound; return prefFound;
} }