Przeglądaj źródła

example unicode font

A review of the code is required.  Since I'm not sure what's written correctly at all.
Gunko Vadim 5 miesięcy temu
rodzic
commit
5d7e8010a5

BIN
examples/text/resources/NotoSansTC-Regular.ttf


+ 183 - 0
examples/text/text_unicode_font_example.c

@@ -0,0 +1,183 @@
+#include <stdlib.h>
+#include <string.h>
+#include <raylib.h>
+
+#define SCREEN_WIDTH  800
+#define SCREEN_HEIGHT 450
+
+Font LoadUnicodeFont(const char* fileName, int fontSize, int textureFilter)
+{
+    int* cp = NULL;         // Array to store Unicode codepoints
+    int capacity = 65536;   // Initial capacity
+    int count = 0;          // Counter for codepoints
+    
+    // Allocate initial array
+    cp = (int*)malloc(capacity * sizeof(int));
+    if (!cp) return GetFontDefault();
+    
+    // Helper function to add a range of Unicode codepoints
+    void AddRange(int start, int stop)
+    {
+        while (start <= stop)
+        {
+            // Expand array if needed
+            if (count >= capacity)
+            {
+                capacity += 1024;
+                int* newCp = (int*)realloc(cp, capacity * sizeof(int));
+                if (!newCp)
+                {
+                    free(cp);
+                    return GetFontDefault();
+                }
+                cp = newCp;
+            }
+            
+            // Add current codepoint and increment
+            cp[count] = start;
+            count++;
+            start++;
+        }
+    }
+    
+    // --------------------------------------------------
+    // 1. BASIC ASCII CHARACTERS
+    // --------------------------------------------------
+    AddRange(32, 126);  // Basic Latin (letters, digits, punctuation)
+    
+    // --------------------------------------------------
+    // 2. EUROPEAN LANGUAGES (LATIN SCRIPT)
+    // --------------------------------------------------
+    AddRange(0xC0, 0x17F);  // Latin-1 Supplement + Latin Extended-A
+    AddRange(0x180, 0x24F); // Latin Extended-B
+    AddRange(0x1E00, 0x1EFF); // Latin Extended Additional
+    AddRange(0x2C60, 0x2C7F); // Latin Extended-C
+    
+    // --------------------------------------------------
+    // 3. GREEK AND COPTIC
+    // --------------------------------------------------
+    AddRange(0x370, 0x3FF); // Greek and Coptic
+    AddRange(0x1F00, 0x1FFF); // Greek Extended
+    
+    // --------------------------------------------------
+    // 4. CYRILLIC SCRIPTS
+    // --------------------------------------------------
+    AddRange(0x400, 0x4FF); // Basic Cyrillic
+    AddRange(0x500, 0x52F); // Cyrillic Supplement
+    AddRange(0x2DE0, 0x2DFF); // Cyrillic Extended-A
+    AddRange(0xA640, 0xA69F); // Cyrillic Extended-B
+    
+    // --------------------------------------------------
+    // 5. CJK LANGUAGES (CHINESE, JAPANESE, KOREAN)
+    // --------------------------------------------------
+    AddRange(0x4E00, 0x9FFF); // CJK Unified Ideographs
+    AddRange(0x3400, 0x4DBF); // CJK Extension A
+    AddRange(0x3000, 0x303F); // CJK Symbols and Punctuation
+    AddRange(0x3040, 0x309F); // Hiragana (Japanese)
+    AddRange(0x30A0, 0x30FF); // Katakana (Japanese)
+    AddRange(0x31F0, 0x31FF); // Katakana Phonetic Extensions
+    AddRange(0xFF00, 0xFFEF); // Halfwidth and Fullwidth Forms
+    AddRange(0xAC00, 0xD7AF); // Hangul Syllables (Korean)
+    AddRange(0x1100, 0x11FF); // Hangul Jamo
+    
+    // --------------------------------------------------
+    // 6. SOUTHEAST ASIAN LANGUAGES
+    // --------------------------------------------------
+    AddRange(0x0E00, 0x0E7F); // Thai
+    AddRange(0x0E80, 0x0EFF); // Lao
+    AddRange(0x1780, 0x17FF); // Khmer
+    AddRange(0x1000, 0x109F); // Myanmar
+    AddRange(0x1980, 0x19DF); // New Tai Lue
+    
+    // --------------------------------------------------
+    // 7. INDIAN SUBCONTINENT LANGUAGES
+    // --------------------------------------------------
+    AddRange(0x900, 0x97F);  // Devanagari (Hindi, Sanskrit)
+    AddRange(0x980, 0x9FF);  // Bengali
+    AddRange(0xA00, 0xA7F);  // Gurmukhi (Punjabi)
+    AddRange(0xA80, 0xAFF);  // Gujarati
+    AddRange(0xB00, 0xB7F);  // Oriya
+    AddRange(0xB80, 0xBFF);  // Tamil
+    AddRange(0xC00, 0xC7F);  // Telugu
+    AddRange(0xC80, 0xCFF);  // Kannada
+    AddRange(0xD00, 0xD7F);  // Malayalam
+    AddRange(0xD80, 0xDFF);  // Sinhala
+    
+    // --------------------------------------------------
+    // 8. MIDDLE EASTERN LANGUAGES
+    // --------------------------------------------------
+    AddRange(0x600, 0x6FF);  // Arabic
+    AddRange(0x750, 0x77F);  // Arabic Supplement
+    AddRange(0x8A0, 0x8FF);  // Arabic Extended-A
+    AddRange(0xFB50, 0xFDFF); // Arabic Presentation Forms-A
+    AddRange(0x5D0, 0x5EA);  // Hebrew
+    AddRange(0x591, 0x5C7);  // Hebrew Extended
+    AddRange(0x7C0, 0x7FF);  // N'Ko
+    AddRange(0x640, 0x6FF);  // Syriac
+    
+    // --------------------------------------------------
+    // 9. AFRICAN LANGUAGES
+    // --------------------------------------------------
+    AddRange(0x2C80, 0x2CFF); // Coptic
+    AddRange(0x2D30, 0x2D7F); // Tifinagh
+    AddRange(0xA6A0, 0xA6FF); // Bamum
+    AddRange(0xAB00, 0xAB2F); // Ethiopic Extended
+    
+    // --------------------------------------------------
+    // 10. SPECIAL CHARACTERS AND SYMBOLS
+    // --------------------------------------------------
+    AddRange(0x300, 0x36F);  // Combining Diacritical Marks
+    AddRange(0x1DC0, 0x1DFF); // Combining Diacritical Marks Supplement
+    AddRange(0x2000, 0x206F); // General Punctuation
+    AddRange(0x20A0, 0x20CF); // Currency Symbols
+    AddRange(0x2100, 0x214F); // Letterlike Symbols
+    AddRange(0x2190, 0x21FF); // Arrows
+    AddRange(0x2200, 0x22FF); // Mathematical Operators
+
+    
+    Font result = {0};
+    
+    if (FileExists(fileName))
+        result = LoadFontEx(fileName, fontSize, cp, count);
+    
+    if (result.texture.id == 0)
+        result = GetFontDefault();
+    
+    SetTextureFilter(result.texture, textureFilter);
+    free(cp);
+    return result;
+}
+
+int main(void)
+{
+    // Initialization
+    InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Unicode Font Example");
+    SetTargetFPS(60);
+
+    // Load font with Unicode support
+    Font myFont = LoadUnicodeFont("resources/NotoSansTC-Regular.ttf", 36, TEXTURE_FILTER_BILINEAR);
+
+    // Main game loop
+    while (!WindowShouldClose())
+    {
+        BeginDrawing();
+            ClearBackground(RAYWHITE);
+            
+            // Draw text
+            DrawTextEx(myFont, "English: Hello World!", (Vector2){50, 50}, 36, 1, DARKGRAY);
+            DrawTextEx(myFont, "Русский: Привет мир!", (Vector2){50, 100}, 36, 0, DARKGRAY);
+            DrawTextEx(myFont, "中文: 你好世界!", (Vector2){50, 150}, 36, 1, DARKGRAY);
+            DrawTextEx(myFont, "日本語: こんにちは世界!", (Vector2){50, 200}, 36, 1, DARKGRAY);
+
+           
+            DrawText("Font: Noto Sans TC Thin. © 2014-2020 Adobe(http://www.adobe.com/). License: SIL Open Font License 1.1", 10, SCREEN_HEIGHT - 20, 10, GRAY);
+
+        EndDrawing();
+    }
+
+    // Cleanup
+    UnloadFont(myFont);
+    CloseWindow();
+
+    return 0;
+}