Files
itgmania212121/src/FontCharAliases.cpp
T

416 lines
12 KiB
C++
Raw Normal View History

2011-03-17 01:47:30 -04:00
#include "global.h"
#include "FontCharAliases.h"
#include "Font.h"
#include "RageUtil.h"
#include "RageLog.h"
#include <map>
// Map from "&foo;" to a UTF-8 string.
typedef map<RString, wchar_t, StdString::StdStringLessNoCase> aliasmap;
static aliasmap CharAliases;
static map<RString,RString> CharAliasRepl;
/* Editing this file in VC6 will be rather ugly, since it contains a lot of UTF-8.
* Just don't change anything you can't read. :) */
/* If we move this to an INI, group these, so we can display them in a help
* page off of the TextEntry screen reasonably.
*
* [Game Kanji]
* kakumei1=革
* [Game Symbols]
* doublezeta=SPECIAL
* [Hiragana]
* [Katakana]
* [Punctuation]
*
* I'm not sure how to handle internal-use character, like Zz. Whenever we write
* text to disk, we need to write placeholders (&doublezeta;) for them, and never
* Unicode characters, since the codepoint is prone to change. We can't currently
* write &these; to SMs, due to format limitations.
*/
// the above comment sounds old, look at the "kakumei1", which reminds me of the
// old SPiGuMuS kanji font hack.
// a more modern implementation would likely involve a Lua file in Data for the
// base character aliases, and any alias not encountered in the list would be
// added at the next possible internal code point. -aj
/* Here's a copy-and-paste for a basic Japanese font page:
 、。〃〄々〆〇〈〉《》「」『』
【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟
〰〱〲〳〴〵〶〷
 ぁあぃいぅうぇえぉおかがきぎく
ぐけげこごさざしじすずせぜそぞた
だちぢっつづてでとどなにぬねのは
ばぱひびぴふぶぷへべぺほぼぽまみ
むめもゃやゅゆょよらりるれろゎわ
ゐゑをんゔ      ゛゜ゝゞ 
 ァアィイゥウェエォオカガキギク
グケゲコゴサザシジスズセゼソゾタ
ダチヂッツヅテデトドナニヌネノハ
バパヒビピフブプヘベペホボポマミ
ムメモャヤュユョヨラリルレロヮワ
ヰヱヲンヴヵヶヷヸヹヺ・ーヽヾ 
And here's one for a kanji page:
一ニ三四五六七八
九十
革命祭桜小坂鬼道
弐神様民謡明日青
衝動猫毛亜熱帯爆
弾谷新大見解魔法
扉夜空才
*/
static void InitCharAliases()
{
if(!CharAliases.empty())
return;
CharAliases["default"] = FONT_DEFAULT_GLYPH; // ?
CharAliases["invalid"] = INVALID_CHAR; // 0xFFFD
// The comments here are UTF-8; they won't show up in VC6
// (use a better editor then -aj)
#define INTERNAL 0xE000
// todo: convert this into a vector? that way we can dynamically add
// to the list easier. -aj(?)
// Hiragana:
struct alias {
const char *str;
wchar_t chr;
} aliases[] = {
{ "ha", 0x3042 }, /* あ */
{ "hi", 0x3044 }, /* い */
{ "hu", 0x3046 }, /* う */
{ "he", 0x3048 }, /* え */
{ "ho", 0x304a }, /* お */
{ "hka", 0x304b }, /* か */
{ "hki", 0x304d }, /* き */
{ "hku", 0x304f }, /* く */
{ "hke", 0x3051 }, /* け */
{ "hko", 0x3053 }, /* こ */
{ "hga", 0x304c }, /* が */
{ "hgi", 0x304e }, /* ぎ */
{ "hgu", 0x3050 }, /* ぐ */
{ "hge", 0x3052 }, /* げ */
{ "hgo", 0x3054 }, /* ご */
{ "hza", 0x3056 }, /* ざ */
{ "hzi", 0x3058 }, /* じ */
{ "hzu", 0x305a }, /* ず */
{ "hze", 0x305c }, /* ぜ */
{ "hzo", 0x305e }, /* ぞ */
{ "hta", 0x305f }, /* た */
{ "hti", 0x3061 }, /* ち */
{ "htu", 0x3064 }, /* つ */
{ "hte", 0x3066 }, /* て */
{ "hto", 0x3068 }, /* と */
{ "hda", 0x3060 }, /* だ */
{ "hdi", 0x3062 }, /* ぢ */
{ "hdu", 0x3065 }, /* づ */
{ "hde", 0x3067 }, /* で */
{ "hdo", 0x3069 }, /* ど */
{ "hna", 0x306a }, /* な */
{ "hni", 0x306b }, /* に */
{ "hnu", 0x306c }, /* ぬ */
{ "hne", 0x306d }, /* ね */
{ "hno", 0x306e }, /* の */
{ "hha", 0x306f }, /* は */
{ "hhi", 0x3072 }, /* ひ */
{ "hhu", 0x3075 }, /* ふ */
{ "hhe", 0x3078 }, /* へ */
{ "hho", 0x307b }, /* ほ */
{ "hba", 0x3070 }, /* ば */
{ "hbi", 0x3073 }, /* び */
{ "hbu", 0x3076 }, /* ぶ */
{ "hbe", 0x3079 }, /* べ */
{ "hbo", 0x307c }, /* ぼ */
{ "hpa", 0x3071 }, /* ぱ */
{ "hpi", 0x3074 }, /* ぴ */
{ "hpu", 0x3077 }, /* ぷ */
{ "hpe", 0x307a }, /* ぺ */
{ "hpo", 0x307d }, /* ぽ */
{ "hma", 0x307e }, /* ま */
{ "hmi", 0x307f }, /* み */
{ "hmu", 0x3080 }, /* む */
{ "hme", 0x3081 }, /* め */
{ "hmo", 0x3082 }, /* も */
{ "hya", 0x3084 }, /* や */
{ "hyu", 0x3086 }, /* ゆ */
{ "hyo", 0x3088 }, /* よ */
{ "hra", 0x3089 }, /* ら */
{ "hri", 0x308a }, /* り */
{ "hru", 0x308b }, /* る */
{ "hre", 0x308c }, /* れ */
{ "hro", 0x308d }, /* ろ */
{ "hwa", 0x308f }, /* わ */
{ "hwi", 0x3090 }, /* ゐ */
{ "hwe", 0x3091 }, /* ゑ */
{ "hwo", 0x3092 }, /* を */
{ "hn", 0x3093 }, /* ん */
{ "hvu", 0x3094 }, /* ゔ */
{ "has", 0x3041 }, /* ぁ */
{ "his", 0x3043 }, /* ぃ */
{ "hus", 0x3045 }, /* ぅ */
{ "hes", 0x3047 }, /* ぇ */
{ "hos", 0x3049 }, /* ぉ */
{ "hkas", 0x3095 }, /* ゕ */
{ "hkes", 0x3096 }, /* ゖ */
{ "hsa", 0x3055 }, /* さ */
{ "hsi", 0x3057 }, /* し */
{ "hsu", 0x3059 }, /* す */
{ "hse", 0x305b }, /* せ */
{ "hso", 0x305d }, /* そ */
{ "hyas", 0x3083 }, /* ゃ */
{ "hyus", 0x3085 }, /* ゅ */
{ "hyos", 0x3087 }, /* ょ */
{ "hwas", 0x308e }, /* ゎ */
// Katakana:
{ "hq", 0x3063 }, /* っ */
{ "ka", 0x30a2 }, /* ア */
{ "ki", 0x30a4 }, /* イ */
{ "ku", 0x30a6 }, /* ウ */
{ "ke", 0x30a8 }, /* エ */
{ "ko", 0x30aa }, /* オ */
{ "kka", 0x30ab }, /* カ */
{ "kki", 0x30ad }, /* キ */
{ "kku", 0x30af }, /* ク */
{ "kke", 0x30b1 }, /* ケ */
{ "kko", 0x30b3 }, /* コ */
{ "kga", 0x30ac }, /* ガ */
{ "kgi", 0x30ae }, /* ギ */
{ "kgu", 0x30b0 }, /* グ */
{ "kge", 0x30b2 }, /* ゲ */
{ "kgo", 0x30b4 }, /* ゴ */
{ "kza", 0x30b6 }, /* ザ */
{ "kzi", 0x30b8 }, /* ジ */
{ "kji", 0x30b8 }, /* ジ */ /* zi/ji alias */
{ "kzu", 0x30ba }, /* ズ */
{ "kze", 0x30bc }, /* ゼ */
{ "kzo", 0x30be }, /* ゾ */
{ "kta", 0x30bf }, /* タ */
{ "kti", 0x30c1 }, /* チ */
{ "ktu", 0x30c4 }, /* ツ */
{ "kte", 0x30c6 }, /* テ */
{ "kto", 0x30c8 }, /* ト */
{ "kda", 0x30c0 }, /* ダ */
{ "kdi", 0x30c2 }, /* ヂ */
{ "kdu", 0x30c5 }, /* ヅ */
{ "kde", 0x30c7 }, /* デ */
{ "kdo", 0x30c9 }, /* ド */
{ "kna", 0x30ca }, /* ナ */
{ "kni", 0x30cb }, /* ニ */
{ "knu", 0x30cc }, /* ヌ */
{ "kne", 0x30cd }, /* ネ */
{ "kno", 0x30ce }, /* */
{ "kha", 0x30cf }, /* ハ */
{ "khi", 0x30d2 }, /* ヒ */
{ "khu", 0x30d5 }, /* フ */
{ "khe", 0x30d8 }, /* ヘ */
{ "kho", 0x30db }, /* ホ */
{ "kba", 0x30d0 }, /* バ */
{ "kbi", 0x30d3 }, /* ビ */
{ "kbu", 0x30d6 }, /* ブ */
{ "kbe", 0x30d9 }, /* ベ */
{ "kbo", 0x30dc }, /* ボ */
{ "kpa", 0x30d1 }, /* パ */
{ "kpi", 0x30d4 }, /* ピ */
{ "kpu", 0x30d7 }, /* プ */
{ "kpe", 0x30da }, /* ペ */
{ "kpo", 0x30dd }, /* ポ */
{ "kma", 0x30de }, /* マ */
{ "kmi", 0x30df }, /* ミ */
{ "kmu", 0x30e0 }, /* ム */
{ "kme", 0x30e1 }, /* メ */
{ "kmo", 0x30e2 }, /* モ */
{ "kya", 0x30e4 }, /* ヤ */
{ "kyu", 0x30e6 }, /* ユ */
{ "kyo", 0x30e8 }, /* ヨ */
{ "kra", 0x30e9 }, /* ラ */
{ "kri", 0x30ea }, /* リ */
{ "kru", 0x30eb }, /* ル */
{ "kre", 0x30ec }, /* レ */
{ "kro", 0x30ed }, /* ロ */
{ "kwa", 0x30ef }, /* ワ */
{ "kwi", 0x30f0 }, /* ヰ */
{ "kwe", 0x30f1 }, /* ヱ */
{ "kwo", 0x30f2 }, /* ヲ */
{ "kn", 0x30f3 }, /* ン */
{ "kvu", 0x30f4 }, /* ヴ */
{ "kas", 0x30a1 }, /* ァ */
{ "kis", 0x30a3 }, /* ィ */
{ "kus", 0x30a5 }, /* ゥ */
{ "kes", 0x30a7 }, /* ェ */
{ "kos", 0x30a9 }, /* ォ */
{ "kkas", 0x30f5 }, /* ヵ */
{ "kkes", 0x30f6 }, /* ヶ */
{ "ksa", 0x30b5 }, /* サ */
{ "ksi", 0x30b7 }, /* シ */
{ "ksu", 0x30b9 }, /* ス */
{ "kse", 0x30bb }, /* セ */
{ "kso", 0x30bd }, /* ソ */
{ "kyas", 0x30e3 }, /* ャ */
{ "kyus", 0x30e5 }, /* ュ */
{ "kyos", 0x30e7 }, /* ョ */
{ "kwas", 0x30ee }, /* ヮ */
{ "kq", 0x30c3 }, /* ッ */
{ "kdot", 0x30FB }, /* ・ */
{ "kdash", 0x30FC }, /* ー */
{ "nbsp", 0x00a0 }, /* Non-breaking space */
// Symbols:
{ "delta", 0x0394 }, /* Δ */
{ "sigma", 0x03a3 }, /* Σ */
{ "omega", 0x03a9 }, /* Ω */
{ "angle", 0x2220 }, /* ∠ */
{ "whiteheart", 0x2661 }, /* ♡ */
{ "blackstar", 0x2605 }, /* ★ */
{ "whitestar", 0x2606 }, /* ☆ */
{ "flipped-a", 0x2200 }, /* ∀ */
{ "squared", 0x00b2 }, /* ² */
{ "cubed", 0x00b3 }, /* ³ */
{ "oq", 0x201c }, /* “ */
{ "cq", 0x201d }, /* ” */
{ "leftarrow", 0x2190 }, /* ← */
{ "uparrow", 0x2191 }, /* ↑ */
{ "rightarrow", 0x2192 }, /* → */
{ "downarrow", 0x2193 }, /* ↓ */
{ "4thnote", 0x2669 }, /* ♩ */
{ "8thnote", 0x266A }, /* ♪ */
{ "b8thnote", 0x266B }, /* ♫ */
{ "b16thnote", 0x266C }, /* ♬ */
{ "flat", 0x266D }, /* ♭ */
{ "natural", 0x266E }, /* ♮ */
{ "sharp", 0x266F }, /* ♯ */
/* These are internal-use glyphs; they don't have real Unicode codepoints. */
{ "up", INTERNAL },
{ "down", INTERNAL },
{ "left", INTERNAL },
{ "right", INTERNAL },
{ "downleft", INTERNAL },
{ "downright", INTERNAL },
{ "upleft", INTERNAL },
{ "upright", INTERNAL },
{ "center", INTERNAL },
{ "menuup", INTERNAL },
{ "menudown", INTERNAL },
{ "menuleft", INTERNAL },
{ "menuright", INTERNAL },
{ "start", INTERNAL },
{ "doublezeta", INTERNAL },
{ "planet", INTERNAL },
{ "back", INTERNAL },
{ "ok", INTERNAL },
{ "nextrow", INTERNAL },
{ "select", INTERNAL },
// PlayStation-style controller
{ "auxx", INTERNAL },
{ "auxtriangle",INTERNAL },
{ "auxsquare", INTERNAL },
{ "auxcircle", INTERNAL },
{ "auxl1", INTERNAL },
{ "auxl2", INTERNAL },
{ "auxl3", INTERNAL },
{ "auxr1", INTERNAL },
{ "auxr2", INTERNAL },
{ "auxr3", INTERNAL },
{ "auxselect", INTERNAL },
{ "auxstart", INTERNAL },
// various other controllers (SNES, Saturn, Dreamcast stick styles)
{ "auxa", INTERNAL },
{ "auxb", INTERNAL },
{ "auxc", INTERNAL },
{ "auxd", INTERNAL },
// auxx is handled above
{ "auxy", INTERNAL },
{ "auxz", INTERNAL },
{ "auxl", INTERNAL },
{ "auxr", INTERNAL },
// Xbox (original, 360)-style controllers
{ "auxwhite", INTERNAL },
{ "auxblack", INTERNAL },
{ "auxlb", INTERNAL },
{ "auxrb", INTERNAL },
{ "auxlt", INTERNAL },
{ "auxrt", INTERNAL },
{ "auxback", INTERNAL },
{ NULL, 0 }
};
int iNextInternalUseCodepoint = 0xE000;
for( unsigned n = 0; aliases[n].str; ++n )
{
int iCodepoint = aliases[n].chr;
if( iCodepoint == INTERNAL )
iCodepoint = iNextInternalUseCodepoint++;
CharAliases[aliases[n].str] = iCodepoint;
}
for(aliasmap::const_iterator i = CharAliases.begin(); i != CharAliases.end(); ++i)
{
RString from = i->first;
RString to = WcharToUTF8(i->second);
from.MakeLower();
CharAliasRepl[from] = to;
}
}
// Replace all &markers; and &#NNNN;s with UTF-8.
void FontCharAliases::ReplaceMarkers( RString &sText )
{
InitCharAliases();
ReplaceEntityText( sText, CharAliasRepl );
Replace_Unicode_Markers(sText);
}
// Replace all &markers; and &#NNNN;s with UTF-8.
bool FontCharAliases::GetChar( RString &codepoint, wchar_t &ch )
{
InitCharAliases();
aliasmap::const_iterator i = CharAliases.find(codepoint);
if(i == CharAliases.end())
return false;
ch = i->second;
return true;
}
/*
* (c) 2003 Glenn Maynard
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/