xref: /haiku/src/servers/app/font/FontStyle.h (revision 372b901dfeada686207d00bbcce456f748bbda12)
1 /*
2  * Copyright 2001-2008, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		DarkWyrm <bpmagic@columbus.rr.com>
7  *		Axel Dörfler, axeld@pinc-software.de
8  */
9 #ifndef FONT_STYLE_H_
10 #define FONT_STYLE_H_
11 
12 
13 #include <Font.h>
14 #include <Locker.h>
15 #include <Node.h>
16 #include <ObjectList.h>
17 #include <Path.h>
18 #include <Rect.h>
19 #include <Referenceable.h>
20 #include <String.h>
21 
22 #include <ft2build.h>
23 #include FT_FREETYPE_H
24 
25 
26 struct node_ref;
27 class FontFamily;
28 class ServerFont;
29 
30 
31 /*!
32 	\class FontStyle FontStyle.h
33 	\brief Object used to represent a font style
34 
35 	FontStyle objects help abstract a lot of the font engine details while
36 	still offering plenty of information the style in question.
37 */
38 class FontStyle : public BReferenceable {
39 	public:
40 						FontStyle(node_ref& nodeRef, const char* path,
41 							FT_Face face);
42 		virtual			~FontStyle();
43 
44 		const node_ref& NodeRef() const { return fNodeRef; }
45 
46 		bool			Lock();
47 		void			Unlock();
48 
49 /*!
50 	\fn bool FontStyle::IsFixedWidth(void)
51 	\brief Determines whether the font's character width is fixed
52 	\return true if fixed, false if not
53 */
54 		bool			IsFixedWidth() const
55 							{ return FT_IS_FIXED_WIDTH(fFreeTypeFace); }
56 
57 
58 /*	\fn bool FontStyle::IsFullAndHalfFixed()
59 	\brief Determines whether the font has 2 different, fixed, widths.
60 	\return false (for now)
61 */
62 		bool			IsFullAndHalfFixed() const
63 							{ return fFullAndHalfFixed; };
64 
65 /*!
66 	\fn bool FontStyle::IsScalable(void)
67 	\brief Determines whether the font can be scaled to any size
68 	\return true if scalable, false if not
69 */
70 		bool			IsScalable() const
71 							{ return FT_IS_SCALABLE(fFreeTypeFace); }
72 /*!
73 	\fn bool FontStyle::HasKerning(void)
74 	\brief Determines whether the font has kerning information
75 	\return true if kerning info is available, false if not
76 */
77 		bool			HasKerning() const
78 							{ return FT_HAS_KERNING(fFreeTypeFace); }
79 /*!
80 	\fn bool FontStyle::HasTuned(void)
81 	\brief Determines whether the font contains strikes
82 	\return true if it has strikes included, false if not
83 */
84 		bool			HasTuned() const
85 							{ return FT_HAS_FIXED_SIZES(fFreeTypeFace); }
86 /*!
87 	\fn bool FontStyle::TunedCount(void)
88 	\brief Returns the number of strikes the style contains
89 	\return The number of strikes the style contains
90 */
91 		int32			TunedCount() const
92 							{ return fFreeTypeFace->num_fixed_sizes; }
93 /*!
94 	\fn bool FontStyle::GlyphCount(void)
95 	\brief Returns the number of glyphs in the style
96 	\return The number of glyphs the style contains
97 */
98 		uint16			GlyphCount() const
99 							{ return fFreeTypeFace->num_glyphs; }
100 /*!
101 	\fn bool FontStyle::CharMapCount(void)
102 	\brief Returns the number of character maps the style contains
103 	\return The number of character maps the style contains
104 */
105 		uint16			CharMapCount() const
106 							{ return fFreeTypeFace->num_charmaps; }
107 
108 		const char*		Name() const
109 							{ return fName.String(); }
110 		FontFamily*		Family() const
111 							{ return fFamily; }
112 		uint16			ID() const
113 							{ return fID; }
114 		uint32			Flags() const;
115 
116 		uint16			Face() const
117 							{ return fFace; }
118 		uint16			PreservedFace(uint16) const;
119 
120 		const char*		Path() const;
121 		void			UpdatePath(const node_ref& parentNodeRef);
122 
123 		void			GetHeight(float size, font_height &heigth) const;
124 		font_direction	Direction() const
125 							{ return B_FONT_LEFT_TO_RIGHT; }
126 		font_file_format FileFormat() const
127 							{ return B_TRUETYPE_WINDOWS; }
128 
129 		FT_Face			FreeTypeFace() const
130 							{ return fFreeTypeFace; }
131 
132 		status_t		UpdateFace(FT_Face face);
133 
134 	private:
135 		friend class FontFamily;
136 		uint16			_TranslateStyleToFace(const char *name) const;
137 		void			_SetFontFamily(FontFamily* family, uint16 id);
138 
139 	private:
140 		FT_Face			fFreeTypeFace;
141 		BString			fName;
142 		BPath			fPath;
143 		node_ref		fNodeRef;
144 
145 		FontFamily*		fFamily;
146 		uint16			fID;
147 
148 		BRect			fBounds;
149 
150 		font_height		fHeight;
151 		uint16			fFace;
152 		bool			fFullAndHalfFixed;
153 };
154 
155 #endif	// FONT_STYLE_H_
156