Code

a bit more boilerplate code for SVGFonts
[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"
18 #include "helper-fns.h"
20 static void sp_font_class_init(SPFontClass *fc);
21 static void sp_font_init(SPFont *font);
23 static void sp_font_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
24 static void sp_font_release(SPObject *object);
25 static void sp_font_set(SPObject *object, unsigned int key, const gchar *value);
26 static Inkscape::XML::Node *sp_font_write(SPObject *object, Inkscape::XML::Node *repr, guint flags);
28 // static gchar *sp_font_description(SPItem *item);
30 static SPObjectClass *parent_class;
32 GType sp_font_get_type(void)
33 {
34     static GType type = 0;
36     if (!type) {
37         GTypeInfo info = {
38             sizeof(SPFontClass),
39             NULL,       /* base_init */
40             NULL,       /* base_finalize */
41             (GClassInitFunc) sp_font_class_init,
42             NULL,       /* class_finalize */
43             NULL,       /* class_data */
44             sizeof(SPFont),
45             16, /* n_preallocs */
46             (GInstanceInitFunc) sp_font_init,
47             NULL,       /* value_table */
48         };
49         type = g_type_register_static(SP_TYPE_OBJECT, "SPFont", &info, (GTypeFlags) 0);
50     }
52     return type;
53 }
55 static void sp_font_class_init(SPFontClass *fc)
56 {
57     SPObjectClass *sp_object_class = (SPObjectClass *) fc;
59     parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT);
61     sp_object_class->build = sp_font_build;
62     sp_object_class->release = sp_font_release;
63     sp_object_class->set = sp_font_set;
64     sp_object_class->write = sp_font_write;
65 }
67 static void sp_font_init(SPFont *font)
68 {
69     font->horiz_origin_x = 0;
70     font->horiz_origin_y = 0;
71     font->horiz_adv_x = 0;
72 //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
73     font->vert_origin_x = 0;
74     font->vert_origin_y = 0;
75     font->vert_adv_y = 0;
76 }
78 static void sp_font_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
79 {
80     if (((SPObjectClass *) (parent_class))->build) {
81         ((SPObjectClass *) (parent_class))->build(object, document, repr);
82     }
84     sp_object_read_attr(object, "horiz-origin-x");
85     sp_object_read_attr(object, "horiz-origin-y");
86     sp_object_read_attr(object, "horiz-adv-x");
87     sp_object_read_attr(object, "vert-origin-x");
88     sp_object_read_attr(object, "vert-origin-y");
89     sp_object_read_attr(object, "vert-adv-y");
90 }
92 static void sp_font_release(SPObject *object)
93 {
94     //SPFont *font = SP_FONT(object);
96     if (((SPObjectClass *) parent_class)->release) {
97         ((SPObjectClass *) parent_class)->release(object);
98     }
99 }
101 static void sp_font_set(SPObject *object, unsigned int key, const gchar *value)
103     SPFont *font = SP_FONT(object);
104     double number;
106     switch (key) {
107         case SP_ATTR_HORIZ_ORIGIN_X:
108             number = helperfns_read_number(value);
109             if (number != font->horiz_origin_x){
110                 font->horiz_origin_x = number;
111 g_warning("<font>: SP_ATTR_HORIZ_ORIGIN_X: %f", number);
112                 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
113             }
114             break;
115         case SP_ATTR_HORIZ_ORIGIN_Y:
116             number = helperfns_read_number(value);
117             if (number != font->horiz_origin_y){
118                 font->horiz_origin_y = number;
119 g_warning("<font>: SP_ATTR_HORIZ_ORIGIN_Y: %f", number);
120                 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
121             }
122             break;
123         case SP_ATTR_HORIZ_ADV_X:
124             number = helperfns_read_number(value);
125             if (number != font->horiz_adv_x){
126                 font->horiz_adv_x = number;
127 g_warning("<font>: SP_ATTR_HORIZ_ADV_X: %f", number);
128                 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
129             }
130             break;
131         case SP_ATTR_VERT_ORIGIN_X:
132             number = helperfns_read_number(value);
133             if (number != font->vert_origin_x){
134                 font->vert_origin_x = number;
135 g_warning("<font>: SP_ATTR_VERT_ORIGIN_X: %f", number);
136                 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
137             }
138             break;
139         case SP_ATTR_VERT_ORIGIN_Y:
140             number = helperfns_read_number(value);
141             if (number != font->vert_origin_y){
142                 font->vert_origin_y = number;
143 g_warning("<font>: SP_ATTR_VERT_ORIGIN_Y: %f", number);
144                 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
145             }
146             break;
147         case SP_ATTR_VERT_ADV_Y:
148             number = helperfns_read_number(value);
149             if (number != font->vert_adv_y){
150                 font->vert_adv_y = number;
151 g_warning("<font>: SP_ATTR_VERT_ADV_Y: %f", number);
152                 object->requestModified(SP_OBJECT_MODIFIED_FLAG);
153             }
154             break;
155         default:
156             if (((SPObjectClass *) (parent_class))->set) {
157                 ((SPObjectClass *) (parent_class))->set(object, key, value);
158             }
159             break;
160     }
163 #define COPY_ATTR(rd,rs,key) (rd)->setAttribute((key), rs->attribute(key));
165 static Inkscape::XML::Node *sp_font_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)
167     SPFont *font = SP_FONT(object);
169     if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
170         Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_OBJECT_DOCUMENT(object));
171         repr = xml_doc->createElement("svg:font");
172     }
174     sp_repr_set_svg_double(repr, "horiz-origin-x", font->horiz_origin_x);
175     sp_repr_set_svg_double(repr, "horiz-origin-y", font->horiz_origin_y);
176     sp_repr_set_svg_double(repr, "horiz-adv-x", font->horiz_adv_x);
177     sp_repr_set_svg_double(repr, "vert-origin-x", font->vert_origin_x);
178     sp_repr_set_svg_double(repr, "vert-origin-y", font->vert_origin_y);
179     sp_repr_set_svg_double(repr, "vert-adv-y", font->vert_adv_y);
181     if (repr != SP_OBJECT_REPR(object)) {
182         COPY_ATTR(repr, object->repr, "horiz-origin-x");
183         COPY_ATTR(repr, object->repr, "horiz-origin-y");
184         COPY_ATTR(repr, object->repr, "horiz-adv-x");
185         COPY_ATTR(repr, object->repr, "vert-origin-x");
186         COPY_ATTR(repr, object->repr, "vert-origin-y");
187         COPY_ATTR(repr, object->repr, "vert-adv-y");
188     }
190     if (((SPObjectClass *) (parent_class))->write) {
191         ((SPObjectClass *) (parent_class))->write(object, repr, flags);
192     }
194     return repr;
197 /*
198   Local Variables:
199   mode:c++
200   c-file-style:"stroustrup"
201   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
202   indent-tabs-mode:nil
203   fill-column:99
204   End:
205 */
206 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :