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)
102 {
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 }
161 }
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)
166 {
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;
195 }
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 :