1 /* Dia -- an diagram creation/manipulation program
2 * Copyright (C) 1998 Alexander Larsson
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 #include <glib-object.h>
24 #include <pango/pango.h>
25 #include "dia-enums.h"
29 /* Do NOT put these strings through the .po mechanism. If you need to add
30 non-Roman alternatives, please insert them in the list */
31 #define BASIC_SANS_FONT "arial, helvetica, helv, sans"
32 #define BASIC_SERIF_FONT "times new roman, times, serif"
33 #define BASIC_MONOSPACE_FONT "courier new, courier, monospace, fixed"
37 * In a goodly selection of fonts, 500 is very common, yet Pango doesn't name it.
38 * I am calling 500 'medium' and 600 'demibold'.
39 * We should really have a more flexible system where 300 or 400 is normal,
40 * the next one up bold, or something. But this will do for now.
41 * We should probably store the actual weight...
44 /* We are having DIA_FONT_WEIGHT_NORMAL be 0 to avoid having to do
45 * DIA_FONT_MONOSPACE | DIA_FONT_WEIGHT_NORMAL all over the place.
46 * This introduces a few hacks in font.c and widgets.c, but not too
50 /* storing different style info like
51 * (DIA_FONT_SANS | DIA_FONT_ITALIC | DIA_FONT_BOLD)
53 typedef guint DiaFontStyle
;
57 DIA_FONT_FAMILY_ANY
= 0,
60 DIA_FONT_MONOSPACE
= 3
65 DIA_FONT_NORMAL
= (0<<2),
66 DIA_FONT_OBLIQUE
= (1<<2),
67 DIA_FONT_ITALIC
= (2<<2)
72 DIA_FONT_ULTRALIGHT
= (1<<4),
73 DIA_FONT_LIGHT
= (2<<4),
74 DIA_FONT_WEIGHT_NORMAL
= (0<<4), /* Deliberately 0 for DIA_FONT_NORMAL */
75 DIA_FONT_MEDIUM
= (3<<4),
76 DIA_FONT_DEMIBOLD
= (4<<4),
77 DIA_FONT_BOLD
= (5<<4),
78 DIA_FONT_ULTRABOLD
= (6<<4),
79 DIA_FONT_HEAVY
= (7<<4)
82 /* macros to get a specific style info */
83 #define DIA_FONT_STYLE_GET_FAMILY(st) ((st) & (0x3))
84 #define DIA_FONT_STYLE_GET_SLANT(st) ((st) & (0x3<<2))
85 #define DIA_FONT_STYLE_GET_WEIGHT(st) ((st) & (0x7<<4))
87 GType
dia_font_get_type(void) G_GNUC_CONST
;
89 #define DIA_TYPE_FONT (dia_font_get_type())
91 #define DIA_FONT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), \
94 #define DIA_FONT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \
98 struct _DiaFontClass
{
99 GObjectClass parent_class
;
102 /* Set the PangoContext used to render text.
104 void dia_font_init(PangoContext
* pcontext
);
105 /* Start using a new context (for AA rendering) */
106 void dia_font_push_context(PangoContext
*pcontext
);
107 /* Go back to using the old context */
108 void dia_font_pop_context(void);
109 /* Retrieve the current context (used for the font widget) */
110 PangoContext
*dia_font_get_context(void);
113 /* Get a font matching family,style,height. MUST be freed with
115 DiaFont
* dia_font_new(const char *family
, DiaFontStyle style
,
118 /* Get a font matching style. This is the preferred method to
119 * create default fonts within objects. */
120 DiaFont
* dia_font_new_from_style(DiaFontStyle style
, real height
);
122 /* Get a font from a legacy font name */
123 DiaFont
* dia_font_new_from_legacy_name(const char *name
);
125 /* Get a simple font name from a font.
126 Name will be valid for the duration of the DiaFont* lifetime. */
127 G_CONST_RETURN
char* dia_font_get_legacy_name(const DiaFont
* font
);
129 /* Same attributes */
130 DiaFont
*dia_font_copy(const DiaFont
* font
);
132 DiaFont
* dia_font_ref(DiaFont
* font
);
133 void dia_font_unref(DiaFont
* font
);
135 /* Retrieves the style of the font */
136 DiaFontStyle
dia_font_get_style(const DiaFont
* font
);
138 /* Retrieves the family of the font. Caller must NOT free. */
139 G_CONST_RETURN
char* dia_font_get_family(const DiaFont
* font
);
140 /* Acessor for the PangoFontDescription */
141 G_CONST_RETURN PangoFontDescription
*dia_font_get_description (const DiaFont
* font
);
143 /* Retrieves the height of the font */
144 real
dia_font_get_height(const DiaFont
* font
);
145 /* Change the height inside a font record. */
146 void dia_font_set_height(DiaFont
* font
, real height
);
148 /* Changes the slant of an existing font */
149 void dia_font_set_slant(DiaFont
* font
, DiaFontSlant slant
);
150 /* Changes the weight of an existing font */
151 void dia_font_set_weight(DiaFont
* font
, DiaFontWeight weight
);
152 /* Changes the family of an existing font to one of the three standard
154 void dia_font_set_family(DiaFont
* font
, DiaFontFamily family
);
155 /* Changes the family of an existing font to any family, but the name could
156 be system-dependent. */
157 void dia_font_set_any_family(DiaFont
* font
, const char* family
);
159 /* FIXME: what do we do with this, actually ?
160 Name lives for as long as the DiaFont lives. */
161 G_CONST_RETURN
char *dia_font_get_psfontname(const DiaFont
*font
);
163 /* returns a static string suitable for SVG */
164 G_CONST_RETURN
char *dia_font_get_weight_string(const DiaFont
* font
);
166 /* returns a static string suitable for SVG */
167 G_CONST_RETURN
char *dia_font_get_slant_string(const DiaFont
* font
);
169 /* uses an SVG style string */
170 void dia_font_set_weight_from_string(DiaFont
* font
, const char* weight
);
172 /* uses an SVG style string */
173 void dia_font_set_slant_from_string(DiaFont
* font
, const char* slant
);
175 /* -------- Font and string functions - unscaled versions.
176 Use these version in Objects, primarily. */
178 /* Get the width of the string with the given font in cm */
179 real
dia_font_string_width(const char* string
, DiaFont
* font
,
181 /* Get the ascent of this string in cm (a positive number). */
182 real
dia_font_ascent(const char* string
, DiaFont
* font
, real height
);
183 /* Get the descent of the font in cm (a positive number) */
184 real
dia_font_descent(const char* string
, DiaFont
* font
, real height
);
186 /* prepares a layout of the text, in font 'font'. */
187 PangoLayout
* dia_font_build_layout(const char* string
, DiaFont
* font
,
189 /* prepares a layout of the text, in font 'font' scaled by matrix. */
190 PangoLayout
* dia_font_build_layout_with_matrix(const char* string
,
193 PangoMatrix
*matrix
);
195 real
* dia_font_get_sizes(const char* string
, DiaFont
*font
, real height
,
196 real
* width
, real
* ascent
, real
* descent
, int *n_offsets
);
198 /* -------- Font and string functions - scaled versions.
199 Use these version in Renderers, exclusively. */
201 /* Call once at the beginning of a rendering pass, to let dia know
202 what is 1:1 scale. zoom_factor will then be divided by size_one. */
203 void dia_font_set_nominal_zoom_factor(real size_one
);
205 /* Get the width of the string with the given font in cm */
206 real
dia_font_scaled_string_width(const char* string
, DiaFont
* font
,
207 real height
, real zoom_factor
);
208 /* Get the max ascent of the font in cm (a positive number).
210 FIXME: may turn out that we need to pass a string here as well. */
211 real
dia_font_scaled_ascent(const char* string
, DiaFont
* font
,
212 real height
, real zoom_factor
);
213 /* Get the max descent of the font in cm (a positive number)
214 FIXME: may turn out that we need to pass a string here as well. */
215 real
dia_font_scaled_descent(const char* string
, DiaFont
* font
,
216 real height
, real zoom_factor
);
218 /* prepares a layout of the text, in font 'font'.
220 When zoom_factor != 1.0, may tweak the font's size or stretch so that its
221 bounding box is actually linear with respect to the zoom factor (kerning,
222 ligaturing and other wild beasts usually get in the way of linear
224 PangoLayout
* dia_font_scaled_build_layout(const char *string
, DiaFont
* font
,
225 real height
, real zoom_factor
);