1 #define __SP_ANCHOR_C__
3 /*
4 * SVG <font> element implementation
5 *
6 * Author:
7 * Felipe C. da S. Sanches <felipe.sanches@gmail.com>
8 *
9 * Copyright (C) 2008, Felipe C. da S. Sanches
10 *
11 * Released under GNU GPL, read the file 'COPYING' for more information
12 */
14 #include "xml/repr.h"
15 #include "attributes.h"
16 #include "sp-font.h"
17 #include "document.h"
19 static void sp_font_class_init(SPFontClass *fc);
20 static void sp_font_init(SPFont *font);
22 static void sp_font_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
23 static void sp_font_release(SPObject *object);
24 static void sp_font_set(SPObject *object, unsigned int key, const gchar *value);
25 static Inkscape::XML::Node *sp_font_write(SPObject *object, Inkscape::XML::Node *repr, guint flags);
27 static gchar *sp_font_description(SPItem *item);
29 static SPObjectClass *parent_class;
31 GType sp_font_get_type(void)
32 {
33 static GType type = 0;
35 if (!type) {
36 GTypeInfo info = {
37 sizeof(SPFontClass),
38 NULL, /* base_init */
39 NULL, /* base_finalize */
40 (GClassInitFunc) sp_font_class_init,
41 NULL, /* class_finalize */
42 NULL, /* class_data */
43 sizeof(SPFont),
44 16, /* n_preallocs */
45 (GInstanceInitFunc) sp_font_init,
46 NULL, /* value_table */
47 };
48 type = g_type_register_static(SP_TYPE_OBJECT, "SPFont", &info, (GTypeFlags) 0);
49 }
51 return type;
52 }
54 static void sp_font_class_init(SPFontClass *fc)
55 {
56 SPObjectClass *sp_object_class = (SPObjectClass *) fc;
58 parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT);
60 sp_object_class->build = sp_font_build;
61 sp_object_class->release = sp_font_release;
62 sp_object_class->set = sp_font_set;
63 sp_object_class->write = sp_font_write;
64 }
66 static void sp_font_init(SPFont *font)
67 {
68 font->horiz_origin_x = 0;
69 font->horiz_origin_y = 0;
70 font->horiz_adv_x = 0;
71 //I think we should have extra stuff here and in the set method in order to set default value as specified at http://www.w3.org/TR/SVG/fonts.html
72 font->vert_origin_x = 0;
73 font->vert_origin_y = 0;
74 font->vert_adv_y = 0;
75 }
77 static void sp_font_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
78 {
79 if (((SPObjectClass *) (parent_class))->build) {
80 ((SPObjectClass *) (parent_class))->build(object, document, repr);
81 }
83 sp_object_read_attr(object, "horiz-origin-x");
84 sp_object_read_attr(object, "horiz-origin-y");
85 sp_object_read_attr(object, "horiz-adv-x");
86 sp_object_read_attr(object, "vert-origin-x");
87 sp_object_read_attr(object, "vert-origin-y");
88 sp_object_read_attr(object, "vert-adv-y");
89 }
91 static void sp_font_release(SPObject *object)
92 {
93 //SPFont *font = SP_FONT(object);
95 if (((SPObjectClass *) parent_class)->release) {
96 ((SPObjectClass *) parent_class)->release(object);
97 }
98 }
100 //ToDo: use helper-fns.h
101 inline double helperfns_read_number(gchar const *value) {
102 if (!value) return 0;
103 char *end;
104 double ret = g_ascii_strtod(value, &end);
105 if (*end) {
106 g_warning("Unable to convert \"%s\" to number", value);
107 // We could leave this out, too. If strtod can't convert
108 // anything, it will return zero.
109 ret = 0;
110 }
111 return ret;
112 }
114 static void sp_font_set(SPObject *object, unsigned int key, const gchar *value)
115 {
116 SPFont *font = SP_FONT(object);
117 double number;
119 switch (key) {
120 case SP_ATTR_HORIZ_ORIGIN_X:
121 number = helperfns_read_number(value);
122 if (number != font->horiz_origin_x){
123 font->horiz_origin_x = number;
124 g_warning("SP_ATTR_HORIZ_ORIGIN_X: %f", number);
125 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
126 }
127 break;
128 case SP_ATTR_HORIZ_ORIGIN_Y:
129 number = helperfns_read_number(value);
130 if (number != font->horiz_origin_y){
131 font->horiz_origin_y = number;
132 g_warning("SP_ATTR_HORIZ_ORIGIN_Y: %f", number);
133 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
134 }
135 break;
136 case SP_ATTR_HORIZ_ADV_X:
137 number = helperfns_read_number(value);
138 if (number != font->horiz_adv_x){
139 font->horiz_adv_x = number;
140 g_warning("SP_ATTR_HORIZ_ADV_X: %f", number);
141 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
142 }
143 break;
144 case SP_ATTR_VERT_ORIGIN_X:
145 number = helperfns_read_number(value);
146 if (number != font->vert_origin_x){
147 font->vert_origin_x = number;
148 g_warning("SP_ATTR_VERT_ORIGIN_X: %f", number);
149 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
150 }
151 break;
152 case SP_ATTR_VERT_ORIGIN_Y:
153 number = helperfns_read_number(value);
154 if (number != font->vert_origin_y){
155 font->vert_origin_y = number;
156 g_warning("SP_ATTR_VERT_ORIGIN_Y: %f", number);
157 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
158 }
159 break;
160 case SP_ATTR_VERT_ADV_Y:
161 number = helperfns_read_number(value);
162 if (number != font->vert_adv_y){
163 font->vert_adv_y = number;
164 g_warning("SP_ATTR_VERT_ADV_Y: %f", number);
165 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
166 }
167 break;
168 default:
169 if (((SPObjectClass *) (parent_class))->set) {
170 ((SPObjectClass *) (parent_class))->set(object, key, value);
171 }
172 break;
173 }
174 }
176 #define COPY_ATTR(rd,rs,key) (rd)->setAttribute((key), rs->attribute(key));
178 static Inkscape::XML::Node *sp_font_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)
179 {
180 SPFont *font = SP_FONT(object);
182 if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
183 Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_OBJECT_DOCUMENT(object));
184 repr = xml_doc->createElement("svg:font");
185 }
187 sp_repr_set_svg_double(repr, "horiz-origin-x", font->horiz_origin_x);
188 sp_repr_set_svg_double(repr, "horiz-origin-y", font->horiz_origin_y);
189 sp_repr_set_svg_double(repr, "horiz-adv-x", font->horiz_adv_x);
190 sp_repr_set_svg_double(repr, "vert-origin-x", font->vert_origin_x);
191 sp_repr_set_svg_double(repr, "vert-origin-y", font->vert_origin_y);
192 sp_repr_set_svg_double(repr, "vert-adv-y", font->vert_adv_y);
194 if (repr != SP_OBJECT_REPR(object)) {
195 COPY_ATTR(repr, object->repr, "horiz-origin-x");
196 COPY_ATTR(repr, object->repr, "horiz-origin-y");
197 COPY_ATTR(repr, object->repr, "horiz-adv-x");
198 COPY_ATTR(repr, object->repr, "vert-origin-x");
199 COPY_ATTR(repr, object->repr, "vert-origin-y");
200 COPY_ATTR(repr, object->repr, "vert-adv-y");
201 }
203 if (((SPObjectClass *) (parent_class))->write) {
204 ((SPObjectClass *) (parent_class))->write(object, repr, flags);
205 }
207 return repr;
208 }
210 /*
211 Local Variables:
212 mode:c++
213 c-file-style:"stroustrup"
214 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
215 indent-tabs-mode:nil
216 fill-column:99
217 End:
218 */
219 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :