aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/llrender/llfontregistry.h
blob: 67a529f9af634ab20a60e2247a8c35ff18d34d97 (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
/** 
 * @file llfontregistry.h
 * @author Brad Payne
 * @brief Storage for fonts.
 *
 * $LicenseInfo:firstyear=2008&license=viewergpl$
 * 
 * Copyright (c) 2008-2009, 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_LLFONTREGISTRY_H
#define LL_LLFONTREGISTRY_H

#include "llxmlnode.h"

class LLFontGL;

typedef std::vector<std::string> string_vec_t;

class LLFontDescriptor
{
public:
	LLFontDescriptor();
	LLFontDescriptor(const std::string& name, const std::string& size, const U8 style);
	LLFontDescriptor(const std::string& name, const std::string& size, const U8 style, const string_vec_t& file_names);
	LLFontDescriptor normalize() const;

	bool operator<(const LLFontDescriptor& b) const;

	bool isTemplate() const;
	
	const std::string& getName() const { return mName; }
	void setName(const std::string& name) { mName = name; }
	const std::string& getSize() const { return mSize; }
	void setSize(const std::string& size) { mSize = size; }
	F32 getSizeMult() const { return mSizeMult; }
	void setSizeMult(F32 size_mult) { mSizeMult = size_mult; }

	const std::vector<std::string>& getFileNames() const { return mFileNames; }
	std::vector<std::string>& getFileNames() { return mFileNames; }
	const U8 getStyle() const { return mStyle; }
	void setStyle(U8 style) { mStyle = style; }

private:
	std::string mName;
	std::string mSize;
	F32 mSizeMult;
	string_vec_t mFileNames;
	U8 mStyle;
};

class LLFontRegistry
{
public:
	LLFontRegistry(const string_vec_t& xui_paths);
	~LLFontRegistry();

	// Load standard font info from XML file(s).
	bool parseFontInfo(const std::string& xml_filename); 
	bool initFromXML(LLXMLNodePtr node);

	// Clear cached glyphs for all fonts.
	void reset();

	// Destroy all fonts.
	void clear();

	// GL cleanup
	void destroyGL();
		
	LLFontGL *getFont(const LLFontDescriptor& desc);
	const LLFontDescriptor *getMatchingFontDesc(const LLFontDescriptor& desc);
	const LLFontDescriptor *getClosestFontTemplate(const LLFontDescriptor& desc);

	bool nameToSize(const std::string& size_name, F32& size);

	void dump();
	
	const string_vec_t& getUltimateFallbackList() const { return mUltimateFallbackList; }

	// If alias_name is a defined alias, returns the original name.
	// Otherwise returns alias_name itself.
	std::string expandAlias(std::string alias_name);
	// Define alias_name as an alias of orig_name.
	void setAlias(std::string alias_name, std::string orig_name);
	// Undefines the alias alias_name. Does nothing if it's not an alias.
	void clearAlias(std::string alias_name);
	// True if the alias is defined.
	bool hasAlias(std::string alias_name);


private:
	LLFontGL *createFont(const LLFontDescriptor& desc);
	typedef std::map<LLFontDescriptor,LLFontGL*> font_reg_map_t;
	typedef std::map<std::string,F32> font_size_map_t;
	typedef std::map<std::string,std::string> font_alias_map_t;

	// Given a descriptor, look up specific font instantiation.
	font_reg_map_t mFontMap;
	// Given a size name, look up the point size.
	font_size_map_t mFontSizes;
	// Given an alias name, look up the original name.
	font_alias_map_t mFontAliases;

	string_vec_t mUltimateFallbackList;
	string_vec_t mXUIPaths;
};

#endif // LL_LLFONTREGISTRY_H