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			FontStyle*			fStyle;
177			float				fSize;
178			float				fRotation;
179			float				fShear;
180			float				fFalseBoldWidth;
181			BRect				fBounds;
182			uint32				fFlags;
183			uint32				fSpacing;
184			font_direction		fDirection;
185			uint16				fFace;
186			uint32				fEncoding;
187};
188
189inline bool ServerFont::Hinting() const
190{
191	switch (gDefaultHintingMode) {
192		case HINTING_MODE_OFF:
193			return false;
194		default:
195		case HINTING_MODE_ON:
196			return true;
197		case HINTING_MODE_MONOSPACED_ONLY:
198			return IsFixedWidth();
199	}
200}
201
202#endif	/* SERVER_FONT_H */
203