90984a161a
handled correctly. * The path of moved styles is now updated (also when their parent directories are moved). * FontManager::_AddPath() can no longer crash when you leave the _newDirectory parameter set to NULL. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17163 a95241bf-73f2-0310-859d-f6bbb57e9c96
221 lines
5.2 KiB
C++
221 lines
5.2 KiB
C++
/*
|
|
* Copyright 2001-2006, Haiku.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Authors:
|
|
* DarkWyrm <bpmagic@columbus.rr.com>
|
|
* Axel Dörfler, axeld@pinc-software.de
|
|
*/
|
|
#ifndef FONT_FAMILY_H_
|
|
#define FONT_FAMILY_H_
|
|
|
|
|
|
#include <Font.h>
|
|
#include <Locker.h>
|
|
#include <Node.h>
|
|
#include <ObjectList.h>
|
|
#include <Path.h>
|
|
#include <Rect.h>
|
|
#include <String.h>
|
|
|
|
#include <ft2build.h>
|
|
#include FT_FREETYPE_H
|
|
#include "ReferenceCounting.h"
|
|
#include "HashTable.h"
|
|
|
|
|
|
struct node_ref;
|
|
class FontFamily;
|
|
class ServerFont;
|
|
|
|
enum font_format {
|
|
FONT_TRUETYPE = 0,
|
|
FONT_TYPE_1,
|
|
FONT_OPENTYPE,
|
|
FONT_BDF,
|
|
FONT_CFF,
|
|
FONT_CID,
|
|
FONT_PCF,
|
|
FONT_PFR,
|
|
FONT_SFNT,
|
|
FONT_TYPE_42,
|
|
FONT_WINFONT,
|
|
};
|
|
|
|
|
|
class FontKey : public Hashable {
|
|
public:
|
|
FontKey(uint16 familyID, uint16 styleID)
|
|
: fHash(familyID | (styleID << 16UL))
|
|
{
|
|
}
|
|
|
|
virtual uint32 Hash() const
|
|
{ return fHash; }
|
|
virtual bool CompareTo(Hashable& other) const
|
|
{ return fHash == other.Hash(); }
|
|
|
|
private:
|
|
uint32 fHash;
|
|
};
|
|
|
|
|
|
/*!
|
|
\class FontStyle FontFamily.h
|
|
\brief Object used to represent a font style
|
|
|
|
FontStyle objects help abstract a lot of the font engine details while
|
|
still offering plenty of information the style in question.
|
|
*/
|
|
class FontStyle : public ReferenceCounting, public Hashable/*, public BLocker*/ {
|
|
public:
|
|
FontStyle(node_ref& nodeRef, const char* path, FT_Face face);
|
|
virtual ~FontStyle();
|
|
|
|
virtual uint32 Hash() const;
|
|
virtual bool CompareTo(Hashable& other) const;
|
|
|
|
const node_ref& NodeRef() const { return fNodeRef; }
|
|
|
|
bool Lock();
|
|
void Unlock();
|
|
|
|
/*!
|
|
\fn bool FontStyle::IsFixedWidth(void)
|
|
\brief Determines whether the font's character width is fixed
|
|
\return true if fixed, false if not
|
|
*/
|
|
bool IsFixedWidth() const
|
|
{ return fFreeTypeFace->face_flags & FT_FACE_FLAG_FIXED_WIDTH; }
|
|
/*!
|
|
\fn bool FontStyle::IsScalable(void)
|
|
\brief Determines whether the font can be scaled to any size
|
|
\return true if scalable, false if not
|
|
*/
|
|
bool IsScalable() const
|
|
{ return fFreeTypeFace->face_flags & FT_FACE_FLAG_SCALABLE; }
|
|
/*!
|
|
\fn bool FontStyle::HasKerning(void)
|
|
\brief Determines whether the font has kerning information
|
|
\return true if kerning info is available, false if not
|
|
*/
|
|
bool HasKerning() const
|
|
{ return fFreeTypeFace->face_flags & FT_FACE_FLAG_KERNING; }
|
|
/*!
|
|
\fn bool FontStyle::HasTuned(void)
|
|
\brief Determines whether the font contains strikes
|
|
\return true if it has strikes included, false if not
|
|
*/
|
|
bool HasTuned() const
|
|
{ return fFreeTypeFace->num_fixed_sizes > 0; }
|
|
/*!
|
|
\fn bool FontStyle::TunedCount(void)
|
|
\brief Returns the number of strikes the style contains
|
|
\return The number of strikes the style contains
|
|
*/
|
|
int32 TunedCount() const
|
|
{ return fFreeTypeFace->num_fixed_sizes; }
|
|
/*!
|
|
\fn bool FontStyle::GlyphCount(void)
|
|
\brief Returns the number of glyphs in the style
|
|
\return The number of glyphs the style contains
|
|
*/
|
|
uint16 GlyphCount() const
|
|
{ return fFreeTypeFace->num_glyphs; }
|
|
/*!
|
|
\fn bool FontStyle::CharMapCount(void)
|
|
\brief Returns the number of character maps the style contains
|
|
\return The number of character maps the style contains
|
|
*/
|
|
uint16 CharMapCount() const
|
|
{ return fFreeTypeFace->num_charmaps; }
|
|
|
|
const char* Name() const
|
|
{ return fName.String(); }
|
|
FontFamily* Family() const
|
|
{ return fFamily; }
|
|
uint16 ID() const
|
|
{ return fID; }
|
|
uint32 Flags() const;
|
|
|
|
uint16 Face() const
|
|
{ return fFace; }
|
|
uint16 PreservedFace(uint16) const;
|
|
|
|
const char* Path() const;
|
|
void UpdatePath(const node_ref& parentNodeRef);
|
|
|
|
void GetHeight(float size, font_height &heigth) const;
|
|
font_direction Direction() const
|
|
{ return B_FONT_LEFT_TO_RIGHT; }
|
|
font_file_format FileFormat() const
|
|
{ return B_TRUETYPE_WINDOWS; }
|
|
|
|
FT_Face FreeTypeFace() const
|
|
{ return fFreeTypeFace; }
|
|
|
|
status_t UpdateFace(FT_Face face);
|
|
|
|
// TODO: Re-enable when I understand how the FT2 Cache system changed from
|
|
// 2.1.4 to 2.1.8
|
|
// int16 ConvertToUnicode(uint16 c);
|
|
|
|
private:
|
|
friend class FontFamily;
|
|
uint16 _TranslateStyleToFace(const char *name) const;
|
|
void _SetFontFamily(FontFamily* family, uint16 id);
|
|
|
|
private:
|
|
FT_Face fFreeTypeFace;
|
|
BString fName;
|
|
BPath fPath;
|
|
node_ref fNodeRef;
|
|
|
|
FontFamily* fFamily;
|
|
uint16 fID;
|
|
|
|
BRect fBounds;
|
|
|
|
font_height fHeight;
|
|
uint16 fFace;
|
|
};
|
|
|
|
/*!
|
|
\class FontFamily FontFamily.h
|
|
\brief Class representing a collection of similar styles
|
|
|
|
FontFamily objects bring together many styles of the same face, such as
|
|
Arial Roman, Arial Italic, Arial Bold, etc.
|
|
*/
|
|
class FontFamily {
|
|
public:
|
|
FontFamily(const char* name, uint16 id);
|
|
virtual ~FontFamily();
|
|
|
|
const char* Name() const;
|
|
|
|
bool AddStyle(FontStyle* style);
|
|
bool RemoveStyle(FontStyle* style);
|
|
|
|
FontStyle* GetStyle(const char* style) const;
|
|
FontStyle* GetStyleMatchingFace(uint16 face) const;
|
|
FontStyle* GetStyleByID(uint16 face) const;
|
|
|
|
uint16 ID() const
|
|
{ return fID; }
|
|
uint32 Flags();
|
|
|
|
bool HasStyle(const char* style) const;
|
|
int32 CountStyles() const;
|
|
FontStyle* StyleAt(int32 index) const;
|
|
|
|
private:
|
|
BString fName;
|
|
BObjectList<FontStyle> fStyles;
|
|
uint16 fID;
|
|
uint16 fNextID;
|
|
uint32 fFlags;
|
|
};
|
|
|
|
#endif /* FONT_FAMILY_H_ */
|