1 | /* Pango |
2 | * pangocairo-fontmap.c: Cairo font handling, fontconfig backend |
3 | * |
4 | * Copyright (C) 2000-2005 Red Hat Software |
5 | * |
6 | * This library is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Library General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2 of the License, or (at your option) any later version. |
10 | * |
11 | * This library 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 | * Library General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Library General Public |
17 | * License along with this library; if not, write to the |
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
19 | * Boston, MA 02111-1307, USA. |
20 | */ |
21 | #include "config.h" |
22 | |
23 | /* Freetype has undefined macros in its headers */ |
24 | #pragma GCC diagnostic push |
25 | #pragma GCC diagnostic ignored "-Wundef" |
26 | #include <cairo-ft.h> |
27 | #pragma GCC diagnostic pop |
28 | |
29 | #include "pangofc-fontmap-private.h" |
30 | #include "pangocairo.h" |
31 | #include "pangocairo-private.h" |
32 | #include "pangocairo-fc-private.h" |
33 | |
34 | typedef struct _PangoCairoFcFontMapClass PangoCairoFcFontMapClass; |
35 | |
36 | struct _PangoCairoFcFontMapClass |
37 | { |
38 | PangoFcFontMapClass parent_class; |
39 | }; |
40 | |
41 | static guint |
42 | pango_cairo_fc_font_map_get_serial (PangoFontMap *fontmap) |
43 | { |
44 | PangoCairoFcFontMap *cffontmap = (PangoCairoFcFontMap *) (fontmap); |
45 | |
46 | return cffontmap->serial; |
47 | } |
48 | |
49 | static void |
50 | pango_cairo_fc_font_map_changed (PangoFontMap *fontmap) |
51 | { |
52 | PangoCairoFcFontMap *cffontmap = (PangoCairoFcFontMap *) (fontmap); |
53 | |
54 | cffontmap->serial++; |
55 | if (cffontmap->serial == 0) |
56 | cffontmap->serial++; |
57 | } |
58 | |
59 | static void |
60 | pango_cairo_fc_font_map_set_resolution (PangoCairoFontMap *cfontmap, |
61 | double dpi) |
62 | { |
63 | PangoCairoFcFontMap *cffontmap = (PangoCairoFcFontMap *) (cfontmap); |
64 | |
65 | if (dpi != cffontmap->dpi) |
66 | { |
67 | cffontmap->serial++; |
68 | if (cffontmap->serial == 0) |
69 | cffontmap->serial++; |
70 | cffontmap->dpi = dpi; |
71 | |
72 | pango_fc_font_map_cache_clear (fcfontmap: (PangoFcFontMap *) (cfontmap)); |
73 | } |
74 | } |
75 | |
76 | static double |
77 | pango_cairo_fc_font_map_get_resolution_cairo (PangoCairoFontMap *cfontmap) |
78 | { |
79 | PangoCairoFcFontMap *cffontmap = (PangoCairoFcFontMap *) (cfontmap); |
80 | |
81 | return cffontmap->dpi; |
82 | } |
83 | |
84 | static cairo_font_type_t |
85 | pango_cairo_fc_font_map_get_font_type (PangoCairoFontMap *cfontmap G_GNUC_UNUSED) |
86 | { |
87 | return CAIRO_FONT_TYPE_FT; |
88 | } |
89 | |
90 | static void |
91 | cairo_font_map_iface_init (PangoCairoFontMapIface *iface) |
92 | { |
93 | iface->set_resolution = pango_cairo_fc_font_map_set_resolution; |
94 | iface->get_resolution = pango_cairo_fc_font_map_get_resolution_cairo; |
95 | iface->get_font_type = pango_cairo_fc_font_map_get_font_type; |
96 | } |
97 | |
98 | G_DEFINE_TYPE_WITH_CODE (PangoCairoFcFontMap, pango_cairo_fc_font_map, PANGO_TYPE_FC_FONT_MAP, |
99 | { G_IMPLEMENT_INTERFACE (PANGO_TYPE_CAIRO_FONT_MAP, cairo_font_map_iface_init) }) |
100 | |
101 | static void |
102 | pango_cairo_fc_font_map_fontset_key_substitute (PangoFcFontMap *fcfontmap G_GNUC_UNUSED, |
103 | PangoFcFontsetKey *fontkey, |
104 | FcPattern *pattern) |
105 | { |
106 | FcConfigSubstitute (config: pango_fc_font_map_get_config (fcfontmap), p: pattern, kind: FcMatchPattern); |
107 | |
108 | if (fcfontmap->substitute_func) |
109 | fcfontmap->substitute_func (pattern, fcfontmap->substitute_data); |
110 | if (fontkey) |
111 | cairo_ft_font_options_substitute (options: pango_fc_fontset_key_get_context_key (key: fontkey), |
112 | pattern); |
113 | |
114 | FcDefaultSubstitute (pattern); |
115 | } |
116 | |
117 | static double |
118 | pango_cairo_fc_font_map_get_resolution_fc (PangoFcFontMap *fcfontmap, |
119 | PangoContext *context) |
120 | { |
121 | PangoCairoFcFontMap *cffontmap = (PangoCairoFcFontMap *) (fcfontmap); |
122 | double dpi; |
123 | |
124 | if (context) |
125 | { |
126 | dpi = pango_cairo_context_get_resolution (context); |
127 | |
128 | if (dpi <= 0) |
129 | dpi = cffontmap->dpi; |
130 | } |
131 | else |
132 | dpi = cffontmap->dpi; |
133 | |
134 | return dpi; |
135 | } |
136 | |
137 | static gconstpointer |
138 | pango_cairo_fc_font_map_context_key_get (PangoFcFontMap *fcfontmap G_GNUC_UNUSED, |
139 | PangoContext *context) |
140 | { |
141 | return _pango_cairo_context_get_merged_font_options (context); |
142 | } |
143 | |
144 | static gpointer |
145 | pango_cairo_fc_font_map_context_key_copy (PangoFcFontMap *fcfontmap G_GNUC_UNUSED, |
146 | gconstpointer key) |
147 | { |
148 | return cairo_font_options_copy (original: key); |
149 | } |
150 | |
151 | static void |
152 | pango_cairo_fc_font_map_context_key_free (PangoFcFontMap *fcfontmap G_GNUC_UNUSED, |
153 | gpointer key) |
154 | { |
155 | cairo_font_options_destroy (options: key); |
156 | } |
157 | |
158 | |
159 | static guint32 |
160 | pango_cairo_fc_font_map_context_key_hash (PangoFcFontMap *fcfontmap G_GNUC_UNUSED, |
161 | gconstpointer key) |
162 | { |
163 | return (guint32)cairo_font_options_hash (options: key); |
164 | } |
165 | |
166 | static gboolean |
167 | pango_cairo_fc_font_map_context_key_equal (PangoFcFontMap *fcfontmap G_GNUC_UNUSED, |
168 | gconstpointer key_a, |
169 | gconstpointer key_b) |
170 | { |
171 | return cairo_font_options_equal (options: key_a, other: key_b); |
172 | } |
173 | |
174 | static PangoFcFont * |
175 | pango_cairo_fc_font_map_create_font (PangoFcFontMap *fcfontmap, |
176 | PangoFcFontKey *key) |
177 | { |
178 | return _pango_cairo_fc_font_new (cffontmap: (PangoCairoFcFontMap *) (fcfontmap), |
179 | key); |
180 | } |
181 | |
182 | static void |
183 | pango_cairo_fc_font_map_class_init (PangoCairoFcFontMapClass *class) |
184 | { |
185 | PangoFontMapClass *fontmap_class = PANGO_FONT_MAP_CLASS (class); |
186 | PangoFcFontMapClass *fcfontmap_class = PANGO_FC_FONT_MAP_CLASS (class); |
187 | |
188 | fontmap_class->get_serial = pango_cairo_fc_font_map_get_serial; |
189 | fontmap_class->changed = pango_cairo_fc_font_map_changed; |
190 | |
191 | fcfontmap_class->fontset_key_substitute = pango_cairo_fc_font_map_fontset_key_substitute; |
192 | fcfontmap_class->get_resolution = pango_cairo_fc_font_map_get_resolution_fc; |
193 | |
194 | fcfontmap_class->context_key_get = pango_cairo_fc_font_map_context_key_get; |
195 | fcfontmap_class->context_key_copy = pango_cairo_fc_font_map_context_key_copy; |
196 | fcfontmap_class->context_key_free = pango_cairo_fc_font_map_context_key_free; |
197 | fcfontmap_class->context_key_hash = pango_cairo_fc_font_map_context_key_hash; |
198 | fcfontmap_class->context_key_equal = pango_cairo_fc_font_map_context_key_equal; |
199 | |
200 | fcfontmap_class->create_font = pango_cairo_fc_font_map_create_font; |
201 | } |
202 | |
203 | static void |
204 | pango_cairo_fc_font_map_init (PangoCairoFcFontMap *cffontmap) |
205 | { |
206 | cffontmap->serial = 1; |
207 | cffontmap->dpi = 96.0; |
208 | } |
209 | |