2005-06-24 07:31:41 +04:00
|
|
|
/*
|
|
|
|
* Copyright 2001-2005, Haiku.
|
|
|
|
* Distributed under the terms of the MIT License.
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* DarkWyrm <bpmagic@columbus.rr.com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** Handles the largest part of the font subsystem */
|
|
|
|
|
|
|
|
|
2003-01-19 00:43:30 +03:00
|
|
|
#include <Directory.h>
|
|
|
|
#include <Entry.h>
|
|
|
|
#include <File.h>
|
|
|
|
#include <Message.h>
|
2005-11-01 19:28:01 +03:00
|
|
|
#include <Path.h>
|
2003-01-19 00:43:30 +03:00
|
|
|
#include <String.h>
|
|
|
|
|
2003-09-09 14:26:11 +04:00
|
|
|
#include <FontServer.h>
|
|
|
|
#include <FontFamily.h>
|
|
|
|
#include <ServerFont.h>
|
2003-01-19 00:43:30 +03:00
|
|
|
#include "ServerConfig.h"
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-07-24 23:38:24 +04:00
|
|
|
extern FTC_Manager ftmanager;
|
|
|
|
FT_Library ftlib;
|
2005-06-24 07:31:41 +04:00
|
|
|
FontServer *gFontServer = NULL;
|
2003-01-19 00:43:30 +03:00
|
|
|
|
2003-08-02 04:13:30 +04:00
|
|
|
//#define PRINT_FONT_LIST
|
|
|
|
|
2005-11-01 19:28:01 +03:00
|
|
|
|
|
|
|
#if 0
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
|
|
|
\brief Access function to request a face via the FreeType font cache
|
|
|
|
*/
|
2005-11-01 19:28:01 +03:00
|
|
|
static FT_Error
|
2005-06-24 07:31:41 +04:00
|
|
|
face_requester(FTC_FaceID face_id, FT_Library library,
|
2003-01-19 00:43:30 +03:00
|
|
|
FT_Pointer request_data, FT_Face *aface)
|
|
|
|
{
|
|
|
|
CachedFace face = (CachedFace) face_id;
|
2005-06-24 07:31:41 +04:00
|
|
|
return FT_New_Face(ftlib, face->file_path.String(), face->face_index,aface);
|
2003-01-19 00:43:30 +03:00
|
|
|
}
|
2005-11-01 19:28:01 +03:00
|
|
|
#endif
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
|
|
|
// #pragma mark -
|
|
|
|
|
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
//! Does basic set up so that directories can be scanned
|
2005-11-01 19:28:01 +03:00
|
|
|
FontServer::FontServer()
|
2005-06-24 07:31:41 +04:00
|
|
|
: BLocker("font server lock"),
|
|
|
|
fFamilies(20),
|
|
|
|
fPlain(NULL),
|
|
|
|
fBold(NULL),
|
|
|
|
fFixed(NULL)
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-11-01 19:28:01 +03:00
|
|
|
fInitStatus = FT_Init_FreeType(&ftlib) == 0 ? B_OK : B_ERROR;
|
2003-01-19 00:43:30 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
Fire up the font caching subsystem.
|
|
|
|
The three zeros tell FreeType to use the defaults, which are 2 faces,
|
|
|
|
4 face sizes, and a maximum of 200000 bytes. I will probably change
|
|
|
|
these numbers in the future to maximize performance for your "average"
|
|
|
|
application.
|
|
|
|
*/
|
2005-10-20 14:01:49 +04:00
|
|
|
// if (FTC_Manager_New(ftlib, 0, 0, 0, &face_requester, NULL, &ftmanager) != 0)
|
|
|
|
// fInit = false;
|
2003-01-19 00:43:30 +03:00
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
//! Frees items allocated in the constructor and shuts down FreeType
|
2005-11-01 19:28:01 +03:00
|
|
|
FontServer::~FontServer()
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
|
|
|
FTC_Manager_Done(ftmanager);
|
|
|
|
FT_Done_FreeType(ftlib);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
|
|
|
\brief Counts the number of font families available
|
|
|
|
\return The number of unique font families currently available
|
|
|
|
*/
|
2005-11-01 19:28:01 +03:00
|
|
|
int32
|
|
|
|
FontServer::CountFamilies(void)
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-11-01 19:28:01 +03:00
|
|
|
return fFamilies.CountItems();
|
2003-01-19 00:43:30 +03:00
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
|
|
|
\brief Counts the number of styles available in a font family
|
|
|
|
\param family Name of the font family to scan
|
|
|
|
\return The number of font styles currently available for the font family
|
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
int32
|
|
|
|
FontServer::CountStyles(const char *familyName)
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-06-24 07:31:41 +04:00
|
|
|
FontFamily *family = GetFamily(familyName);
|
|
|
|
if (family)
|
|
|
|
return family->CountStyles();
|
|
|
|
|
2003-01-19 00:43:30 +03:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
|
|
|
\brief Removes a font family from the font list
|
|
|
|
\param family The family to remove
|
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
void
|
|
|
|
FontServer::RemoveFamily(const char *familyName)
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-06-24 07:31:41 +04:00
|
|
|
FontFamily *family = GetFamily(familyName);
|
|
|
|
if (family) {
|
|
|
|
fFamilies.RemoveItem(family);
|
|
|
|
delete family;
|
2003-01-19 00:43:30 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2005-08-12 18:55:46 +04:00
|
|
|
//! Scans the four default system font folders
|
|
|
|
void
|
|
|
|
FontServer::ScanSystemFolders(void)
|
|
|
|
{
|
|
|
|
ScanDirectory("/boot/beos/etc/fonts/ttfonts/");
|
|
|
|
|
|
|
|
// We don't scan these in test mode to help shave off some startup time
|
|
|
|
#if !TEST_MODE
|
|
|
|
ScanDirectory("/boot/beos/etc/fonts/PS-Type1/");
|
|
|
|
ScanDirectory("/boot/home/config/fonts/ttfonts/");
|
|
|
|
ScanDirectory("/boot/home/config/fonts/psfonts/");
|
|
|
|
#endif
|
|
|
|
}
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
|
|
|
\brief Scan a folder for all valid fonts
|
|
|
|
\param fontspath Path of the folder to scan.
|
|
|
|
\return
|
|
|
|
- \c B_OK Success
|
|
|
|
- \c B_NAME_TOO_LONG The path specified is too long
|
|
|
|
- \c B_ENTRY_NOT_FOUND The path does not exist
|
|
|
|
- \c B_LINK_LIMIT A cyclic loop was detected in the file system
|
|
|
|
- \c B_BAD_VALUE Invalid input specified
|
|
|
|
- \c B_NO_MEMORY Insufficient memory to open the folder for reading
|
|
|
|
- \c B_BUSY A busy node could not be accessed
|
|
|
|
- \c B_FILE_ERROR An invalid file prevented the operation.
|
|
|
|
- \c B_NO_MORE_FDS All file descriptors are in use (too many open files).
|
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
status_t
|
|
|
|
FontServer::ScanDirectory(const char *directoryPath)
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
|
|
|
// This bad boy does all the real work. It loads each entry in the
|
|
|
|
// directory. If a valid font file, it adds both the family and the style.
|
|
|
|
// Both family and style are stored internally as BStrings. Once everything
|
|
|
|
|
|
|
|
BDirectory dir;
|
2005-06-24 07:31:41 +04:00
|
|
|
status_t status = dir.SetTo(directoryPath);
|
|
|
|
if (status != B_OK)
|
|
|
|
return status;
|
2003-01-19 00:43:30 +03:00
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
BEntry entry;
|
|
|
|
while (dir.GetNextEntry(&entry) == B_OK) {
|
|
|
|
BPath path;
|
|
|
|
status = entry.GetPath(&path);
|
|
|
|
if (status < B_OK)
|
2003-01-19 00:43:30 +03:00
|
|
|
continue;
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
FT_Face face;
|
|
|
|
FT_Error error = FT_New_Face(ftlib, path.Path(), 0, &face);
|
|
|
|
if (error != 0)
|
2003-01-19 00:43:30 +03:00
|
|
|
continue;
|
2005-06-03 23:50:30 +04:00
|
|
|
|
|
|
|
// TODO: Commenting this out makes my "Unicode glyph lookup"
|
|
|
|
// work with our default fonts. The real fix is to select the
|
|
|
|
// Unicode char map (if supported), and/or adjust the
|
|
|
|
// utf8 -> glyph-index mapping everywhere to handle other
|
|
|
|
// char maps. We could also ignore fonts that don't support
|
|
|
|
// the Unicode lookup as a temporary "solution".
|
2005-06-24 07:31:41 +04:00
|
|
|
#if 0
|
|
|
|
FT_CharMap charmap = _GetSupportedCharmap(face);
|
|
|
|
if (!charmap) {
|
2003-01-19 00:43:30 +03:00
|
|
|
FT_Done_Face(face);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
face->charmap = charmap;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
FontFamily *family = GetFamily(face->family_name);
|
|
|
|
if (family == NULL) {
|
2003-08-02 04:13:30 +04:00
|
|
|
#ifdef PRINT_FONT_LIST
|
2005-06-24 07:31:41 +04:00
|
|
|
printf("Font Family: %s\n", face->family_name);
|
2003-08-02 04:13:30 +04:00
|
|
|
#endif
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
family = new FontFamily(face->family_name, fFamilies.CountItems());
|
|
|
|
fFamilies.AddItem(family);
|
2005-10-20 14:01:49 +04:00
|
|
|
} else {
|
|
|
|
// prevent adding the same style twice
|
|
|
|
// (this indicates a problem with the installed fonts maybe?)
|
|
|
|
if (family->HasStyle(face->style_name)) {
|
|
|
|
FT_Done_Face(face);
|
|
|
|
continue;
|
|
|
|
}
|
2003-01-19 00:43:30 +03:00
|
|
|
}
|
|
|
|
|
2003-08-02 04:13:30 +04:00
|
|
|
#ifdef PRINT_FONT_LIST
|
2005-06-24 07:31:41 +04:00
|
|
|
printf("\tFont Style: %s\n", face->style_name);
|
2003-08-02 04:13:30 +04:00
|
|
|
#endif
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
FontStyle *style = new FontStyle(path.Path(), face);
|
|
|
|
if (!family->AddStyle(style))
|
2005-01-17 05:05:50 +03:00
|
|
|
delete style;
|
2003-01-19 00:43:30 +03:00
|
|
|
|
2005-03-26 00:02:40 +03:00
|
|
|
// FT_Face is kept open in FontStyle and will be unset in the
|
|
|
|
// FontStyle destructor
|
2005-10-20 14:01:49 +04:00
|
|
|
// TODO: nope, it is not (yet)
|
2005-06-24 07:31:41 +04:00
|
|
|
}
|
2003-01-19 00:43:30 +03:00
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
fNeedUpdate = true;
|
2003-01-19 00:43:30 +03:00
|
|
|
return B_OK;
|
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
|
|
|
\brief Finds and returns the first valid charmap in a font
|
|
|
|
|
|
|
|
\param face Font handle obtained from FT_Load_Face()
|
|
|
|
\return An FT_CharMap or NULL if unsuccessful
|
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
FT_CharMap
|
|
|
|
FontServer::_GetSupportedCharmap(const FT_Face& face)
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-06-24 07:31:41 +04:00
|
|
|
for (int32 i = 0; i < face->num_charmaps; i++) {
|
|
|
|
FT_CharMap charmap = face->charmaps[i];
|
|
|
|
|
|
|
|
switch (charmap->platform_id) {
|
2003-01-19 00:43:30 +03:00
|
|
|
case 3:
|
|
|
|
// if Windows Symbol or Windows Unicode
|
2005-06-24 07:31:41 +04:00
|
|
|
if (charmap->encoding_id == 0 || charmap->encoding_id == 1)
|
2003-01-19 00:43:30 +03:00
|
|
|
return charmap;
|
|
|
|
break;
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-19 00:43:30 +03:00
|
|
|
case 1:
|
|
|
|
// if Apple Unicode
|
2005-06-24 07:31:41 +04:00
|
|
|
if (charmap->encoding_id == 0)
|
2003-01-19 00:43:30 +03:00
|
|
|
return charmap;
|
|
|
|
break;
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-19 00:43:30 +03:00
|
|
|
case 0:
|
|
|
|
// if Apple Roman
|
2005-06-24 07:31:41 +04:00
|
|
|
if (charmap->encoding_id == 0)
|
2003-01-19 00:43:30 +03:00
|
|
|
return charmap;
|
|
|
|
break;
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-19 00:43:30 +03:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
return NULL;
|
2003-01-19 00:43:30 +03:00
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
|
|
|
\brief This saves all family names and styles to the file specified in
|
|
|
|
ServerConfig.h as SERVER_FONT_LIST as a flattened BMessage.
|
2003-01-19 00:43:30 +03:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
This operation is not done very often because the access to disk adds a significant
|
|
|
|
performance hit.
|
2003-01-19 00:43:30 +03:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
The format for storage consists of two things: an array of strings with the name 'family'
|
|
|
|
and a number of small string arrays which have the name of the font family. These are
|
|
|
|
the style lists.
|
2003-01-19 00:43:30 +03:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
Additionally, any fonts which have bitmap strikes contained in them or any fonts which
|
|
|
|
are fixed-width are named in the arrays 'tuned' and 'fixed'.
|
2003-01-19 00:43:30 +03:00
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
void
|
|
|
|
FontServer::SaveList(void)
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-01-17 05:05:50 +03:00
|
|
|
/* int32 famcount=0, stycount=0,i=0,j=0;
|
2003-01-19 00:43:30 +03:00
|
|
|
FontFamily *fam;
|
|
|
|
FontStyle *sty;
|
|
|
|
BMessage fontmsg, familymsg('FONT');
|
|
|
|
BString famname, styname, extraname;
|
|
|
|
bool fixed,tuned;
|
|
|
|
|
|
|
|
famcount=families->CountItems();
|
|
|
|
for(i=0; i<famcount; i++)
|
|
|
|
{
|
|
|
|
fam=(FontFamily*)families->ItemAt(i);
|
|
|
|
fixed=false;
|
|
|
|
tuned=false;
|
|
|
|
if(!fam)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
famname=fam->Name();
|
|
|
|
|
|
|
|
// Add the family to the message
|
|
|
|
familymsg.AddString("name",famname);
|
|
|
|
|
|
|
|
stycount=fam->CountStyles();
|
|
|
|
for(j=0;j<stycount;j++)
|
|
|
|
{
|
|
|
|
styname.SetTo(fam->GetStyle(j));
|
|
|
|
if(styname.CountChars()>0)
|
|
|
|
{
|
|
|
|
// Add to list
|
|
|
|
familymsg.AddString("styles", styname);
|
|
|
|
|
|
|
|
// Check to see if it has prerendered strikes (has "tuned" fonts)
|
|
|
|
sty=fam->GetStyle(styname.String());
|
|
|
|
if(!sty)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if(sty->HasTuned() && sty->IsScalable())
|
|
|
|
tuned=true;
|
|
|
|
|
|
|
|
// Check to see if it is fixed-width
|
|
|
|
if(sty->IsFixedWidth())
|
|
|
|
fixed=true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(tuned)
|
|
|
|
familymsg.AddBool("tuned",true);
|
|
|
|
if(fixed)
|
|
|
|
familymsg.AddBool("fixed",true);
|
|
|
|
|
|
|
|
fontmsg.AddMessage("family",&familymsg);
|
|
|
|
familymsg.MakeEmpty();
|
|
|
|
}
|
|
|
|
|
|
|
|
BFile file(SERVER_FONT_LIST,B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE);
|
|
|
|
if(file.InitCheck()==B_OK)
|
|
|
|
fontmsg.Flatten(&file);
|
2005-01-17 05:05:50 +03:00
|
|
|
*/
|
2003-01-19 00:43:30 +03:00
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2005-11-01 19:28:01 +03:00
|
|
|
FontFamily*
|
|
|
|
FontServer::GetFamilyByIndex(int32 index) const
|
|
|
|
{
|
|
|
|
return fFamilies.ItemAt(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
2005-11-01 19:28:01 +03:00
|
|
|
\brief Locates a FontFamily object by name
|
|
|
|
\param name The family to find
|
|
|
|
\return Pointer to the specified family or NULL if not found.
|
2003-01-20 02:04:58 +03:00
|
|
|
*/
|
2005-11-01 19:28:01 +03:00
|
|
|
FontFamily*
|
|
|
|
FontServer::GetFamily(const char* name) const
|
|
|
|
{
|
|
|
|
if (name == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
int32 count = fFamilies.CountItems();
|
|
|
|
|
|
|
|
for (int32 i = 0; i < count; i++) {
|
|
|
|
FontFamily* family = fFamilies.ItemAt(i);
|
|
|
|
if (!strcmp(family->Name(), name))
|
|
|
|
return family;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FontFamily*
|
|
|
|
FontServer::GetFamily(uint16 familyID) const
|
|
|
|
{
|
|
|
|
for (int32 i = 0; i < fFamilies.CountItems(); i++) {
|
|
|
|
FontFamily *family = (FontFamily*)fFamilies.ItemAt(i);
|
|
|
|
if (family->ID() == familyID)
|
|
|
|
return family;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
FontStyle*
|
2005-11-01 19:28:01 +03:00
|
|
|
FontServer::GetStyleByIndex(const char* familyName, int32 index) const
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-06-24 07:31:41 +04:00
|
|
|
FontFamily* family = GetFamily(familyName);
|
2005-11-01 19:28:01 +03:00
|
|
|
if (family != NULL)
|
|
|
|
return family->StyleAt(index);
|
2003-01-19 00:43:30 +03:00
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2005-11-01 19:28:01 +03:00
|
|
|
/*!
|
|
|
|
\brief Retrieves the FontStyle object that comes closest to the one specified
|
|
|
|
|
|
|
|
\param family The font's family or NULL in which case \a familyID is used
|
|
|
|
\param style The font's style or NULL in which case \a styleID is used
|
|
|
|
\param familyID will only be used if \a family is NULL (or empty)
|
|
|
|
\param styleID will only be used if \a style is NULL (or empty)
|
|
|
|
\param face is used to specify the style if both \a style is NULL or empty
|
|
|
|
and styleID is 0xffff.
|
|
|
|
|
|
|
|
\return The FontStyle having those attributes or NULL if not available
|
|
|
|
*/
|
|
|
|
FontStyle*
|
|
|
|
FontServer::GetStyle(const char* familyName, const char* styleName, uint16 familyID,
|
|
|
|
uint16 styleID, uint16 face)
|
|
|
|
{
|
|
|
|
FontFamily* family;
|
|
|
|
|
|
|
|
// find family
|
|
|
|
|
|
|
|
if (familyName != NULL && familyName[0])
|
|
|
|
family = GetFamily(familyName);
|
|
|
|
else
|
|
|
|
family = GetFamily(familyID);
|
|
|
|
|
|
|
|
if (family == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
// find style
|
|
|
|
|
|
|
|
if (styleName != NULL && styleName[0])
|
|
|
|
return family->GetStyle(styleName);
|
|
|
|
|
|
|
|
if (styleID != 0xffff)
|
|
|
|
return family->GetStyleByID(styleID);
|
|
|
|
|
|
|
|
// try to get from face
|
|
|
|
return family->GetStyleMatchingFace(face);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
/*!
|
|
|
|
\brief Retrieves the FontStyle object
|
|
|
|
\param family ID for the font's family
|
|
|
|
\param style ID of the font's style
|
|
|
|
\return The FontStyle having those attributes or NULL if not available
|
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
FontStyle*
|
2005-11-01 02:21:36 +03:00
|
|
|
FontServer::GetStyle(uint16 familyID, uint16 styleID)
|
2005-01-17 05:05:50 +03:00
|
|
|
{
|
2005-06-24 07:31:41 +04:00
|
|
|
FontFamily *family = GetFamily(familyID);
|
|
|
|
if (family)
|
2005-11-01 19:28:01 +03:00
|
|
|
return family->GetStyleByID(styleID);
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
|
|
|
\brief Returns the current object used for the regular style
|
|
|
|
\return A ServerFont pointer which is the plain font.
|
|
|
|
|
|
|
|
Do NOT delete this object. If you access it, make a copy of it.
|
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
ServerFont*
|
|
|
|
FontServer::GetSystemPlain()
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-06-24 07:31:41 +04:00
|
|
|
return fPlain;
|
2003-01-19 00:43:30 +03:00
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
|
|
|
\brief Returns the current object used for the bold style
|
|
|
|
\return A ServerFont pointer which is the bold font.
|
|
|
|
|
|
|
|
Do NOT delete this object. If you access it, make a copy of it.
|
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
ServerFont*
|
|
|
|
FontServer::GetSystemBold()
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-06-24 07:31:41 +04:00
|
|
|
return fBold;
|
2003-01-19 00:43:30 +03:00
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
|
|
|
\brief Returns the current object used for the fixed style
|
|
|
|
\return A ServerFont pointer which is the fixed font.
|
|
|
|
|
|
|
|
Do NOT delete this object. If you access it, make a copy of it.
|
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
ServerFont*
|
|
|
|
FontServer::GetSystemFixed()
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-06-24 07:31:41 +04:00
|
|
|
return fFixed;
|
2003-01-19 00:43:30 +03:00
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 02:04:58 +03:00
|
|
|
/*!
|
|
|
|
\brief Sets the system's plain font to the specified family and style
|
|
|
|
\param family Name of the font's family
|
|
|
|
\param style Name of the style desired
|
|
|
|
\param size Size desired
|
|
|
|
\return true if successful, false if not.
|
|
|
|
|
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
bool
|
|
|
|
FontServer::SetSystemPlain(const char* familyName, const char* styleName, float size)
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-06-24 07:31:41 +04:00
|
|
|
FontStyle *style = GetStyle(familyName, styleName);
|
|
|
|
if (style == NULL)
|
2003-01-19 00:43:30 +03:00
|
|
|
return false;
|
2005-06-24 07:31:41 +04:00
|
|
|
|
|
|
|
delete fPlain;
|
|
|
|
fPlain = new ServerFont(style, size);
|
|
|
|
|
2003-01-19 00:43:30 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 20:31:44 +03:00
|
|
|
/*!
|
|
|
|
\brief Sets the system's bold font to the specified family and style
|
|
|
|
\param family Name of the font's family
|
|
|
|
\param style Name of the style desired
|
|
|
|
\param size Size desired
|
|
|
|
\return true if successful, false if not.
|
|
|
|
|
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
bool
|
|
|
|
FontServer::SetSystemBold(const char* familyName, const char* styleName, float size)
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-06-24 07:31:41 +04:00
|
|
|
FontStyle *style = GetStyle(familyName, styleName);
|
|
|
|
if (style == NULL)
|
2003-01-19 00:43:30 +03:00
|
|
|
return false;
|
2005-06-24 07:31:41 +04:00
|
|
|
|
|
|
|
delete fBold;
|
|
|
|
fBold = new ServerFont(style, size);
|
|
|
|
|
2003-01-19 00:43:30 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2003-01-20 20:31:44 +03:00
|
|
|
/*!
|
|
|
|
\brief Sets the system's fixed font to the specified family and style
|
|
|
|
\param family Name of the font's family
|
|
|
|
\param style Name of the style desired
|
|
|
|
\param size Size desired
|
|
|
|
\return true if successful, false if not.
|
|
|
|
|
|
|
|
*/
|
2005-06-24 07:31:41 +04:00
|
|
|
bool
|
|
|
|
FontServer::SetSystemFixed(const char* familyName, const char* styleName, float size)
|
2003-01-19 00:43:30 +03:00
|
|
|
{
|
2005-06-24 07:31:41 +04:00
|
|
|
FontStyle *style = GetStyle(familyName, styleName);
|
|
|
|
if (style == NULL)
|
2003-01-19 00:43:30 +03:00
|
|
|
return false;
|
2005-01-17 05:05:50 +03:00
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
delete fFixed;
|
|
|
|
fFixed = new ServerFont(style, size);
|
|
|
|
|
2003-01-19 00:43:30 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|