Code

SVGFonts boilerplate code
[inkscape.git] / src / sp-font.cpp
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;
114 static void sp_font_set(SPObject *object, unsigned int key, const gchar *value)
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     }
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)
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;
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 :