GNU Unifont  15.1.01
Pan-Unicode font with complete Unicode Plane 0 coverage and partial coverage of higher planes
hangul.h
Go to the documentation of this file.
1 /**
2  @file hangul.h
3 
4  @brief Define constants and function prototypes for using Hangul glyphs.
5 
6  @author Paul Hardy
7 
8  @copyright Copyright © 2023 Paul Hardy
9 */
10 /*
11  LICENSE:
12 
13  This program is free software: you can redistribute it and/or modify
14  it under the terms of the GNU General Public License as published by
15  the Free Software Foundation, either version 2 of the License, or
16  (at your option) any later version.
17 
18  This program is distributed in the hope that it will be useful,
19  but WITHOUT ANY WARRANTY; without even the implied warranty of
20  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  GNU General Public License for more details.
22 
23  You should have received a copy of the GNU General Public License
24  along with this program. If not, see <http://www.gnu.org/licenses/>.
25 */
26 
27 #ifndef _HANGUL_H_
28 #define _HANGUL_H_
29 
30 #include <stdlib.h>
31 
32 
33 #define MAXLINE 256 ///< Length of maximum file input line.
34 
35 #define EXTENDED_HANGUL /* Use rare Hangul code points beyond U+1100 */
36 
37 /* Definitions to move Hangul .hex file contents into the Private Use Area. */
38 #define PUA_START 0xE000
39 #define PUA_END 0xE8FF
40 #define MAX_GLYPHS (PUA_END - PUA_START + 1) /* Maximum .hex file glyphs */
41 
42 /*
43  Unicode ranges for Hangul choseong, jungseong, and jongseong.
44 
45  U+1100..U+11FF is the main range of modern and ancient Hangul jamo.
46  U+A960..U+A97C is the range for extended Hangul choseong.
47  U+D7B0..U+D7C6 is the range for extended Hangul jungseong.
48  U+D7CB..U+D7FB is the range for extended Hangul jongseong.
49 */
50 #define CHO_UNICODE_START 0x1100 ///< Modern Hangul choseong start
51 #define CHO_UNICODE_END 0x115E ///< Hangul Jamo choseong end
52 #define CHO_EXTA_UNICODE_START 0xA960 ///< Hangul Extended-A choseong start
53 #define CHO_EXTA_UNICODE_END 0xA97C ///< Hangul Extended-A choseong end
54 
55 #define JUNG_UNICODE_START 0x1161 ///< Modern Hangul jungseong start
56 #define JUNG_UNICODE_END 0x11A7 ///< Modern Hangul jungseong end
57 #define JUNG_EXTB_UNICODE_START 0xD7B0 ///< Hangul Extended-B jungseong start
58 #define JUNG_EXTB_UNICODE_END 0xD7C6 ///< Hangul Extended-B jungseong end
59 
60 #define JONG_UNICODE_START 0x11A8 ///< Modern Hangul jongseong start
61 #define JONG_UNICODE_END 0x11FF ///< Modern Hangul jongseong end
62 #define JONG_EXTB_UNICODE_START 0xD7CB ///< Hangul Extended-B jongseong start
63 #define JONG_EXTB_UNICODE_END 0xD7FB ///< Hangul Extended-B jongseong end
64 
65 
66 /*
67  Number of modern and ancient letters in hangul-base.hex file.
68 */
69 #define NCHO_MODERN 19 ///< 19 modern Hangul Jamo choseong
70 #define NCHO_ANCIENT 76 ///< ancient Hangul Jamo choseong
71 #define NCHO_EXTA 29 ///< Hangul Extended-A choseong
72 #define NCHO_EXTA_RSRVD 3 ///< Reserved at end of Extended-A choseong
73 
74 #define NJUNG_MODERN 21 ///< 21 modern Hangul Jamo jungseong
75 #define NJUNG_ANCIENT 50 ///< ancient Hangul Jamo jungseong
76 #define NJUNG_EXTB 23 ///< Hangul Extended-B jungseong
77 #define NJUNG_EXTB_RSRVD 4 ///< Reserved at end of Extended-B junseong
78 
79 #define NJONG_MODERN 27 ///< 28 modern Hangul Jamo jongseong
80 #define NJONG_ANCIENT 61 ///< ancient Hangul Jamo jongseong
81 #define NJONG_EXTB 49 ///< Hangul Extended-B jongseong
82 #define NJONG_EXTB_RSRVD 4 ///< Reserved at end of Extended-B jonseong
83 
84 
85 /*
86  Number of variations of each component in a Johab 6/3/1 arrangement.
87 */
88 #define CHO_VARIATIONS 6 ///< 6 choseong variations
89 #define JUNG_VARIATIONS 3 ///< 3 jungseong variations
90 #define JONG_VARIATIONS 1 ///< 1 jongseong variation
91 
92 /*
93  Starting positions in the hangul-base.hex file for each component.
94 */
95 /// Location of first choseong (location 0x0000 is a blank glyph)
96 #define CHO_HEX 0x0001
97 
98 /// Location of first ancient choseong
99 #define CHO_ANCIENT_HEX (CHO_HEX + CHO_VARIATIONS * NCHO_MODERN)
100 
101 /// U+A960 Extended-A choseong
102 #define CHO_EXTA_HEX (CHO_ANCIENT_HEX + CHO_VARIATIONS * NCHO_ANCIENT)
103 
104 /// U+A97F Extended-A last location in .hex file, including reserved Unicode code points at end
105 #define CHO_LAST_HEX (CHO_EXTA_HEX + CHO_VARIATIONS * (NCHO_EXTA + NCHO_EXTA_RSRVD) - 1)
106 
107 /// Location of first jungseong (will be 0x2FB)
108 #define JUNG_HEX (CHO_LAST_HEX + 1)
109 
110 /// Location of first ancient jungseong
111 #define JUNG_ANCIENT_HEX (JUNG_HEX + JUNG_VARIATIONS * NJUNG_MODERN)
112 
113 /// U+D7B0 Extended-B jungseong
114 #define JUNG_EXTB_HEX (JUNG_ANCIENT_HEX + JUNG_VARIATIONS * NJUNG_ANCIENT)
115 
116 /// U+D7CA Extended-B last location in .hex file, including reserved Unicode code points at end
117 #define JUNG_LAST_HEX (JUNG_EXTB_HEX + JUNG_VARIATIONS * (NJUNG_EXTB + NJUNG_EXTB_RSRVD) - 1)
118 
119 /// Location of first jongseong (will be 0x421)
120 #define JONG_HEX (JUNG_LAST_HEX + 1)
121 
122 /// Location of first ancient jongseong
123 #define JONG_ANCIENT_HEX (JONG_HEX + JONG_VARIATIONS * NJONG_MODERN)
124 
125 /// U+D7CB Extended-B jongseong
126 #define JONG_EXTB_HEX (JONG_ANCIENT_HEX + JONG_VARIATIONS * NJONG_ANCIENT)
127 
128 /// U+D7FF Extended-B last location in .hex file, including reserved Unicode code points at end
129 #define JONG_LAST_HEX (JONG_EXTB_HEX + JONG_VARIATIONS * (NJONG_EXTB + NJONG_EXTB_RSRVD) - 1)
130 
131 /* Common modern and ancient Hangul Jamo range */
132 #define JAMO_HEX 0x0500 ///< Start of U+1100..U+11FF glyphs
133 #define JAMO_END 0x05FF ///< End of U+1100..U+11FF glyphs
134 
135 /* Hangul Jamo Extended-A range */
136 #define JAMO_EXTA_HEX 0x0600 ///< Start of U+A960..U+A97F glyphs
137 #define JAMO_EXTA_END 0x061F ///< End of U+A960..U+A97F glyphs
138 
139 /* Hangul Jamo Extended-B range */
140 #define JAMO_EXTB_HEX 0x0620 ///< Start of U+D7B0..U+D7FF glyphs
141 #define JAMO_EXTB_END 0x066F ///< End of U+D7B0..U+D7FF glyphs
142 
143 /*
144  These values allow enumeration of all modern and ancient letters.
145 
146  If RARE_HANGUL is defined, include Hangul code points above U+11FF.
147 */
148 #ifdef EXTENDED_HANGUL
149 
150 #define TOTAL_CHO (NCHO_MODERN + NCHO_ANCIENT + NCHO_EXTA )
151 #define TOTAL_JUNG (NJUNG_MODERN + NJUNG_ANCIENT + NJUNG_EXTB)
152 #define TOTAL_JONG (NJONG_MODERN + NJONG_ANCIENT + NJONG_EXTB)
153 
154 #else
155 
156 #define TOTAL_CHO (NCHO_MODERN + NCHO_ANCIENT )
157 #define TOTAL_JUNG (NJUNG_MODERN + NJUNG_ANCIENT)
158 #define TOTAL_JONG (NJONG_MODERN + NJONG_ANCIENT)
159 
160 #endif
161 
162 
163 /*
164  Function Prototypes.
165 */
166 
167 unsigned hangul_read_base8 (FILE *infp, unsigned char base[][32]);
168 unsigned hangul_read_base16 (FILE *infp, unsigned base[][16]);
169 
170 void hangul_decompose (unsigned codept,
171  int *initial, int *medial, int *final);
172 unsigned hangul_compose (int initial, int medial, int final);
173 
174 void hangul_hex_indices (int choseong, int jungseong, int jongseong,
175  int *cho_index, int *jung_index, int *jong_index);
176 void hangul_variations (int choseong, int jungseong, int jongseong,
177  int *cho_var, int *jung_var, int *jong_var);
178 int is_wide_vowel (int vowel);
179 int cho_variation (int choseong, int jungseong, int jongseong);
180 int jung_variation (int choseong, int jungseong, int jongseong);
181 int jong_variation (int choseong, int jungseong, int jongseong);
182 
183 void hangul_syllable (int choseong, int jungseong, int jongseong,
184  unsigned char hangul_base[][32], unsigned char *syllable);
185 int glyph_overlap (unsigned *glyph1, unsigned *glyph2);
186 void combine_glyphs (unsigned *glyph1, unsigned *glyph2,
187  unsigned *combined_glyph);
188 void one_jamo (unsigned glyph_table [MAX_GLYPHS][16],
189  unsigned jamo, unsigned *jamo_glyph);
190 void combined_jamo (unsigned glyph_table [MAX_GLYPHS][16],
191  unsigned cho, unsigned jung, unsigned jong,
192  unsigned *combined_glyph);
193 void print_glyph_txt (FILE *fp, unsigned codept, unsigned *this_glyph);
194 void print_glyph_hex (FILE *fp, unsigned codept, unsigned *this_glyph);
195 
196 
197 #endif
void print_glyph_hex(FILE *fp, unsigned codept, unsigned *this_glyph)
Print one glyph in Unifont hexdraw hexadecimal string style.
void one_jamo(unsigned glyph_table[MAX_GLYPHS][16], unsigned jamo, unsigned *jamo_glyph)
Convert Hangul Jamo choseong, jungseong, and jongseong into a glyph.
void combined_jamo(unsigned glyph_table[MAX_GLYPHS][16], unsigned cho, unsigned jung, unsigned jong, unsigned *combined_glyph)
Convert Hangul Jamo choseong, jungseong, and jongseong into a glyph.
void print_glyph_txt(FILE *fp, unsigned codept, unsigned *this_glyph)
Print one glyph in Unifont hexdraw plain text style.
unsigned hangul_read_base8(FILE *infp, unsigned char base[][32])
Read hangul-base.hex file into a unsigned char array.
int is_wide_vowel(int vowel)
Whether vowel has rightmost vertical stroke to the right.
void hangul_hex_indices(int choseong, int jungseong, int jongseong, int *cho_index, int *jung_index, int *jong_index)
Determine index values to the bitmaps for a syllable's components.
void hangul_decompose(unsigned codept, int *initial, int *medial, int *final)
Decompose a Hangul Syllables code point into three letters.
int glyph_overlap(unsigned *glyph1, unsigned *glyph2)
See if two glyphs overlap.
void hangul_variations(int choseong, int jungseong, int jongseong, int *cho_var, int *jung_var, int *jong_var)
Determine the variations of each letter in a Hangul syllable.
void combine_glyphs(unsigned *glyph1, unsigned *glyph2, unsigned *combined_glyph)
Combine two glyphs into one glyph.
int jong_variation(int choseong, int jungseong, int jongseong)
Return the Johab 6/3/1 jongseong variation.
int cho_variation(int choseong, int jungseong, int jongseong)
Return the Johab 6/3/1 choseong variation for a syllable.
int jung_variation(int choseong, int jungseong, int jongseong)
Return the Johab 6/3/1 jungseong variation.
void hangul_syllable(int choseong, int jungseong, int jongseong, unsigned char hangul_base[][32], unsigned char *syllable)
Given letters in a Hangul syllable, return a glyph.
unsigned hangul_compose(int initial, int medial, int final)
Compose a Hangul syllable into a code point, or 0 if none exists.
unsigned hangul_read_base16(FILE *infp, unsigned base[][16])
Read hangul-base.hex file into a unsigned array.
#define MAX_GLYPHS
An OpenType font has at most 65536 glyphs.
Definition: hex2otf.c:85