1/*
2 * Copyright 2005-2009, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _FONT_H_
6#define _FONT_H_
7
8
9#include <SupportDefs.h>
10#include <InterfaceDefs.h>
11
12
13class BPoint;
14
15
16#define B_FONT_FAMILY_LENGTH 63
17#define B_FONT_STYLE_LENGTH 63
18typedef char font_family[B_FONT_FAMILY_LENGTH + 1];
19typedef char font_style[B_FONT_STYLE_LENGTH + 1];
20
21
22// font spacing
23enum {
24	B_CHAR_SPACING			= 0,
25	B_STRING_SPACING		= 1,
26	B_BITMAP_SPACING		= 2,
27	B_FIXED_SPACING			= 3
28};
29
30
31enum font_direction {
32	B_FONT_LEFT_TO_RIGHT	= 0,
33	B_FONT_RIGHT_TO_LEFT	= 1
34};
35
36
37// font flags
38enum {
39	B_DISABLE_ANTIALIASING	= 0x00000001,
40	B_FORCE_ANTIALIASING	= 0x00000002
41};
42
43
44// truncation modes
45enum {
46	B_TRUNCATE_END			= 0,
47	B_TRUNCATE_BEGINNING	= 1,
48	B_TRUNCATE_MIDDLE		= 2,
49	B_TRUNCATE_SMART		= 3
50};
51
52
53// font encodings
54enum {
55	B_UNICODE_UTF8			= 0,
56	B_ISO_8859_1			= 1,
57	B_ISO_8859_2			= 2,
58	B_ISO_8859_3			= 3,
59	B_ISO_8859_4			= 4,
60	B_ISO_8859_5			= 5,
61	B_ISO_8859_6			= 6,
62	B_ISO_8859_7			= 7,
63	B_ISO_8859_8			= 8,
64	B_ISO_8859_9			= 9,
65	B_ISO_8859_10			= 10,
66	B_MACINTOSH_ROMAN		= 11
67};
68
69
70// flags for get_font_family() and get_font_style()
71enum {
72	B_HAS_TUNED_FONT		= 0x0001,
73	B_IS_FIXED				= 0x0002
74};
75
76
77// font face flags
78enum {
79	B_ITALIC_FACE			= 0x0001,
80	B_UNDERSCORE_FACE		= 0x0002,
81	B_NEGATIVE_FACE			= 0x0004,
82	B_OUTLINED_FACE			= 0x0008,
83	B_STRIKEOUT_FACE		= 0x0010,
84	B_BOLD_FACE				= 0x0020,
85	B_REGULAR_FACE			= 0x0040,
86	// new in Haiku:
87	B_CONDENSED_FACE		= 0x0080,
88	B_LIGHT_FACE			= 0x0100,
89	B_HEAVY_FACE			= 0x0200,
90};
91
92
93enum font_metric_mode {
94	B_SCREEN_METRIC			= 0,
95	B_PRINTING_METRIC		= 1
96};
97
98
99enum font_file_format {
100	B_TRUETYPE_WINDOWS		= 0,
101	B_POSTSCRIPT_TYPE1_WINDOWS = 1
102};
103
104
105class unicode_block {
106public:
107	inline						unicode_block();
108	inline						unicode_block(uint64 block2, uint64 block1);
109
110	inline	bool				Includes(const unicode_block& block) const;
111	inline	unicode_block		operator&(const unicode_block& block) const;
112	inline	unicode_block		operator|(const unicode_block& block) const;
113	inline	unicode_block&		operator=(const unicode_block& block);
114	inline	bool				operator==(const unicode_block& block) const;
115	inline	bool				operator!=(const unicode_block& block) const;
116
117private:
118	uint64					fData[2];
119};
120
121
122struct edge_info {
123	float	left;
124	float	right;
125};
126
127
128struct font_height {
129	float	ascent;
130	float	descent;
131	float	leading;
132};
133
134
135struct escapement_delta {
136	float	nonspace;
137	float	space;
138};
139
140
141struct font_cache_info {
142	int32    sheared_font_penalty;
143	int32    rotated_font_penalty;
144	float    oversize_threshold;
145	int32    oversize_penalty;
146	int32    cache_size;
147	float    spacing_size_threshold;
148};
149
150
151struct tuned_font_info {
152	float    size;
153	float    shear;
154	float    rotation;
155	uint32   flags;
156	uint16   face;
157};
158
159
160class BShape;
161class BString;
162class BFontPrivate;
163
164
165class BFont {
166public:
167								BFont();
168								BFont(const BFont& font);
169								BFont(const BFont* font);
170
171			status_t			SetFamilyAndStyle(const font_family family,
172									const font_style style);
173			void				SetFamilyAndStyle(uint32 code);
174			status_t			SetFamilyAndFace(const font_family family,
175									uint16 face);
176
177			void				SetSize(float size);
178			void				SetShear(float shear);
179			void				SetRotation(float rotation);
180			void				SetFalseBoldWidth(float width);
181			void				SetSpacing(uint8 spacing);
182			void				SetEncoding(uint8 encoding);
183			void				SetFace(uint16 face);
184			void				SetFlags(uint32 flags);
185
186			void				GetFamilyAndStyle(font_family* family,
187									font_style* style) const;
188			uint32				FamilyAndStyle() const;
189			float				Size() const;
190			float				Shear() const;
191			float				Rotation() const;
192			float				FalseBoldWidth() const;
193			uint8				Spacing() const;
194			uint8				Encoding() const;
195			uint16				Face() const;
196			uint32				Flags() const;
197
198			font_direction		Direction() const;
199			bool				IsFixed() const;
200			bool				IsFullAndHalfFixed() const;
201			BRect				BoundingBox() const;
202			unicode_block		Blocks() const;
203			font_file_format	FileFormat() const;
204
205			int32				CountTuned() const;
206			void				GetTunedInfo(int32 index,
207									tuned_font_info* info) const;
208
209			void				TruncateString(BString* inOut, uint32 mode,
210									float width) const;
211			void            	GetTruncatedStrings(const char* stringArray[],
212									int32 numStrings, uint32 mode, float width,
213									BString resultArray[]) const;
214			void            	GetTruncatedStrings(const char* stringArray[],
215									int32 numStrings, uint32 mode,
216									float width, char* resultArray[]) const;
217
218			float				StringWidth(const char* string) const;
219			float				StringWidth(const char* string,
220									int32 length) const;
221			void				GetStringWidths(const char* stringArray[],
222									const int32 lengthArray[],
223									int32 numStrings,
224									float widthArray[]) const;
225
226			void				GetEscapements(const char charArray[],
227									int32 numChars,
228									float escapementArray[]) const;
229			void				GetEscapements(const char charArray[],
230									int32 numChars, escapement_delta* delta,
231									float escapementArray[]) const;
232			void				GetEscapements(const char charArray[],
233									int32 numChars, escapement_delta* delta,
234									BPoint escapementArray[]) const;
235			void				GetEscapements(const char charArray[],
236									int32 numChars, escapement_delta* delta,
237									BPoint escapementArray[],
238									BPoint offsetArray[]) const;
239
240			void				GetEdges(const char charArray[],
241									int32 numBytes,
242									edge_info edgeArray[]) const;
243			void				GetHeight(font_height* height) const;
244
245			void				GetBoundingBoxesAsGlyphs(
246									const char charArray[], int32 numChars,
247									font_metric_mode mode,
248									BRect boundingBoxArray[]) const;
249			void				GetBoundingBoxesAsString(
250									const char charArray[], int32 numChars,
251									font_metric_mode mode,
252									escapement_delta* delta,
253									BRect boundingBoxArray[]) const;
254			void				GetBoundingBoxesForStrings(
255									const char* stringArray[],
256									int32 numStrings, font_metric_mode mode,
257									escapement_delta deltas[],
258									BRect boundingBoxArray[]) const;
259
260			void				GetGlyphShapes(const char charArray[],
261									int32 numChars,
262									BShape* glyphShapeArray[]) const;
263
264			void				GetHasGlyphs(const char charArray[],
265									int32 numChars,
266									bool hasArray[]) const;
267
268			BFont&				operator=(const BFont& font);
269			bool				operator==(const BFont& font) const;
270			bool				operator!=(const BFont& font) const;
271
272			void				PrintToStream() const;
273
274private:
275		friend void _init_global_fonts_();
276
277			void				_GetExtraFlags() const;
278			void				_GetBoundingBoxes(const char charArray[],
279									int32 numChars, font_metric_mode mode,
280									bool string_escapement,
281									escapement_delta* delta,
282									BRect boundingBoxArray[],
283									bool asString) const;
284
285private:
286			uint16				fFamilyID;
287			uint16				fStyleID;
288			float				fSize;
289			float				fShear;
290			float				fRotation;
291			float				fFalseBoldWidth;
292			uint8				fSpacing;
293			uint8				fEncoding;
294			uint16				fFace;
295			uint32				fFlags;
296	mutable	font_height			fHeight;
297	mutable	uint32				fExtraFlags;
298
299			uint32				_reserved[1];
300};
301
302
303// #pragma mark - BFont related declarations
304
305extern const BFont* be_plain_font;
306extern const BFont* be_bold_font;
307extern const BFont* be_fixed_font;
308
309int32 count_font_families(void);
310status_t get_font_family(int32 index, font_family* name,
311	uint32* flags = NULL);
312
313int32 count_font_styles(font_family name);
314status_t get_font_style(font_family family, int32 index, font_style* name,
315	uint32* flags = NULL);
316status_t get_font_style(font_family family, int32 index, font_style* name,
317	uint16* face, uint32* flags = NULL);
318bool update_font_families(bool checkOnly);
319
320
321
322// #pragma mark - unicode_block inlines
323
324
325unicode_block::unicode_block()
326{
327	fData[0] = fData[1] = 0LL;
328}
329
330
331unicode_block::unicode_block(uint64 block2, uint64 block1)
332{
333	fData[0] = block1;
334	fData[1] = block2;
335}
336
337
338bool
339unicode_block::Includes(const unicode_block& block) const
340{
341	return (fData[0] & block.fData[0]) == block.fData[0]
342		&& (fData[1] & block.fData[1]) == block.fData[1];
343}
344
345
346unicode_block
347unicode_block::operator&(const unicode_block& block) const
348{
349	unicode_block result;
350	result.fData[0] = fData[0] & block.fData[0];
351	result.fData[1] = fData[1] & block.fData[1];
352
353	return result;
354}
355
356
357unicode_block
358unicode_block::operator|(const unicode_block& block) const
359{
360	unicode_block result;
361	result.fData[0] = fData[0] | block.fData[0];
362	result.fData[1] = fData[1] | block.fData[1];
363
364	return result;
365}
366
367
368unicode_block&
369unicode_block::operator=(const unicode_block& block)
370{
371	fData[0] = block.fData[0];
372	fData[1] = block.fData[1];
373	return *this;
374}
375
376
377bool
378unicode_block::operator==(const unicode_block& block) const
379{
380	return fData[0] == block.fData[0] && fData[1] == block.fData[1];
381}
382
383
384bool
385unicode_block::operator!=(const unicode_block& block) const
386{
387	return fData[0] != block.fData[0] || fData[1] != block.fData[1];
388}
389
390
391#endif // _FONT_H_
392