1/*
2 * Copyright 2001-2008, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * DarkWyrm <bpmagic@columbus.rr.com>
7 * Jérôme Duval, jerome.duval@free.fr
8 * Axel Dörfler, axeld@pinc-software.de
9 * Stephan Aßmus <superstippi@gmx.de>
10 */
11#ifndef SERVER_FONT_H
12#define SERVER_FONT_H
13
14
15#include <Font.h>
16#include <Rect.h>
17
18#include "FontFamily.h"
19#include "GlobalSubpixelSettings.h"
20#include "Transformable.h"
21
22class BShape;
23class BString;
24
25
26class ServerFont {
27 public:
28 ServerFont();
29 ServerFont(FontStyle& style,
30 float size = 12.0, float rotation = 0.0,
31 float shear = 90.0,
32 float falseBoldWidth = 0.0,
33 uint16 flags = 0,
34 uint8 spacing = B_BITMAP_SPACING);
35 ServerFont(const ServerFont& font);
36 virtual ~ServerFont();
37
38 ServerFont &operator=(const ServerFont& font);
39 bool operator==(const ServerFont& other) const;
40
41 font_direction Direction() const
42 { return fDirection; }
43 uint32 Encoding() const
44 { return fEncoding; }
45 uint32 Flags() const
46 { return fFlags; }
47 uint32 Spacing() const
48 { return fSpacing; }
49 float Shear() const
50 { return fShear; }
51 float Rotation() const
52 { return fRotation; }
53 float FalseBoldWidth() const
54 { return fFalseBoldWidth; }
55 float Size() const
56 { return fSize; }
57 uint16 Face() const
58 { return fFace; }
59 uint32 CountGlyphs()
60 { return fStyle->GlyphCount(); }
61 int32 CountTuned();
62
63 font_file_format FileFormat();
64
65 const char* Style() const;
66 const char* Family() const;
67 const char* Path() const
68 { return fStyle->Path(); }
69
70 void SetStyle(FontStyle* style);
71 status_t SetFamilyAndStyle(uint16 familyID,
72 uint16 styleID);
73 status_t SetFamilyAndStyle(uint32 fontID);
74
75 uint16 StyleID() const
76 { return fStyle->ID(); }
77 uint16 FamilyID() const
78 { return fStyle->Family()->ID(); }
79 uint32 GetFamilyAndStyle() const;
80
81 void SetDirection(font_direction dir)
82 { fDirection = dir; }
83 void SetEncoding(uint32 encoding)
84 { fEncoding = encoding; }
85 void SetFlags(uint32 value)
86 { fFlags = value; }
87 void SetSpacing(uint32 value)
88 { fSpacing = value; }
89 void SetShear(float value)
90 { fShear = value; }
91 void SetSize(float value)
92 { fSize = value; }
93 void SetRotation(float value)
94 { fRotation = value; }
95 void SetFalseBoldWidth(float value)
96 { fFalseBoldWidth = value; }
97 status_t SetFace(uint16 face);
98
99 bool IsFixedWidth() const
100 { return fStyle->IsFixedWidth(); }
101 bool IsScalable() const
102 { return fStyle->IsScalable(); }
103 bool HasKerning() const
104 { return fStyle->HasKerning(); }
105 bool HasTuned() const
106 { return fStyle->HasTuned(); }
107 int32 TunedCount() const
108 { return fStyle->TunedCount(); }
109 uint16 GlyphCount() const
110 { return fStyle->GlyphCount(); }
111 uint16 CharMapCount() const
112 { return fStyle->CharMapCount(); }
113 inline bool Hinting() const;
114
115 status_t GetGlyphShapes(const char charArray[],
116 int32 numChars, BShape *shapeArray[]) const;
117
118 status_t GetHasGlyphs(const char charArray[],
119 int32 numBytes, int32 numChars,
120 bool hasArray[]) const;
121
122 status_t GetEdges(const char charArray[], int32 numBytes,
123 int32 numChars, edge_info edgeArray[])
124 const;
125
126 status_t GetEscapements(const char charArray[],
127 int32 numBytes, int32 numChars,
128 escapement_delta delta,
129 BPoint escapementArray[],
130 BPoint offsetArray[]) const;
131
132 status_t GetEscapements(const char charArray[],
133 int32 numBytes, int32 numChars,
134 escapement_delta delta,
135 float widthArray[]) const;
136
137 status_t GetBoundingBoxes(const char charArray[],
138 int32 numBytes, int32 numChars,
139 BRect rectArray[], bool stringEscapement,
140 font_metric_mode mode,
141 escapement_delta delta,
142 bool asString);
143
144 status_t GetBoundingBoxesForStrings(char *charArray[],
145 size_t lengthArray[], int32 numStrings,
146 BRect rectArray[], font_metric_mode mode,
147 escapement_delta deltaArray[]);
148
149 float StringWidth(const char *string,
150 int32 numBytes,
151 const escapement_delta* delta = NULL) const;
152
153 bool Lock() const { return fStyle->Lock(); }
154 void Unlock() const { fStyle->Unlock(); }
155
156// FT_Face GetFTFace() const
157// { return fStyle->FreeTypeFace(); };
158
159 BRect BoundingBox();
160 void GetHeight(font_height& height) const;
161
162 void TruncateString(BString* inOut,
163 uint32 mode, float width) const;
164
165 Transformable EmbeddedTransformation() const;
166 status_t GetUnicodeBlocks(unicode_block &blocksForFont);
167 status_t IncludesUnicodeBlock(uint32 start, uint32 end,
168 bool &hasBlock);
169
170protected:
171 friend class FontStyle;
172 FT_Face GetTransformedFace(bool rotate,
173 bool shear) const;
174 void PutTransformedFace(FT_Face face) const;
175
176 BReference<FontStyle>
177 fStyle;
178 float fSize;
179 float fRotation;
180 float fShear;
181 float fFalseBoldWidth;
182 BRect fBounds;
183 uint32 fFlags;
184 uint32 fSpacing;
185 font_direction fDirection;
186 uint16 fFace;
187 uint32 fEncoding;
188};
189
190inline bool ServerFont::Hinting() const
191{
192 switch (gDefaultHintingMode) {
193 case HINTING_MODE_OFF:
194 return false;
195 default:
196 case HINTING_MODE_ON:
197 return true;
198 case HINTING_MODE_MONOSPACED_ONLY:
199 return IsFixedWidth();
200 }
201}
202
203#endif /* SERVER_FONT_H */