~ubuntu-branches/ubuntu/vivid/birdfont/vivid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
/*
    Copyright (C) 2014 Johan Mattsson

    This library is free software; you can redistribute it and/or modify 
    it under the terms of the GNU Lesser General Public License as 
    published by the Free Software Foundation; either version 3 of the 
    License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful, but 
    WITHOUT ANY WARRANTY; without even the implied warranty of 
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
    Lesser General Public License for more details.
*/

namespace BirdFont {

public class UnicodeRangeBits : GLib.Object {

	List<RangeBit> bits = new List<RangeBit> ();

	public UnicodeRangeBits () {
		add_ranges ();
	}
	
	public void get_ranges (Font font, out uint32 r0, out uint32 r1, out uint32 r2, out uint32 r3) {
		uint32 indice;
		Glyph? gl;
		Glyph g;
		int bit;
		
		r0 = 0;
		r1 = 0;
		r2 = 0;
		r3 = 0;
		
		for (indice = 0; (gl = font.get_glyph_indice (indice)) != null; indice++) {		
			g = (!) gl;
			if (!g.is_unassigned ()) {
				bit = get_bit (g.get_unichar ());
				if (likely (bit >= 0)) {
					set_bit (bit, ref r0, ref r1, ref r2, ref r3);
				} else {
					warning (@"Can't find range for character $(g.get_name ()).");
				}
			}
		}
	}
	
	void set_bit (int bit, ref uint32 r0, ref uint32 r1, ref uint32 r2, ref uint32 r3) {
		const int length = 32;
		
		if (0 <= bit <= length) {
			r0 |= 1 << bit;
		} else if (length <= bit <= 2 * length) {
			r1 |= 1 << (bit - length);
		} else if (2 * length <= bit <= 3 * length) {
			r2 |= 1 << (bit - 2 * length);
		} else if (3 * length <= bit <= 122) {
			r3 |= 1 << (bit - 3 * length);
		} else if (unlikely (bit > 122)) {
			warning ("Reserved bit");
		}
	}
	
	int get_bit (unichar c) {
		foreach (RangeBit b in bits) {
			if (b.range.has_character (c)) {
				return b.bit;
			}
		}
		
		return -1;
	}
	
	void add_range (int bit, unichar start, unichar stop) {
		bits.append (new RangeBit (bit, start, stop));
	}
	
	void add_ranges () {
		add_range (0, 0x0000, 0x007F); // Basic Latin 
		add_range (1, 0x0080, 0x00FF); // Latin-1 Supplement 
		add_range (2, 0x0100, 0x017F); // Latin Extended-A 
		add_range (3, 0x0180, 0x024F); // Latin Extended-B 
		add_range (4, 0x0250, 0x02AF); // IPA Extensions 
		add_range (4, 0x1D00, 0x1D7F); // Phonetic Extensions 
		add_range (4, 0x1D80, 0x1DBF); // Phonetic Extensions Supplement 
		add_range (4, 0x02B0, 0x02FF); // Spacing Modifier Letters 
		add_range (4, 0xA700, 0xA71F); // Modifier Tone Letters 
		add_range (4, 0x0300, 0x036F); // Combining Diacritical Marks 
		add_range (4, 0x1DC0, 0x1DFF); // Combining Diacritical Marks Supplement 
		add_range (7, 0x0370, 0x03FF); // Greek and Coptic 
		add_range (8, 0x2C80, 0x2CFF); // Coptic 
		add_range (9, 0x0400, 0x04FF); // Cyrillic 
		add_range (9, 0x0500, 0x052F); // Cyrillic Supplement 
		add_range (9, 0x2DE0, 0x2DFF); // Cyrillic Extended-A 
		add_range (9, 0xA640, 0xA69F); // Cyrillic Extended-B 
		add_range (10, 0x0530, 0x058F); // Armenian 
		add_range (11, 0x0590, 0x05FF); // Hebrew 
		add_range (12, 0xA500, 0xA63F); // Vai 
		add_range (13, 0x0600, 0x06FF); // Arabic 
		add_range (13, 0x0750, 0x077F); // Arabic Supplement 
		add_range (14, 0x07C0, 0x07FF); // NKo 
		add_range (15, 0x0900, 0x097F); // Devanagari 
		add_range (16, 0x0980, 0x09FF); // Bengali 
		add_range (17, 0x0A00, 0x0A7F); // Gurmukhi 
		add_range (18, 0x0A80, 0x0AFF); // Gujarati 
		add_range (19, 0x0B00, 0x0B7F); // Oriya 
		add_range (20, 0x0B80, 0x0BFF); // Tamil 
		add_range (21, 0x0C00, 0x0C7F); // Telugu 
		add_range (22, 0x0C80, 0x0CFF); // Kannada 
		add_range (23, 0x0D00, 0x0D7F); // Malayalam 
		add_range (24, 0x0E00, 0x0E7F); // Thai 
		add_range (25, 0x0E80, 0x0EFF); // Lao 
		add_range (26, 0x10A0, 0x10FF); // Georgian 
		add_range (26, 0x2D00, 0x2D2F); // Georgian Supplement 
		add_range (27, 0x1B00, 0x1B7F); // Balinese 
		add_range (28, 0x1100, 0x11FF); // Hangul Jamo 
		add_range (29, 0x1E00, 0x1EFF); // Latin Extended Additional 
		add_range (29, 0x2C60, 0x2C7F); // Latin Extended-C 
		add_range (29, 0xA720, 0xA7FF); // Latin Extended-D 
		add_range (30, 0x1F00, 0x1FFF); // Greek Extended 
		add_range (31, 0x2000, 0x206F); // General Punctuation 
		add_range (31, 0x2E00, 0x2E7F); // Supplemental Punctuation 
		add_range (32, 0x2070, 0x209F); // Superscripts And Subscripts 
		add_range (33, 0x20A0, 0x20CF); // Currency Symbols 
		add_range (34, 0x20D0, 0x20FF); // Combining Diacritical Marks For Symbols 
		add_range (35, 0x2100, 0x214F); // Letterlike Symbols 
		add_range (36, 0x2150, 0x218F); // Number Forms 
		add_range (37, 0x2190, 0x21FF); // Arrows 
		add_range (37, 0x27F0, 0x27FF); // Supplemental Arrows-A 
		add_range (37, 0x2900, 0x297F); // Supplemental Arrows-B 
		add_range (37, 0x2B00, 0x2BFF); // Miscellaneous Symbols and Arrows 
		add_range (37, 0x2200, 0x22FF); // Mathematical Operators 
		add_range (37, 0x2A00, 0x2AFF); // Supplemental Mathematical Operators 
		add_range (37, 0x27C0, 0x27EF); // Miscellaneous Mathematical Symbols-A 
		add_range (37, 0x2980, 0x29FF); // Miscellaneous Mathematical Symbols-B 
		add_range (39, 0x2300, 0x23FF); // Miscellaneous Technical 
		add_range (40, 0x2400, 0x243F); // Control Pictures 
		add_range (41, 0x2440, 0x245F); // Optical Character Recognition 
		add_range (42, 0x2460, 0x24FF); // Enclosed Alphanumerics 
		add_range (43, 0x2500, 0x257F); // Box Drawing 
		add_range (44, 0x2580, 0x259F); // Block Elements 
		add_range (45, 0x25A0, 0x25FF); // Geometric Shapes 
		add_range (46, 0x2600, 0x26FF); // Miscellaneous Symbols 
		add_range (47, 0x2700, 0x27BF); // Dingbats 
		add_range (48, 0x3000, 0x303F); // CJK Symbols And Punctuation 
		add_range (49, 0x3040, 0x309F); // Hiragana 
		add_range (50, 0x30A0, 0x30FF); // Katakana 
		add_range (50, 0x31F0, 0x31FF); // Katakana Phonetic Extensions 
		add_range (50, 0x3100, 0x312F); // Bopomofo 
		add_range (50, 0x31A0, 0x31BF); // Bopomofo Extended 
		add_range (52, 0x3130, 0x318F); // Hangul Compatibility Jamo 
		add_range (53, 0xA840, 0xA87F); // Phags-pa 
		add_range (54, 0x3200, 0x32FF); // Enclosed CJK Letters And Months 
		add_range (55, 0x3300, 0x33FF); // CJK Compatibility 
		add_range (56, 0xAC00, 0xD7AF); // Hangul Syllables 
		add_range (57, 0xD800, 0xDFFF); // Non-Plane 0 * 
		add_range (58, 0x10900, 0x1091F); // Phoenician 
		add_range (59, 0x4E00, 0x9FFF); // CJK Unified Ideographs 
		add_range (59, 0x2E80, 0x2EFF); // CJK Radicals Supplement 
		add_range (59, 0x2F00, 0x2FDF); // Kangxi Radicals 
		add_range (59, 0x2FF0, 0x2FFF); // Ideographic Description Characters 
		add_range (59, 0x3400, 0x4DBF); // CJK Unified Ideographs Extension A 
		add_range (59, 0x20000, 0x2A6DF); // CJK Unified Ideographs Extension B 
		add_range (59, 0x3190, 0x319F); // Kanbun 
		add_range (60, 0xE000, 0xF8FF); // Private Use Area (plane 0) 
		add_range (61, 0x31C0, 0x31EF); // CJK Strokes 
		add_range (61, 0xF900, 0xFAFF); // CJK Compatibility Ideographs 
		add_range (61, 0x2F800, 0x2Fa1F); // CJK Compatibility Ideographs Supplement 
		add_range (61, 0xFB00, 0xFB4F); // Alphabetic Presentation Forms 
		add_range (63, 0xFB50, 0xFDFF); // Arabic Presentation Forms-A 
		add_range (64, 0xFE20, 0xFE2F); // Combining Half Marks 
		add_range (65, 0xFE10, 0xFE1F); // Vertical Forms 
		add_range (65, 0xFE30, 0xFE4F); // CJK Compatibility Forms 
		add_range (66, 0xFE50, 0xFE6F); // Small Form Variants 
		add_range (67, 0xFE70, 0xFEFF); // Arabic Presentation Forms-B 
		add_range (68, 0xFF00, 0xFFEF); // Halfwidth And Fullwidth Forms 
		add_range (69, 0xFFF0, 0xFFFF); // Specials 
		add_range (70, 0x0F00, 0x0FFF); // Tibetan 
		add_range (71, 0x0700, 0x074F); // Syriac 
		add_range (72, 0x0780, 0x07BF); // Thaana 
		add_range (73, 0x0D80, 0x0DFF); // Sinhala 
		add_range (74, 0x1000, 0x109F); // Myanmar 
		add_range (75, 0x1200, 0x137F); // Ethiopic 
		add_range (75, 0x1380, 0x139F); // Ethiopic Supplement 
		add_range (75, 0x2D80, 0x2DDF); // Ethiopic Extended 
		add_range (76, 0x13A0, 0x13FF); // Cherokee 
		add_range (77, 0x1400, 0x167F); // Unified Canadian Aboriginal Syllabics 
		add_range (78, 0x1680, 0x169F); // Ogham 
		add_range (79, 0x16A0, 0x16FF); // Runic 
		add_range (80, 0x1780, 0x17FF); // Khmer 
		add_range (80, 0x19E0, 0x19FF); // Khmer Symbols 
		add_range (81, 0x1800, 0x18AF); // Mongolian 
		add_range (82, 0x2800, 0x28FF); // Braille Patterns 
		add_range (83, 0xA000, 0xA48F); // Yi Syllables 
		add_range (83, 0xA490, 0xA4CF); // Yi Radicals 
		add_range (83, 0x1700, 0x171F); // Tagalog 
		add_range (83, 0x1720, 0x173F); // Hanunoo 
		add_range (83, 0x1740, 0x175F); // Buhid 
		add_range (83, 0x1760, 0x177F); // Tagbanwa 
		add_range (85, 0x10300, 0x1032F); // Old Italic 
		add_range (86, 0x10330, 0x1034F); // Gothic 
		add_range (87, 0x10400, 0x1044F); // Deseret 
		add_range (88, 0x1D000, 0x1D0FF); // Byzantine Musical Symbols 
		add_range (88, 0x1D100, 0x1D1FF); // Musical Symbols 
		add_range (88, 0x1D200, 0x1D24F); // Ancient Greek Musical Notation 
		add_range (89, 0x1D400, 0x1D7FF); // Mathematical Alphanumeric Symbols 
		add_range (90, 0xFF000, 0xFFFFD); // Private Use (plane 15) 
		add_range (90, 0x100000, 0x10FFFD); // Private Use (plane 16) 
		add_range (90, 0xFE00, 0xFE0F); // Variation Selectors 
		add_range (90, 0xE0100, 0xE01EF); // Variation Selectors Supplement 
		add_range (92, 0xE0000, 0xE007F); // Tags 
		add_range (93, 0x1900, 0x194F); // Limbu 
		add_range (94, 0x1950, 0x197F); // Tai Le 
		add_range (95, 0x1980, 0x19DF); // New Tai Lue 
		add_range (96, 0x1A00, 0x1A1F); // Buginese 
		add_range (97, 0x2C00, 0x2C5F); // Glagolitic 
		add_range (98, 0x2D30, 0x2D7F); // Tifinagh 
		add_range (99, 0x4DC0, 0x4DFF); // Yijing Hexagram Symbols 
		add_range (100, 0xA800, 0xA82F); // Syloti Nagri 
		add_range (101, 0x10000, 0x1007F); // Linear B Syllabary 
		add_range (101, 0x10080, 0x100FF); // Linear B Ideograms 
		add_range (101, 0x10100, 0x1013F); // Aegean Numbers 
		add_range (102, 0x10140, 0x1018F); // Ancient Greek Numbers 
		add_range (103, 0x10380, 0x1039F); // Ugaritic 
		add_range (104, 0x103A0, 0x103DF); // Old Persian 
		add_range (105, 0x10450, 0x1047F); // Shavian 
		add_range (106, 0x10480, 0x104AF); // Osmanya 
		add_range (107, 0x10800, 0x1083F); // Cypriot Syllabary 
		add_range (108, 0x10A00, 0x10A5F); // Kharoshthi 
		add_range (109, 0x1D300, 0x1D35F); // Tai Xuan Jing Symbols 
		add_range (110, 0x12000, 0x123FF); // Cuneiform 
		add_range (110, 0x12400, 0x1247F); // Cuneiform Numbers and Punctuation 
		add_range (111, 0x1D360, 0x1D37F); // Counting Rod Numerals 
		add_range (112, 0x1B80, 0x1BBF); // Sundanese 
		add_range (113, 0x1C00, 0x1C4F); // Lepcha 
		add_range (114, 0x1C50, 0x1C7F); // Ol Chiki 
		add_range (115, 0xA880, 0xA8DF); // Saurashtra 
		add_range (116, 0xA900, 0xA92F); // Kayah Li 
		add_range (117, 0xA930, 0xA95F); // Rejang 
		add_range (118, 0xAA00, 0xAA5F); // Cham 
		add_range (119, 0x10190, 0x101CF); // Ancient Symbols 
		add_range (120, 0x101D0, 0x101FF); // Phaistos Disc 
		add_range (121, 0x102A0, 0x102DF); // Carian 
		add_range (121, 0x10280, 0x1029F); // Lycian 
		add_range (121, 0x10920, 0x1093F); // Lydian 
		add_range (122, 0x1F030, 0x1F09F); // Domino Tiles 
		add_range (122, 0x1F000, 0x1F02F); // Mahjong Tiles 
	}
	
	private class RangeBit: GLib.Object {
		public int32 bit = 0;
		public UniRange range;
		
		public RangeBit (int bit, unichar start, unichar stop) {
			this.range = new UniRange (start, stop);
		}
	}
}

}