xref: /haiku/src/servers/app/font/FontManager.h (revision 04171cfc5c10c98b9ba3c7233a271f6165cdd36f)
1 /*
2  * Copyright 2001-2009, 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_MANAGER_H
10 #define FONT_MANAGER_H
11 
12 
13 #include <AutoDeleter.h>
14 #include <HashMap.h>
15 #include <Looper.h>
16 #include <ObjectList.h>
17 #include <Referenceable.h>
18 
19 #include <ft2build.h>
20 #include FT_FREETYPE_H
21 
22 class BEntry;
23 class BPath;
24 struct node_ref;
25 
26 class FontFamily;
27 class FontStyle;
28 class ServerFont;
29 
30 
31 /*!
32 	\class FontManager FontManager.h
33 	\brief Manager for the largest part of the font subsystem
34 */
35 class FontManager : public BLooper {
36 public:
37 								FontManager();
38 	virtual						~FontManager();
39 
40 			status_t			InitCheck() { return fInitStatus; }
41 			void				SaveRecentFontMappings();
42 
43 	virtual	void				MessageReceived(BMessage* message);
44 
45 			int32				CheckRevision(uid_t user);
46 			int32				CountFamilies();
47 
48 			int32				CountStyles(const char* family);
49 			int32				CountStyles(uint16 familyID);
50 			FontFamily*			FamilyAt(int32 index) const;
51 
52 			FontFamily*			GetFamily(uint16 familyID) const;
53 			FontFamily*			GetFamily(const char* name);
54 
55 			FontStyle*			GetStyleByIndex(const char* family,
56 									int32 index);
57 			FontStyle*			GetStyleByIndex(uint16 familyID, int32 index);
58 			FontStyle*			GetStyle(const char* family, const char* style,
59 									uint16 familyID = 0xffff,
60 									uint16 styleID = 0xffff, uint16 face = 0);
61 			FontStyle*			GetStyle(const char *family, uint16 styleID);
62 			FontStyle*			GetStyle(uint16 familyID,
63 									uint16 styleID) const;
64 			FontStyle*			FindStyleMatchingFace(uint16 face) const;
65 
66 			void				RemoveStyle(FontStyle* style);
67 				// This call must not be used by anything else than class
68 				// FontStyle.
69 
70 			const ServerFont*	DefaultPlainFont() const;
71 			const ServerFont*	DefaultBoldFont() const;
72 			const ServerFont*	DefaultFixedFont() const;
73 
74 			void				AttachUser(uid_t userID);
75 			void				DetachUser(uid_t userID);
76 
77 private:
78 			struct font_directory;
79 			struct font_mapping;
80 
81 			void				_AddDefaultMapping(const char* family,
82 									const char* style, const char* path);
83 			bool				_LoadRecentFontMappings();
84 			status_t			_AddMappedFont(const char* family,
85 									const char* style = NULL);
86 			FontStyle*			_GetDefaultStyle(const char* familyName,
87 									const char* styleName,
88 									const char* fallbackFamily,
89 									const char* fallbackStyle,
90 									uint16 fallbackFace);
91 			status_t			_SetDefaultFonts();
92 			void				_PrecacheFontFile(const ServerFont* font);
93 			void				_AddSystemPaths();
94 			font_directory*		_FindDirectory(node_ref& nodeRef);
95 			void				_RemoveDirectory(font_directory* directory);
96 			status_t			_CreateDirectories(const char* path);
97 			status_t			_AddPath(const char* path);
98 			status_t			_AddPath(BEntry& entry,
99 									font_directory** _newDirectory = NULL);
100 
101 			void				_RemoveStyle(font_directory& directory,
102 									FontStyle* style);
103 			void				_RemoveStyle(dev_t device, uint64 directory,
104 									uint64 node);
105 			FontFamily*			_FindFamily(const char* family) const;
106 
107 			void				_ScanFontsIfNecessary();
108 			void				_ScanFonts();
109 			status_t			_ScanFontDirectory(font_directory& directory);
110 			status_t			_AddFont(font_directory& directory,
111 									BEntry& entry);
112 
113 			FT_CharMap			_GetSupportedCharmap(const FT_Face& face);
114 
115 private:
116 			struct FontKey {
117 				FontKey(uint16 family, uint16 style)
118 					: familyID(family), styleID(style) {}
119 
120 				uint32 GetHashCode() const
121 				{
122 					return familyID | (styleID << 16UL);
123 				}
124 
125 				bool operator==(const FontKey& other) const
126 				{
127 					return familyID == other.familyID
128 						&& styleID == other.styleID;
129 				}
130 
131 				uint16 familyID, styleID;
132 			};
133 
134 private:
135 			status_t			fInitStatus;
136 
137 			typedef BObjectList<font_directory>		DirectoryList;
138 			typedef BObjectList<font_mapping>		MappingList;
139 			typedef BObjectList<FontFamily>			FamilyList;
140 
141 			DirectoryList		fDirectories;
142 			MappingList			fMappings;
143 			FamilyList			fFamilies;
144 
145 			HashMap<FontKey, BReference<FontStyle> > fStyleHashTable;
146 
147 			ObjectDeleter<ServerFont>
148 								fDefaultPlainFont;
149 			ObjectDeleter<ServerFont>
150 								fDefaultBoldFont;
151 			ObjectDeleter<ServerFont>
152 								fDefaultFixedFont;
153 
154 			bool				fScanned;
155 			int32				fNextID;
156 };
157 
158 extern FT_Library gFreeTypeLibrary;
159 extern FontManager* gFontManager;
160 
161 #endif	/* FONT_MANAGER_H */
162