diff options
-rw-r--r-- | libjin/Graphics/Font.h | 12 | ||||
-rw-r--r-- | libjin/Graphics/TexFont.h | 18 | ||||
-rw-r--r-- | libjin/Graphics/Unicode.cpp | 27 | ||||
-rw-r--r-- | libjin/Graphics/Unicode.h | 43 |
4 files changed, 73 insertions, 27 deletions
diff --git a/libjin/Graphics/Font.h b/libjin/Graphics/Font.h index 924dbc1..6c5a1fc 100644 --- a/libjin/Graphics/Font.h +++ b/libjin/Graphics/Font.h @@ -8,10 +8,6 @@ namespace jin namespace graphics { - typedef unsigned int Codepoint; - - typedef std::vector<Codepoint> Sentence; - struct Page; class Font @@ -21,10 +17,10 @@ namespace graphics virtual ~Font() {}; virtual void print(const Page* page, int x, int y) = 0; - virtual void print(const Sentence& text, int x, int y, int lineheight, int spacing = 0) = 0; - virtual Page* typeset(const Sentence& text, int lineheight, int spacing = 0) = 0; - virtual void print(Unicode::Iterator& itor, int x, int y, int lineheight, int spacing = 0) = 0; - virtual Page* typeset(Unicode::Iterator& itor, int lineheight, int spacing = 0) = 0; + virtual void print(const unicode::Sentence& text, int x, int y, int lineheight, int spacing = 0) = 0; + virtual Page* typeset(const unicode::Sentence& text, int lineheight, int spacing = 0) = 0; + virtual void print(unicode::Iterator& itor, int x, int y, int lineheight, int spacing = 0) = 0; + virtual Page* typeset(unicode::Iterator& itor, int lineheight, int spacing = 0) = 0; }; diff --git a/libjin/Graphics/TexFont.h b/libjin/Graphics/TexFont.h index 6639636..8cc79f5 100644 --- a/libjin/Graphics/TexFont.h +++ b/libjin/Graphics/TexFont.h @@ -20,25 +20,25 @@ namespace graphics { public: /* create texture font from tilemap */ - static TexFont* createTexFont(const Bitmap* bitmap, const Sentence& codepoints, int cellw, int cellh, const math::Vector4<int>& spacing = math::Vector4<int>()); + static TexFont* createTexFont(const Bitmap* bitmap, const unicode::Sentence& codepoints, int cellw, int cellh, const math::Vector4<int>& spacing = math::Vector4<int>()); /* create texture font from seperated glyphs */ - static TexFont* createTexFont(const Bitmap* bitmap, const Sentence& codepoints, Color mask, int cellh, const math::Vector4<int>& spacing = math::Vector4<int>()); + static TexFont* createTexFont(const Bitmap* bitmap, const unicode::Sentence& codepoints, Color mask, int cellh, const math::Vector4<int>& spacing = math::Vector4<int>()); ~TexFont(); - Page* typeset(const Sentence& text, int lineheight, int spacing = 0) override ; + Page* typeset(const unicode::Sentence& text, int lineheight, int spacing = 0) override ; void print(const Page* page, int x, int y) override; - void print(const Sentence& text, int x, int y, int linehgiht, int spacing = 0) override; - void print(Unicode::Iterator& itor, int x, int y, int lineheight, int spacing = 0) override; - Page* typeset(Unicode::Iterator& itor, int lineheight, int spacing = 0) override; + void print(const unicode::Sentence& text, int x, int y, int linehgiht, int spacing = 0) override; + void print(unicode::Iterator& itor, int x, int y, int lineheight, int spacing = 0) override; + Page* typeset(unicode::Iterator& itor, int lineheight, int spacing = 0) override; private: struct TexGlyph { unsigned short x, y, w, h;}; - TexFont(const Bitmap* bitmap, const Sentence& codepoints, int cellw, int cellh, const math::Vector4<int>& spacing); - TexFont(const Bitmap* bitmap, const Sentence& codepoints, Color mask, int cellh, const math::Vector4<int>& spacing); + TexFont(const Bitmap* bitmap, const unicode::Sentence& codepoints, int cellw, int cellh, const math::Vector4<int>& spacing); + TexFont(const Bitmap* bitmap, const unicode::Sentence& codepoints, Color mask, int cellh, const math::Vector4<int>& spacing); - std::map<Codepoint, TexGlyph> glyphs; + std::map<unicode::Codepoint, TexGlyph> glyphs; }; diff --git a/libjin/Graphics/Unicode.cpp b/libjin/Graphics/Unicode.cpp index 08fdcd0..8c2b77d 100644 --- a/libjin/Graphics/Unicode.cpp +++ b/libjin/Graphics/Unicode.cpp @@ -6,9 +6,21 @@ namespace jin { namespace graphics { +namespace unicode +{ /* utf8 byte string to unicode codepoint */ static const char *utf8toCodepoint(const char *p, unsigned *res) { + + } + + ///////////////////////////////////////////////////////////////////////////// + // decoders + ///////////////////////////////////////////////////////////////////////////// + + const void* Utf8::decode(const void* data, unsigned int length, Codepoint* res) + { + const char* p = (char*)data; unsigned x, mask, shift; switch (*p & 0xf0) { case 0xf0: mask = 0x07; shift = 18; break; @@ -32,10 +44,19 @@ namespace graphics return p + 1; } - Codepoint Unicode::Iterator::operator*() - { + const void* Utf16::decode(const void* data, unsigned int length, Codepoint* res) + { + } + + ///////////////////////////////////////////////////////////////////////////// + // iterator + ///////////////////////////////////////////////////////////////////////////// - } + Codepoint unicode::Iterator::operator*() + { + } + +} } }
\ No newline at end of file diff --git a/libjin/Graphics/Unicode.h b/libjin/Graphics/Unicode.h index fcf17f8..ba4adf0 100644 --- a/libjin/Graphics/Unicode.h +++ b/libjin/Graphics/Unicode.h @@ -12,17 +12,45 @@ namespace unicode typedef unsigned int Codepoint; + typedef std::vector<Codepoint> Sentence; + enum Encode { - UCS16, // unicode 16bits + UCS16, // unicode 16bits + UCS32, // unicode 32bits UTF8, // utf-8 - UTF16 // utf-16 + UTF16, // utf-16 + ASCII, // ASCII }; + class Decoder + { + public: + virtual const void* decode(const void* data, unsigned int length, Codepoint* c) = 0; + }; + + class Utf8 : public Decoder + { + public: + const void* decode(const void* data, unsigned int length, Codepoint* c) override; + }; + + class Utf16 : public Decoder + { + public: + const void* decode(const void* data, unsigned int length, Codepoint* c) override; + }; + + class Ucs16 : public Decoder + { + public: + const void* decode(const void* data, unsigned int length, Codepoint* c) override; + }; + class Iterator { public: - Iterator(Encode encode, const char* data); + Iterator(Encode encode, const void* data, unsigned int length); ~Iterator(); Codepoint get(); @@ -35,13 +63,14 @@ namespace unicode void operator = (const Iterator& itor); private: - const char* _data; // weak pointer - unsigned int _len; - const char* _p; + Decoder* _decoder; + const void* _data; // weak pointer + unsigned int _length; + const void* _p; }; -} +} // unicode } // graphics } // jin |