master chld/haikuprg / decor / MacDecorator / includes / ServerFont.h
  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 */