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/*needed for scaling*/);
41 : virtual ~Font();
42 :
43 0 : float advance(unsigned short glyphid) const {
44 0 : if (m_advances[glyphid] == INVALID_ADVANCE)
45 0 : m_advances[glyphid] = computeAdvance(glyphid);
46 0 : return m_advances[glyphid];
47 : }
48 : // Position scale(const Position& p) const { return Position(m_scale * p.x, m_scale * p.y); }
49 : // float scale(float p) const { return m_scale * p; }
50 0 : float scale() const { return m_scale; }
51 0 : virtual bool isHinted() const { return false; }
52 :
53 0 : CLASS_NEW_DELETE
54 : private:
55 0 : virtual float computeAdvance(unsigned short /*glyphid*/) const { assert(false); return .0f; };
56 :
57 : protected:
58 : float m_scale; // scales from design units to ppm
59 : float *m_advances; // One advance per glyph in pixels. Nan if not defined
60 :
61 : private: //defensive on m_advances
62 : Font(const Font&);
63 : Font& operator=(const Font&);
64 : };
65 :
66 :
67 : class SimpleFont : public Font //has no external hints - gets advance information from the face
68 0 : {
69 : public:
70 : SimpleFont(float ppm/*pixels per em*/, const Face *face);
71 : private:
72 : virtual float computeAdvance(unsigned short glyphid) const;
73 : private:
74 : const Face *m_face; // GrFace to get the rest of the info from
75 : };
76 :
77 :
78 : class HintedFont : public Font
79 0 : {
80 : public:
81 : HintedFont(float ppm/*pixels per em*/, const void* appFontHandle/*non-NULL*/, gr_advance_fn advance, const Face *face/*needed for scaling*/);
82 0 : virtual bool isHinted() const { return true; }
83 : private:
84 : virtual float computeAdvance(unsigned short glyphid) const;
85 :
86 : private:
87 : const void* m_appFontHandle/*non-NULL*/;
88 : gr_advance_fn m_advance;
89 : };
90 :
91 : } // namespace graphite2
92 :
93 : struct gr_font : public graphite2::Font {};
|