116ed1e1dSAxel Dörfler/*
2a4de7fa0SAxel Dörfler * Copyright 2001-2008, Haiku.
316ed1e1dSAxel Dörfler * Distributed under the terms of the MIT License.
416ed1e1dSAxel Dörfler *
516ed1e1dSAxel Dörfler * Authors:
616ed1e1dSAxel Dörfler *		DarkWyrm <bpmagic@columbus.rr.com>
716ed1e1dSAxel Dörfler *		J��r��me Duval, jerome.duval@free.fr
816ed1e1dSAxel Dörfler *		Axel D��rfler, axeld@pinc-software.de
92222864eSStephan Aßmus *		Stephan A��mus <superstippi@gmx.de>
1016ed1e1dSAxel Dörfler */
1116ed1e1dSAxel Dörfler#ifndef SERVER_FONT_H
1216ed1e1dSAxel Dörfler#define SERVER_FONT_H
1316ed1e1dSAxel Dörfler
1416ed1e1dSAxel Dörfler
1516ed1e1dSAxel Dörfler#include <Font.h>
1616ed1e1dSAxel Dörfler#include <Rect.h>
1716ed1e1dSAxel Dörfler
1816ed1e1dSAxel Dörfler#include "FontFamily.h"
19e4737a92SAxel Dörfler#include "GlobalSubpixelSettings.h"
202222864eSStephan Aßmus#include "Transformable.h"
2116ed1e1dSAxel Dörfler
2216ed1e1dSAxel Dörflerclass BShape;
2316ed1e1dSAxel Dörflerclass BString;
2416ed1e1dSAxel Dörfler
2516ed1e1dSAxel Dörfler
2616ed1e1dSAxel Dörflerclass ServerFont {
2716ed1e1dSAxel Dörfler public:
2816ed1e1dSAxel Dörfler								ServerFont();
2916ed1e1dSAxel Dörfler								ServerFont(FontStyle& style,
309dad3fb4SMichael Lotz									float size = 12.0, float rotation = 0.0,
319dad3fb4SMichael Lotz									float shear = 90.0,
329dad3fb4SMichael Lotz									float falseBoldWidth = 0.0,
339dad3fb4SMichael Lotz									uint16 flags = 0,
349dad3fb4SMichael Lotz									uint8 spacing = B_BITMAP_SPACING);
3516ed1e1dSAxel Dörfler								ServerFont(const ServerFont& font);
3616ed1e1dSAxel Dörfler	virtual						~ServerFont();
3716ed1e1dSAxel Dörfler
3816ed1e1dSAxel Dörfler			ServerFont			&operator=(const ServerFont& font);
3968667bf4SMichael Lotz			bool				operator==(const ServerFont& other) const;
4016ed1e1dSAxel Dörfler
4116ed1e1dSAxel Dörfler			font_direction		Direction() const
4216ed1e1dSAxel Dörfler									{ return fDirection; }
4316ed1e1dSAxel Dörfler			uint32				Encoding() const
4416ed1e1dSAxel Dörfler									{ return fEncoding; }
4516ed1e1dSAxel Dörfler			uint32				Flags() const
4616ed1e1dSAxel Dörfler									{ return fFlags; }
4716ed1e1dSAxel Dörfler			uint32				Spacing() const
4816ed1e1dSAxel Dörfler									{ return fSpacing; }
4916ed1e1dSAxel Dörfler			float				Shear() const
5016ed1e1dSAxel Dörfler									{ return fShear; }
5116ed1e1dSAxel Dörfler			float				Rotation() const
5216ed1e1dSAxel Dörfler									{ return fRotation; }
5310f6ed94SStephan Aßmus			float				FalseBoldWidth() const
5410f6ed94SStephan Aßmus									{ return fFalseBoldWidth; }
5516ed1e1dSAxel Dörfler			float				Size() const
5616ed1e1dSAxel Dörfler									{ return fSize; }
5716ed1e1dSAxel Dörfler			uint16				Face() const
5816ed1e1dSAxel Dörfler									{ return fFace; }
5916ed1e1dSAxel Dörfler			uint32				CountGlyphs()
6016ed1e1dSAxel Dörfler									{ return fStyle->GlyphCount(); }
6116ed1e1dSAxel Dörfler			int32				CountTuned();
6216ed1e1dSAxel Dörfler
6316ed1e1dSAxel Dörfler			font_file_format	FileFormat();
6416ed1e1dSAxel Dörfler
6516ed1e1dSAxel Dörfler			const char*			Style() const;
6616ed1e1dSAxel Dörfler			const char*			Family() const;
6716ed1e1dSAxel Dörfler			const char*			Path() const
6816ed1e1dSAxel Dörfler									{ return fStyle->Path(); }
6916ed1e1dSAxel Dörfler
7016ed1e1dSAxel Dörfler			void				SetStyle(FontStyle* style);
7116ed1e1dSAxel Dörfler			status_t			SetFamilyAndStyle(uint16 familyID,
729dad3fb4SMichael Lotz									uint16 styleID);
7316ed1e1dSAxel Dörfler			status_t			SetFamilyAndStyle(uint32 fontID);
7416ed1e1dSAxel Dörfler
7516ed1e1dSAxel Dörfler			uint16				StyleID() const
7616ed1e1dSAxel Dörfler									{ return fStyle->ID(); }
7716ed1e1dSAxel Dörfler			uint16				FamilyID() const
7816ed1e1dSAxel Dörfler									{ return fStyle->Family()->ID(); }
7916ed1e1dSAxel Dörfler			uint32				GetFamilyAndStyle() const;
8016ed1e1dSAxel Dörfler
8116ed1e1dSAxel Dörfler			void				SetDirection(font_direction dir)
8216ed1e1dSAxel Dörfler									{ fDirection = dir; }
8316ed1e1dSAxel Dörfler			void				SetEncoding(uint32 encoding)
8416ed1e1dSAxel Dörfler									{ fEncoding = encoding; }
8516ed1e1dSAxel Dörfler			void				SetFlags(uint32 value)
8616ed1e1dSAxel Dörfler									{ fFlags = value; }
8716ed1e1dSAxel Dörfler			void				SetSpacing(uint32 value)
8816ed1e1dSAxel Dörfler									{ fSpacing = value; }
8916ed1e1dSAxel Dörfler			void				SetShear(float value)
9016ed1e1dSAxel Dörfler									{ fShear = value; }
9116ed1e1dSAxel Dörfler			void				SetSize(float value)
9216ed1e1dSAxel Dörfler									{ fSize = value; }
9316ed1e1dSAxel Dörfler			void				SetRotation(float value)
9416ed1e1dSAxel Dörfler									{ fRotation = value; }
9510f6ed94SStephan Aßmus			void				SetFalseBoldWidth(float value)
9610f6ed94SStephan Aßmus									{ fFalseBoldWidth = value; }
975b30a26bSStephan Aßmus			status_t			SetFace(uint16 face);
9816ed1e1dSAxel Dörfler
9916ed1e1dSAxel Dörfler			bool				IsFixedWidth() const
10016ed1e1dSAxel Dörfler									{ return fStyle->IsFixedWidth(); }
10116ed1e1dSAxel Dörfler			bool				IsScalable() const
10216ed1e1dSAxel Dörfler									{ return fStyle->IsScalable(); }
10316ed1e1dSAxel Dörfler			bool				HasKerning() const
10416ed1e1dSAxel Dörfler									{ return fStyle->HasKerning(); }
10516ed1e1dSAxel Dörfler			bool				HasTuned() const
10616ed1e1dSAxel Dörfler									{ return fStyle->HasTuned(); }
10716ed1e1dSAxel Dörfler			int32				TunedCount() const
10816ed1e1dSAxel Dörfler									{ return fStyle->TunedCount(); }
10916ed1e1dSAxel Dörfler			uint16				GlyphCount() const
11016ed1e1dSAxel Dörfler									{ return fStyle->GlyphCount(); }
11116ed1e1dSAxel Dörfler			uint16				CharMapCount() const
11216ed1e1dSAxel Dörfler									{ return fStyle->CharMapCount(); }
113e4737a92SAxel Dörfler	inline	bool				Hinting() const;
11416ed1e1dSAxel Dörfler
11516ed1e1dSAxel Dörfler			status_t			GetGlyphShapes(const char charArray[],
11616ed1e1dSAxel Dörfler									int32 numChars, BShape *shapeArray[]) const;
11716ed1e1dSAxel Dörfler
118e4737a92SAxel Dörfler			status_t			GetHasGlyphs(const char charArray[],
1198071db32SMichael Lotz									int32 numBytes, int32 numChars,
1208071db32SMichael Lotz									bool hasArray[]) const;
121e4737a92SAxel Dörfler
122aadc09c6SStephan Aßmus			status_t			GetEdges(const char charArray[], int32 numBytes,
1238071db32SMichael Lotz									int32 numChars, edge_info edgeArray[])
1248071db32SMichael Lotz									const;
12516ed1e1dSAxel Dörfler
12616ed1e1dSAxel Dörfler			status_t			GetEscapements(const char charArray[],
127a4de7fa0SAxel Dörfler									int32 numBytes, int32 numChars,
128a4de7fa0SAxel Dörfler									escapement_delta delta,
12916ed1e1dSAxel Dörfler									BPoint escapementArray[],
13016ed1e1dSAxel Dörfler									BPoint offsetArray[]) const;
13116ed1e1dSAxel Dörfler
13216ed1e1dSAxel Dörfler			status_t			GetEscapements(const char charArray[],
133a4de7fa0SAxel Dörfler									int32 numBytes, int32 numChars,
134a4de7fa0SAxel Dörfler									escapement_delta delta,
13516ed1e1dSAxel Dörfler									float widthArray[]) const;
13616ed1e1dSAxel Dörfler
1372222864eSStephan Aßmus			status_t			GetBoundingBoxes(const char charArray[],
1388071db32SMichael Lotz									int32 numBytes, int32 numChars,
1398071db32SMichael Lotz									BRect rectArray[], bool stringEscapement,
1405fdc05c1SStephan Aßmus									font_metric_mode mode,
1412222864eSStephan Aßmus									escapement_delta delta,
1422222864eSStephan Aßmus									bool asString);
14316ed1e1dSAxel Dörfler
14416ed1e1dSAxel Dörfler			status_t			GetBoundingBoxesForStrings(char *charArray[],
14522ce5525SMichael Lotz									size_t lengthArray[], int32 numStrings,
14616ed1e1dSAxel Dörfler									BRect rectArray[], font_metric_mode mode,
14716ed1e1dSAxel Dörfler									escapement_delta deltaArray[]);
14816ed1e1dSAxel Dörfler
1495fdc05c1SStephan Aßmus			float				StringWidth(const char *string,
150aadc09c6SStephan Aßmus									int32 numBytes,
1512222864eSStephan Aßmus									const escapement_delta* delta = NULL) const;
15216ed1e1dSAxel Dörfler
15316ed1e1dSAxel Dörfler			bool				Lock() const { return fStyle->Lock(); }
15416ed1e1dSAxel Dörfler			void				Unlock() const { fStyle->Unlock(); }
15516ed1e1dSAxel Dörfler
156aadc09c6SStephan Aßmus//			FT_Face				GetFTFace() const
157aadc09c6SStephan Aßmus//									{ return fStyle->FreeTypeFace(); };
158e4737a92SAxel Dörfler
15916ed1e1dSAxel Dörfler			BRect				BoundingBox();
16016ed1e1dSAxel Dörfler			void				GetHeight(font_height& height) const;
16116ed1e1dSAxel Dörfler
16216ed1e1dSAxel Dörfler			void				TruncateString(BString* inOut,
1639dad3fb4SMichael Lotz									uint32 mode, float width) const;
16416ed1e1dSAxel Dörfler
1652222864eSStephan Aßmus			Transformable		EmbeddedTransformation() const;
1669dad3fb4SMichael Lotz			status_t			GetUnicodeBlocks(unicode_block &blocksForFont);
1679dad3fb4SMichael Lotz			status_t			IncludesUnicodeBlock(uint32 start, uint32 end,
1689dad3fb4SMichael Lotz									bool &hasBlock);
1692222864eSStephan Aßmus
17016ed1e1dSAxel Dörflerprotected:
17116ed1e1dSAxel Dörfler	friend class FontStyle;
1722637ecd5SStefano Ceccherini			FT_Face				GetTransformedFace(bool rotate,
1732637ecd5SStefano Ceccherini									bool shear) const;
1742637ecd5SStefano Ceccherini			void				PutTransformedFace(FT_Face face) const;
1759dad3fb4SMichael Lotz
17616ed1e1dSAxel Dörfler			FontStyle*			fStyle;
17716ed1e1dSAxel Dörfler			float				fSize;
17816ed1e1dSAxel Dörfler			float				fRotation;
17916ed1e1dSAxel Dörfler			float				fShear;
18010f6ed94SStephan Aßmus			float				fFalseBoldWidth;
18116ed1e1dSAxel Dörfler			BRect				fBounds;
18216ed1e1dSAxel Dörfler			uint32				fFlags;
18316ed1e1dSAxel Dörfler			uint32				fSpacing;
18416ed1e1dSAxel Dörfler			font_direction		fDirection;
18516ed1e1dSAxel Dörfler			uint16				fFace;
18616ed1e1dSAxel Dörfler			uint32				fEncoding;
18716ed1e1dSAxel Dörfler};
18816ed1e1dSAxel Dörfler
189e4737a92SAxel Dörflerinline bool ServerFont::Hinting() const
190e4737a92SAxel Dörfler{
191e4737a92SAxel Dörfler	switch (gDefaultHintingMode) {
192e4737a92SAxel Dörfler		case HINTING_MODE_OFF:
193e4737a92SAxel Dörfler			return false;
194e4737a92SAxel Dörfler		default:
195e4737a92SAxel Dörfler		case HINTING_MODE_ON:
196e4737a92SAxel Dörfler			return true;
197e4737a92SAxel Dörfler		case HINTING_MODE_MONOSPACED_ONLY:
198e4737a92SAxel Dörfler			return IsFixedWidth();
199e4737a92SAxel Dörfler	}
200e4737a92SAxel Dörfler}
201e4737a92SAxel Dörfler
20216ed1e1dSAxel Dörfler#endif	/* SERVER_FONT_H */
203