1/*
2 * Copyright 2001-2016, 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
10
11/*!	Manages user font families and styles */
12
13
14#include "AppFontManager.h"
15
16#include <new>
17#include <stdint.h>
18
19#include <Debug.h>
20#include <Entry.h>
21
22#include "FontFamily.h"
23
24
25//#define TRACE_FONT_MANAGER
26#ifdef TRACE_FONT_MANAGER
27#	define FTRACE(x) debug_printf x
28#else
29#	define FTRACE(x) ;
30#endif
31
32
33extern FT_Library gFreeTypeLibrary;
34
35
36//	#pragma mark -
37
38
39/*! Sets high id number to avoid collisions with GlobalFontManager
40	The result of a collision would be that the global font is selected
41	rather than the application font.
42*/
43AppFontManager::AppFontManager()
44	: BLocker("AppFontManager")
45{
46	fNextID = UINT16_MAX;
47}
48
49
50/*!	\brief Adds the FontFamily/FontStyle that is represented by this path.
51*/
52status_t
53AppFontManager::AddUserFontFromFile(const char* path, uint16 index, uint16 instance,
54	uint16& familyID, uint16& styleID)
55{
56	ASSERT(IsLocked());
57
58	BEntry entry;
59	status_t status = entry.SetTo(path);
60	if (status != B_OK)
61		return status;
62
63	node_ref nodeRef;
64	status = entry.GetNodeRef(&nodeRef);
65	if (status < B_OK)
66		return status;
67
68	FT_Face face;
69	FT_Error error = FT_New_Face(gFreeTypeLibrary, path, index | (instance << 16), &face);
70	if (error != 0)
71		return B_ERROR;
72
73	status = _AddFont(face, nodeRef, path, familyID, styleID);
74	return status;
75}
76
77
78/*!	\brief Adds the FontFamily/FontStyle that is represented by the area in memory.
79*/
80status_t
81AppFontManager::AddUserFontFromMemory(const FT_Byte* fontAddress, size_t size, uint16 index,
82	uint16 instance, uint16& familyID, uint16& styleID)
83{
84	ASSERT(IsLocked());
85
86	node_ref nodeRef;
87	status_t status;
88
89	FT_Face face;
90	FT_Error error = FT_New_Memory_Face(gFreeTypeLibrary, fontAddress, size,
91		index | (instance << 16), &face);
92	if (error != 0)
93		return B_ERROR;
94
95	status = _AddFont(face, nodeRef, "", familyID, styleID);
96
97	return status;
98}
99
100
101/*!	\brief Removes the FontFamily/FontStyle from the font manager.
102*/
103status_t
104AppFontManager::RemoveUserFont(uint16 familyID, uint16 styleID)
105{
106	return _RemoveFont(familyID, styleID) != NULL ? B_OK : B_BAD_VALUE;
107}
108
109
110uint16
111AppFontManager::_NextID()
112{
113	return fNextID--;
114}
115