1// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later
2// Copyright 2010, SIL International, All rights reserved.
3
4#pragma once
5#include <cassert>
6#include "graphite2/Font.h"
7#include "inc/Main.h"
8#include "inc/Face.h"
9
10namespace graphite2 {
11
12#define INVALID_ADVANCE -1e38f // can't be a static const because non-integral
13
14class Font
15{
16public:
17 Font(float ppm, const Face & face, const void * appFontHandle=0, const gr_font_ops * ops=0);
18 virtual ~Font();
19
20 float advance(unsigned short glyphid) const;
21 float scale() const;
22 bool isHinted() const;
23 const Face & face() const;
24 operator bool () const throw() { return m_advances; }
25
26 CLASS_NEW_DELETE;
27private:
28 gr_font_ops m_ops;
29 const void * const m_appFontHandle;
30 float * m_advances; // One advance per glyph in pixels. Nan if not defined
31 const Face & m_face;
32 float m_scale; // scales from design units to ppm
33 bool m_hinted;
34
35 Font(const Font&);
36 Font& operator=(const Font&);
37};
38
39inline
40float Font::advance(unsigned short glyphid) const
41{
42 if (m_advances[glyphid] == INVALID_ADVANCE)
43 m_advances[glyphid] = (*m_ops.glyph_advance_x)(m_appFontHandle, glyphid);
44 return m_advances[glyphid];
45}
46
47inline
48float Font::scale() const
49{
50 return m_scale;
51}
52
53inline
54bool Font::isHinted() const
55{
56 return m_hinted;
57}
58
59inline
60const Face & Font::face() const
61{
62 return m_face;
63}
64
65} // namespace graphite2
66
67struct gr_font : public graphite2::Font {};
68