Line data Source code
1 : /* GRAPHITE2 LICENSING
2 :
3 : Copyright 2010, SIL International
4 : All rights reserved.
5 :
6 : This library is free software; you can redistribute it and/or modify
7 : it under the terms of the GNU Lesser General Public License as published
8 : by the Free Software Foundation; either version 2.1 of License, or
9 : (at your option) any later version.
10 :
11 : This program is distributed in the hope that it will be useful,
12 : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : Lesser General Public License for more details.
15 :
16 : You should also have received a copy of the GNU Lesser General Public
17 : License along with this library in the file named "LICENSE".
18 : If not, write to the Free Software Foundation, 51 Franklin Street,
19 : Suite 500, Boston, MA 02110-1335, USA or visit their web page on the
20 : internet at http://www.fsf.org/licenses/lgpl.html.
21 :
22 : Alternatively, the contents of this file may be used under the terms of the
23 : Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public
24 : License, as published by the Free Software Foundation, either version 2
25 : of the License or (at your option) any later version.
26 : */
27 : #pragma once
28 : #include <cassert>
29 : #include "graphite2/Font.h"
30 : #include "inc/Main.h"
31 : #include "inc/Face.h"
32 :
33 : namespace graphite2 {
34 :
35 : #define INVALID_ADVANCE -1e38f // can't be a static const because non-integral
36 :
37 : class Font
38 : {
39 : public:
40 : Font(float ppm, const Face & face, const void * appFontHandle=0, const gr_font_ops * ops=0);
41 : virtual ~Font();
42 :
43 : float advance(unsigned short glyphid) const;
44 : float scale() const;
45 : bool isHinted() const;
46 : const Face & face() const;
47 :
48 0 : CLASS_NEW_DELETE;
49 : private:
50 : gr_font_ops m_ops;
51 : const void * const m_appFontHandle;
52 : float * m_advances; // One advance per glyph in pixels. Nan if not defined
53 : const Face & m_face;
54 : float m_scale; // scales from design units to ppm
55 : bool m_hinted;
56 :
57 : Font(const Font&);
58 : Font& operator=(const Font&);
59 : };
60 :
61 : inline
62 0 : float Font::advance(unsigned short glyphid) const
63 : {
64 0 : if (m_advances[glyphid] == INVALID_ADVANCE)
65 0 : m_advances[glyphid] = (*m_ops.glyph_advance_x)(m_appFontHandle, glyphid);
66 0 : return m_advances[glyphid];
67 : }
68 :
69 : inline
70 0 : float Font::scale() const
71 : {
72 0 : return m_scale;
73 : }
74 :
75 : inline
76 0 : bool Font::isHinted() const
77 : {
78 0 : return m_hinted;
79 : }
80 :
81 : inline
82 0 : const Face & Font::face() const
83 : {
84 0 : return m_face;
85 : }
86 :
87 : } // namespace graphite2
88 :
89 : struct gr_font : public graphite2::Font {};
|