aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/llrender/llfont.h
blob: 071e508b487758474f7605fa60856350dab1410e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/** 
 * @file llfont.h
 * @brief Font library wrapper
 *
 * $LicenseInfo:firstyear=2002&license=viewergpl$
 * 
 * Copyright (c) 2002-2008, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 * $/LicenseInfo$
 */

#ifndef LL_LLFONT_H
#define LL_LLFONT_H

#include <map>
//#include "lllocalidhashmap.h"
#include "llmemory.h"
#include "llstl.h"

class LLImageRaw;
class LLFontManager;
class LLFont;

// Hack.  FT_Face is just a typedef for a pointer to a struct,
// but there's no simple forward declarations file for FreeType, 
// and the main include file is 200K.  
// We'll forward declare the struct here.  JC
struct FT_FaceRec_;
typedef struct FT_FaceRec_* LLFT_Face;

extern LLFontManager *gFontManagerp;

class LLFontManager
{
public:
	static void initClass();
	static void cleanupClass();
	
public:
	LLFontManager();
	virtual ~LLFontManager();
};

class LLFontGlyphInfo
{
public:
	LLFontGlyphInfo(U32 index);
public:
	U32 mGlyphIndex;
	// Metrics
	S32 mWidth;			// In pixels
	S32 mHeight;		// In pixels
	F32 mXAdvance;		// In pixels
	F32 mYAdvance;		// In pixels

	// Information for actually rendering
	BOOL mIsRendered;	// We actually have rendered this glyph
	S32 mXBitmapOffset; // Offset to the origin in the bitmap
	S32 mYBitmapOffset; // Offset to the origin in the bitmap
	S32 mXBearing;	// Distance from baseline to left in pixels
	S32 mYBearing;	// Distance from baseline to top in pixels
};

// Used for lists of fallback fonts
class LLFontList : public std::vector<LLFont*>
{
public:
	LLFontList();
	~LLFontList();
	void addAtEnd(LLFont *font);
};


class LLFont
{
public:
	LLFont(LLImageRaw *imagep = NULL);
	virtual ~LLFont();

	// is_fallback should be true for fallback fonts that aren't used to render directly (Unicode backup, primarily)
	virtual BOOL loadFace(const std::string& filename,
							const F32 point_size,
							const F32 vert_dpi,
							const F32 horz_dpi,
							const S32 components,
							BOOL is_fallback);
	void setFallbackFont(LLFontList *fontp)		{ mFallbackFontp = fontp; }

	void setCharToGlyphMap(llwchar wch, U32 glyph_index) const;
	void setRawImage( LLImageRaw *imagep );

	// Global font metrics - in units of pixels
	virtual F32 getLineHeight() const;
	virtual F32 getAscenderHeight() const;
	virtual F32 getDescenderHeight() const;


// For a lowercase "g":
//
//	------------------------------
//	                     ^     ^
//						 |     |
//				xxx x    |Ascender
//	           x   x     |     |
//	---------   xxxx-------------- Baseline
//	^		       x	 |     |
//  | descender    x     |     |
//	v			xxxx     v     |LineHeight
//  -----------------------    |
//                             v
//	------------------------------

	enum
	{
		FIRST_CHAR = 32, 
		NUM_CHARS = 127 - 32, 
		LAST_CHAR_BASIC = 127,

		// Need full 8-bit ascii range for spanish
		NUM_CHARS_FULL = 255 - 32,
		LAST_CHAR_FULL = 255
	};

	const LLFontGlyphInfo &getMetrics(const llwchar wc) const;
	F32 getXAdvance(const llwchar wc) const;
	F32 getXKerning(const llwchar char_left, const llwchar char_right) const; // Get the kerning between the two characters
protected:
	virtual BOOL hasGlyph(const llwchar wch) const;		// Has a glyph for this character
	virtual BOOL addChar(const llwchar wch);		// Add a new character to the font if necessary
	virtual BOOL addGlyph(const llwchar wch, const U32 glyph_index);	// Add a new glyph to the existing font
	virtual BOOL addGlyphFromFont(LLFont *fontp, const llwchar wch, const U32 glyph_index);	// Add a glyph from this font to the other (returns the glyph_index, 0 if not found)

	virtual LLFontGlyphInfo* getGlyphInfo(const llwchar wch) const;

	void insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const;
	void renderGlyph(const U32 glyph_index);

	void resetBitmap();	// Reset bitmap to contain only the null glyph
protected:
	std::string mName;
	F32 mAscender;			
	F32 mDescender;
	F32 mLineHeight;

	S32 mNumComponents;
	S32 mBitmapWidth;
	S32 mBitmapHeight;
	S32 mMaxCharWidth;
	S32 mMaxCharHeight;
	S32 mCurrentOffsetX;
	S32 mCurrentOffsetY;

	LLFT_Face mFTFace;

	BOOL mIsFallback;
	LLFontList *mFallbackFontp; // A list of fallback fonts to look for glyphs in (for Unicode chars)

	typedef std::map<llwchar, LLFontGlyphInfo*> char_glyph_info_map_t;
	mutable char_glyph_info_map_t mCharGlyphInfoMap; // Information about glyph location in bitmap

	BOOL mValid;
	void setSubImageLuminanceAlpha(const U32 x,
				       const U32 y,
				       const U32 width,
				       const U32 height,
				       const U8 *data,
				       S32 stride = 0);

private:
	LLPointer<LLImageRaw> mRawImagep;	// Bitmaps of glyphs are stored here.
};

#endif // LL_FONT_