summaryrefslogtreecommitdiff
path: root/Runtime/GUI
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-11-01 19:30:44 +0800
committerchai <chaifix@163.com>2021-11-01 19:30:44 +0800
commit4b652abe1d76f1bcbe5d7583a8986256f50c483d (patch)
treedaf81888f8e37c40483fcd309201bc33471b97fa /Runtime/GUI
parentb7310c9cce95bfc9bfe135063ee0e97fbc654928 (diff)
-LuaBindClass::RegisterNativeClass
Diffstat (limited to 'Runtime/GUI')
-rw-r--r--Runtime/GUI/Font.cpp11
-rw-r--r--Runtime/GUI/Font.h34
-rw-r--r--Runtime/GUI/TextMesh.cpp0
-rw-r--r--Runtime/GUI/TextMesh.h24
-rw-r--r--Runtime/GUI/TextMeshGenerator.cpp0
-rw-r--r--Runtime/GUI/TextMeshGenerator.h20
-rw-r--r--Runtime/GUI/utf8.cpp415
-rw-r--r--Runtime/GUI/utf8.h113
8 files changed, 601 insertions, 16 deletions
diff --git a/Runtime/GUI/Font.cpp b/Runtime/GUI/Font.cpp
index 67a2e3b..e5444f1 100644
--- a/Runtime/GUI/Font.cpp
+++ b/Runtime/GUI/Font.cpp
@@ -75,7 +75,7 @@ Font::Font(DataBuffer* db, TextGeneratingSettings settings)
}
}
-Font::Font(DataBuffer* db, LuaBind::VM* vm, std::string path, TextGeneratingSettings settings)
+Font::Font(LuaBind::VM* vm, DataBuffer* db, TextGeneratingSettings settings)
: LuaBind::NativeClass<Font>(vm)
{
m_AtlasMargin = settings.margin;
@@ -124,6 +124,15 @@ void Font::RenderCharacters(character::Codepoint* codepoint, int n, int pixelSiz
}
}
+void Font::RenderCharacters(std::vector<character::Codepoint>& codepoint, int pixelSize)
+{
+ int n = codepoint.size();
+ for (int i = 0; i < n; ++i)
+ {
+ RenderCharacter(codepoint[i], pixelSize);
+ }
+}
+
void Font::RenderCharacter(character::Codepoint codepoint, int pixelSize)
{
character::Hash hash = GetHash(codepoint, pixelSize);
diff --git a/Runtime/GUI/Font.h b/Runtime/GUI/Font.h
index 242bd19..344cc00 100644
--- a/Runtime/GUI/Font.h
+++ b/Runtime/GUI/Font.h
@@ -5,24 +5,29 @@
#include "freetype.h"
#include "Runtime/Lua/LuaHelper.h"
#include "Runtime/Common/DataBuffer.h"
+#include "Runtime/Math/Math.h"
#include <string>
#include <unordered_map>
#include <exception>
#include <vector>
-//https://learnopengl.com/In-Practice/Text-Rendering
+//https://github.com/kaienfr/Font
struct Character {
unsigned int atlas; // atlas索引
- Internal::Rect position; // 在altas里的位置
- Internal::Vector2 bearing; // 左上角相对于原点的偏移
+ Rect position; // 在altas里的位置
+ Vector2 bearing; // 左上角相对于原点的偏移
unsigned int advance; // 总宽,算上了间隔
};
namespace character
{
+#if GAMELAB_WIN
typedef unsigned short Codepoint; // unicode Codepoint(BMP,U+0000至U+FFFF)
+#else
+ typedef unsigned int Codepoint; // unicode Codepoint(BMP,U+0000至U+FFFF)
+#endif
union Hash {
unsigned int hashCode;
@@ -55,13 +60,13 @@ struct GlyphAtals
Texture* altas; // 贴图
int width, height; // 尺寸
- Internal::Vector2 cursor; // 游标,从左上角(0,0)开始
+ Vector2 cursor; // 游标,从左上角(0,0)开始
int rowHeight; // 当前行的高度
};
struct TextGeneratingSettings
{
- Internal::Vector2 atlasSize; // atlas的尺寸
+ Vector2 atlasSize; // atlas的尺寸
int margin; // atlas的边界
int padding; // glyph相互之间的间距,防止采样的时候越界
};
@@ -89,20 +94,21 @@ public:
Font(std::string path, TextGeneratingSettings setting)/*throw FontException*/;
Font(LuaBind::VM* vm, std::string path, TextGeneratingSettings setting)/*throw FontException*/;
Font(DataBuffer* db, TextGeneratingSettings setting)/*throw FontException*/;
- Font(DataBuffer* db, LuaBind::VM* vm, std::string path, TextGeneratingSettings setting)/*throw FontException*/;
+ Font(LuaBind::VM* vm, DataBuffer* db, TextGeneratingSettings setting)/*throw FontException*/;
const Character* GetCharacter(character::Codepoint codepoint, int pixelSize);
const GlyphAtals* GetGlyphAtlas(int index);
// pre-bake
void RenderCharacter(character::Codepoint codepoint, int pixelSize);
- void RenderCharacters(character::Codepoint* codepoint, int n, int pixelSize);
+ void RenderCharacters(character::Codepoint* codepoint, int n, int pixelSize);
+ void RenderCharacters(std::vector<character::Codepoint>& codepoint, int pixelSize);
private:
Texture* CreateAtlas();
- GlyphAtals* RequestAtlas(int pixelSize, Internal::Vector2 preferSize);
- Internal::Rect GetRenderChartAndMove(GlyphAtals* atlas, Internal::Vector2 preferSize);
- bool HasEnoughSpace(GlyphAtals* atlas, Internal::Vector2 preferSize);
+ GlyphAtals* RequestAtlas(int pixelSize, Vector2 preferSize);
+ Rect GetRenderChartAndMove(GlyphAtals* atlas, Vector2 preferSize);
+ bool HasEnoughSpace(GlyphAtals* atlas, Vector2 preferSize);
character::Hash GetHash(character::Codepoint Codepoint, int pixelSize);
//-------------------------------------------------------------------------
@@ -114,9 +120,9 @@ private:
bool m_IsEnabled;
- Internal::Vector2 m_AtlasSize;
- int m_AtlasMargin;
- int m_GlyphPadding;
+ Vector2 m_AtlasSize;
+ int m_AtlasMargin;
+ int m_GlyphPadding;
FT_Library m_FTLibrary;
FT_Face m_FTFace;
@@ -132,8 +138,6 @@ private:
};
-//#define g_TextGenerator (*Font::Instance())
-
namespace TextHelper
{
diff --git a/Runtime/GUI/TextMesh.cpp b/Runtime/GUI/TextMesh.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Runtime/GUI/TextMesh.cpp
diff --git a/Runtime/GUI/TextMesh.h b/Runtime/GUI/TextMesh.h
new file mode 100644
index 0000000..7f37e5e
--- /dev/null
+++ b/Runtime/GUI/TextMesh.h
@@ -0,0 +1,24 @@
+#pragma once
+
+enum ETextAnchor
+{
+ TextAnchor_UpperLeft,
+ TextAnchor_UpperCenter,
+ TextAnchor_UpperRight,
+ TextAnchor_MiddleLeft,
+ TextAnchor_MiddleCenter,
+ TextAnchor_MiddleRight,
+ TextAnchor_LowerLeft,
+ TextAnchor_LowerCenter,
+ TextAnchor_LowerRight,
+ TextAnchor_DontCare
+};
+
+enum ETextAlignment {
+ TextAlignment_Left,
+ TextAlignment_Center,
+ TextAlignment_Right,
+ TextAlignment_Auto,
+};
+
+
diff --git a/Runtime/GUI/TextMeshGenerator.cpp b/Runtime/GUI/TextMeshGenerator.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Runtime/GUI/TextMeshGenerator.cpp
diff --git a/Runtime/GUI/TextMeshGenerator.h b/Runtime/GUI/TextMeshGenerator.h
new file mode 100644
index 0000000..c5992bd
--- /dev/null
+++ b/Runtime/GUI/TextMeshGenerator.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "Runtime/Utilities/IIncrementalTask.h"
+
+// 回收长期没有被使用的text mesh
+class GraduallyReleaseTextMesh : public IIncrementalTask
+{
+public:
+ void Execute() override
+ {
+
+ }
+
+ bool IsDone() override
+ {
+
+ }
+
+};
+
diff --git a/Runtime/GUI/utf8.cpp b/Runtime/GUI/utf8.cpp
new file mode 100644
index 0000000..8a3a086
--- /dev/null
+++ b/Runtime/GUI/utf8.cpp
@@ -0,0 +1,415 @@
+/*
+ * Description: UTF-8 瀛楃涓茬殑瑙g爜鍜岀紪鐮佸嚱鏁
+ * unicode 瀛楃澶勭悊鍑芥暟
+ * History: yang@haipo.me, 2013/05/29, create
+ *
+ * This code is in the public domain.
+ * You may use this code any way you wish, private, educational,
+ * or commercial. It's free.
+ */
+
+# include <stdint.h>
+# include <stddef.h>
+
+# include "utf8.h"
+
+namespace utf8
+{
+
+ ucs4_t getu8c(char **src, int *illegal)
+ {
+ static char umap[256] = { 0 };
+ static int umap_init_flag = 0;
+
+ if (umap_init_flag == 0)
+ {
+ int i;
+
+ for (i = 0; i < 0x100; ++i)
+ {
+ if (i < 0x80)
+ {
+ umap[i] = 1;
+ }
+ else if (i >= 0xc0 && i < 0xe0)
+ {
+ umap[i] = 2;
+ }
+ else if (i >= 0xe0 && i < 0xf0)
+ {
+ umap[i] = 3;
+ }
+ else if (i >= 0xf0 && i < 0xf8)
+ {
+ umap[i] = 4;
+ }
+ else if (i >= 0xf8 && i < 0xfc)
+ {
+ umap[i] = 5;
+ }
+ else if (i >= 0xfc && i < 0xfe)
+ {
+ umap[i] = 6;
+ }
+ else
+ {
+ umap[i] = 0;
+ }
+ }
+
+ umap_init_flag = 1;
+ }
+
+ uint8_t *s = (uint8_t *)(*src);
+ int r_illegal = 0;
+
+ while (umap[*s] == 0)
+ {
+ ++s;
+ ++r_illegal;
+ }
+
+ uint8_t *t;
+ int byte_num;
+ uint32_t uc;
+ int i;
+
+ repeat_label:
+ t = s;
+ byte_num = umap[*s];
+ uc = *s++ & (0xff >> byte_num);
+
+ for (i = 1; i < byte_num; ++i)
+ {
+ if (umap[*s])
+ {
+ r_illegal += s - t;
+ goto repeat_label;
+ }
+ else
+ {
+ uc = (uc << 6) + (*s & 0x3f);
+ s += 1;
+ }
+ }
+
+ *src = (char *)s;
+ if (illegal)
+ {
+ *illegal = r_illegal;
+ }
+
+ return uc;
+ }
+
+ size_t u8decode(char const *str, ucs4_t *des, size_t n, int *illegal)
+ {
+ if (n == 0)
+ return 0;
+
+ char *s = (char *)str;
+ size_t i = 0;
+ ucs4_t uc = 0;
+ int r_illegal_all = 0, r_illegal;
+
+ while ((uc = getu8c(&s, &r_illegal)))
+ {
+ if (i < (n - 1))
+ {
+ des[i++] = uc;
+ r_illegal_all += r_illegal;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ des[i] = 0;
+ if (illegal)
+ {
+ *illegal = r_illegal_all + r_illegal;
+ }
+
+ return i;
+ }
+
+# define IF_CAN_HOLD(left, n) do { \
+ size_t m = (size_t)(n); \
+ if ((size_t)(left) < (m + 1)) return -2; \
+ (left) -= m; \
+} while (0)
+
+ int putu8c(ucs4_t uc, char **des, size_t *left)
+ {
+ if (uc < 0)
+ return -1;
+
+ if (uc < (0x1 << 7))
+ {
+ IF_CAN_HOLD(*left, 1);
+
+ **des = (char)uc;
+ *des += 1;
+ **des = 0;
+
+ return 1;
+ }
+
+ int byte_num;
+
+ if (uc < (0x1 << 11))
+ {
+ byte_num = 2;
+ }
+ else if (uc < (0x1 << 16))
+ {
+ byte_num = 3;
+ }
+ else if (uc < (0x1 << 21))
+ {
+ byte_num = 4;
+ }
+ else if (uc < (0x1 << 26))
+ {
+ byte_num = 5;
+ }
+ else
+ {
+ byte_num = 6;
+ }
+
+ IF_CAN_HOLD(*left, byte_num);
+
+ int i;
+ for (i = byte_num - 1; i > 0; --i)
+ {
+ *(uint8_t *)(*des + i) = (uc & 0x3f) | 0x80;
+ uc >>= 6;
+ }
+
+ *(uint8_t *)(*des) = uc | (0xff << (8 - byte_num));
+
+ *des += byte_num;
+ **des = 0;
+
+ return byte_num;
+ }
+
+ size_t u8encode(ucs4_t *us, char *des, size_t n, int *illegal)
+ {
+ if (n == 0)
+ return 0;
+
+ char *s = des;
+ size_t left = n;
+ size_t len = 0;
+ int r_illegal = 0;
+
+ *s = 0;
+ while (*us)
+ {
+ int ret = putu8c(*us, &s, &left);
+ if (ret > 0)
+ {
+ len += ret;
+ }
+ else if (ret == -1)
+ {
+ r_illegal += 1;
+ }
+ else
+ {
+ break;
+ }
+
+ ++us;
+ }
+
+ if (illegal)
+ {
+ *illegal = r_illegal;
+ }
+
+ return len;
+ }
+
+ /* 鍏ㄨ瀛楃 */
+ int isufullwidth(ucs4_t uc)
+ {
+ if (uc == 0x3000)
+ return 1;
+
+ if (uc >= 0xff01 && uc <= 0xff5e)
+ return 1;
+
+ return 0;
+ }
+
+ /* 鍏ㄨ瀛楁瘝 */
+ int isufullwidthalpha(ucs4_t uc)
+ {
+ if (uc >= 0xff21 && uc <= 0xff3a)
+ return 1;
+
+ if (uc >= 0xff41 && uc <= 0xff5a)
+ return 2;
+
+ return 0;
+ }
+
+ /* 鍏ㄨ鏁板瓧 */
+ int isufullwidthdigit(ucs4_t uc)
+ {
+ if (uc >= 0xff10 && uc <= 0xff19)
+ return 1;
+
+ return 0;
+ }
+
+ /* 鍏ㄨ杞崐瑙 */
+ ucs4_t ufull2half(ucs4_t uc)
+ {
+ if (uc == 0x3000)
+ return ' ';
+
+ if (uc >= 0xff01 && uc <= 0xff5e)
+ return uc - 0xfee0;
+
+ return uc;
+ }
+
+ /* 鍗婅杞叏瑙 */
+ ucs4_t uhalf2full(ucs4_t uc)
+ {
+ if (uc == ' ')
+ return 0x3000;
+
+ if (uc >= 0x21 && uc <= 0x7e)
+ return uc + 0xfee0;
+
+ return uc;
+ }
+
+ /* 涓棩闊╄秺缁熶竴琛ㄦ剰鏂囧瓧 */
+ int isuchiness(ucs4_t uc)
+ {
+ /* 鏈鍒濇湡缁熶竴姹夊瓧 */
+ if (uc >= 0x4e00 && uc <= 0x9fcc)
+ return 1;
+
+ /* 鎵╁睍 A 鍖 */
+ if (uc >= 0x3400 && uc <= 0x4db5)
+ return 2;
+
+ /* 鎵╁睍 B 鍖 */
+ if (uc >= 0x20000 && uc <= 0x2a6d6)
+ return 3;
+
+ /* 鎵╁睍 C 鍖 */
+ if (uc >= 0x2a700 && uc <= 0x2b734)
+ return 4;
+
+ /* 鎵╁睍 D 鍖 */
+ if (uc >= 0x2b740 && uc <= 0x2b81f)
+ return 5;
+
+ /* 鎵╁睍 E 鍖 */
+ if (uc >= 0x2b820 && uc <= 0x2f7ff)
+ return 6;
+
+ /* 鍙版咕鍏煎姹夊瓧 */
+ if (uc >= 0x2f800 && uc <= 0x2fa1d)
+ return 7;
+
+ /* 鍖楁湞椴滃吋瀹规眽瀛 */
+ if (uc >= 0xfa70 && uc <= 0xfad9)
+ return 8;
+
+ /* 鍏煎姹夊瓧 */
+ if (uc >= 0xf900 && uc <= 0xfa2d)
+ return 9;
+
+ /* 鍏煎姹夊瓧 */
+ if (uc >= 0xfa30 && uc <= 0xfa6d)
+ return 10;
+
+ return 0;
+ }
+
+ /* 涓枃鏍囩偣 */
+ int isuzhpunct(ucs4_t uc)
+ {
+ if (uc >= 0x3001 && uc <= 0x3002)
+ return 1;
+
+ if (uc >= 0x3008 && uc <= 0x300f)
+ return 1;
+
+ if (uc >= 0xff01 && uc <= 0xff0f)
+ return 1;
+
+ if (uc >= 0xff1a && uc <= 0xff20)
+ return 1;
+
+ if (uc >= 0xff3b && uc <= 0xff40)
+ return 1;
+
+ if (uc >= 0xff5b && uc <= 0xff5e)
+ return 1;
+
+ if (uc >= 0x2012 && uc <= 0x201f)
+ return 1;
+
+ if (uc >= 0xfe41 && uc <= 0xfe44)
+ return 1;
+
+ if (uc >= 0xfe49 && uc <= 0xfe4f)
+ return 1;
+
+ if (uc >= 0x3010 && uc <= 0x3017)
+ return 1;
+
+ return 0;
+ }
+
+ /* 鏃ユ枃骞冲亣鍚 */
+ int isuhiragana(ucs4_t uc)
+ {
+ if (uc >= 0x3040 && uc <= 0x309f)
+ return 1;
+
+ return 0;
+ }
+
+ /* 鏃ユ枃鐗囧亣鍚 */
+ int isukatakana(ucs4_t uc)
+ {
+ if (uc >= 0x30a0 && uc <= 0x30ff)
+ return 1;
+
+ if (uc >= 0x31f0 && uc <= 0x31ff)
+ return 2;
+
+ return 0;
+ }
+
+ /* 闊╂枃 */
+ int isukorean(ucs4_t uc)
+ {
+ /* 闊╂枃鎷奸煶 */
+ if (uc >= 0xac00 && uc <= 0xd7af)
+ return 1;
+
+ /* 闊╂枃瀛楁瘝 */
+ if (uc >= 0x1100 && uc <= 0x11ff)
+ return 2;
+
+ /* 闊╂枃鍏煎瀛楁瘝 */
+ if (uc >= 0x3130 && uc <= 0x318f)
+ return 3;
+
+ return 0;
+ }
+
+}
diff --git a/Runtime/GUI/utf8.h b/Runtime/GUI/utf8.h
new file mode 100644
index 0000000..b561b44
--- /dev/null
+++ b/Runtime/GUI/utf8.h
@@ -0,0 +1,113 @@
+/*
+ * Description: UTF-8 瀛楃涓茬殑瑙g爜鍜岀紪鐮佸嚱鏁
+ * unicode 瀛楃澶勭悊鍑芥暟
+ * History: yang@haipo.me, 2013/05/29, create
+ *
+ * This code is in the public domain.
+ * You may use this code any way you wish, private, educational,
+ * or commercial. It's free.
+ */
+
+# pragma once
+
+# include <stdint.h>
+# include <stddef.h>
+
+namespace utf8
+{
+
+
+ /*
+ * 鏍囧噯 C 骞舵病鏈夎瀹 wchar_t 鐨勪綅鏁般備絾 GNU C Lib 淇濊瘉 wchar_t 鏄 32 浣嶇殑锛
+ * 鎵浠ュ彲浠ョ敤 wchar.h 涓畾涔夌殑鍑芥暟鏉ュ儚 wchar_t 涓鏍锋搷绾 ucs4_t.
+ * http://www.gnu.org/software/libc/manual/html_node/Extended-Char-Intro.html
+ */
+ typedef int32_t ucs4_t;
+
+ /*
+ * 浠 UTF-8 缂栫爜鐨勫瓧绗︿覆 *src 涓鍙栦竴涓 unicode 瀛楃锛屽苟鏇存柊 *src 鐨勫笺
+ *
+ * 濡傛灉閬囧埌闈炴硶 UTF-8 缂栫爜锛屽垯璺宠繃闈炴硶閮ㄥ垎銆
+ * 濡傛灉 illegal 鍙傛暟涓嶄负 NULL, 鍒 *illegal 琛ㄧず闈炴硶 UTF-8 缂栫爜瀛楄妭鏁般
+ */
+ ucs4_t getu8c(char **src, int *illegal);
+
+ /*
+ * 灏 src 鎸囧悜鐨 UTF-8 缂栫爜瀛楃涓茶В鐮佷负 unicode锛屾斁鍦ㄩ暱搴︿负 n 鐨勬暟缁 des 涓紝
+ * 骞跺湪鏈熬娣诲姞 0. 濡傛灉 des 涓嶈冻浠ュ瓨鏀炬墍鏈夌殑瀛楃锛屽垯鏈澶氫繚瀛 n - 1 涓 unicode
+ * 瀛楃骞惰ˉ 0.
+ *
+ * 濡傛灉閬囧埌闈炴硶 UTF-8 缂栫爜锛屽垯璺宠繃闈炴硶閮ㄥ垎銆
+ * 濡傛灉 illegal 涓嶄负 NULL, 鍒 *illegal 琛ㄧず闈炴硶 UTF-8 缂栫爜鐨勫瓧鑺傛暟銆
+ */
+ size_t u8decode(char const *str, ucs4_t *des, size_t n, int *illegal);
+
+ /*
+ * 灏 unicode 瀛楃 uc 缂栫爜涓 UTF-8 缂栫爜锛屾斁鍒伴暱搴︿负 *left 鐨勫瓧绗︿覆 *des 涓
+ *
+ * 濡傛灉 *des 涓嶈冻浠ュ瓨鏀 uc 瀵瑰簲鐨 UTF-8 瀛楃涓诧紝杩斿洖涓涓礋鍊笺
+ * 濡傛灉鎴愬姛锛屾洿鏂 *des 鍜 *left 鐨勫笺
+ */
+ int putu8c(ucs4_t uc, char **des, size_t *left);
+
+ /*
+ * 灏嗕互 0 缁撳熬鐨 unicode 鏁扮粍 us 缂栫爜涓 UTF-8 瀛楃涓诧紝鏀惧埌闀垮害涓 n 鐨勫瓧绗︿覆 des 涓
+ *
+ * 璐熸暟涓洪潪娉曠殑 unicode 瀛楃銆
+ * 濡傛灉 illegal 涓嶄负 NULL锛屽垯 *illegal 琛ㄧず闈炴硶鐨 unicode 瀛楃鏁般
+ */
+ size_t u8encode(ucs4_t *us, char *des, size_t n, int *illegal);
+
+ /*
+ * 鍒ゆ柇鏄惁涓哄叏瑙掑瓧绗
+ */
+ int isufullwidth(ucs4_t uc);
+
+ /*
+ * 鍒ゆ柇鏄惁涓哄叏瑙掑瓧姣
+ */
+ int isufullwidthalpha(ucs4_t uc);
+
+ /*
+ * 鍒ゆ柇鏄惁涓哄叏瑙掓暟瀛
+ */
+ int isufullwidthdigit(ucs4_t uc);
+
+ /*
+ * 鍏ㄨ瀛楃杞崐瑙掑瓧绗︺
+ * 濡傛灉 uc 涓哄叏瑙掑瓧绗︼紝鍒欒繑鍥炲搴旂殑鍗婅瀛楃锛屽惁鍒欒繑鍥 uc 鏈韩銆
+ */
+ ucs4_t ufull2half(ucs4_t uc);
+
+ /*
+ * 鍗婅瀛楃杞叏瑙掑瓧绗
+ * 濡傛灉 uc 涓哄崐瑙掑瓧绗︼紝鍒欒繑鍥炲搴旂殑鍏ㄨ瀛楃锛屽惁鍒欒繑鍥 uc 鏈韩銆
+ */
+ ucs4_t uhalf2full(ucs4_t uc);
+
+ /*
+ * 鍒ゆ柇鏄惁涓烘眽瀛楀瓧绗︼紙涓棩闊╄秺缁熶竴琛ㄦ剰鏂囧瓧锛
+ */
+ int isuchiness(ucs4_t uc);
+
+ /*
+ * 鍒ゆ柇鏄惁涓轰腑鏂囨爣鐐
+ */
+ int isuzhpunct(ucs4_t uc);
+
+ /*
+ * 鍒ゆ柇鏄惁涓烘棩鏂囧钩鍋囧悕瀛楃
+ */
+ int isuhiragana(ucs4_t uc);
+
+ /*
+ * 鍒ゆ柇鏄惁涓烘棩鏂囩墖鍋囧悕瀛楃
+ */
+ int isukatakana(ucs4_t uc);
+
+ /*
+ * 鍒ゆ柇鏄惁涓洪煩鏂囧瓧绗
+ */
+ int isukorean(ucs4_t uc);
+
+}