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