Exemplo n.º 1
0
void
sp_conn_end_pair_build(SPObject *object)
{
    sp_object_read_attr(object, "inkscape:connector-type");
    sp_object_read_attr(object, "inkscape:connection-start");
    sp_object_read_attr(object, "inkscape:connection-end");
}
Exemplo n.º 2
0
static void
sp_guide_build (SPObject * object, SPDocument * document, SPRepr * repr)
{
	if (((SPObjectClass *) (parent_class))->build)
		(* ((SPObjectClass *) (parent_class))->build) (object, document, repr);

	sp_object_read_attr (object, "orientation");
	sp_object_read_attr (object, "position");

}
Exemplo n.º 3
0
static void
sp_circle_build (SPObject *object, SPDocument *document, SPRepr *repr)
{
	if (((SPObjectClass *) circle_parent_class)->build)
		(* ((SPObjectClass *) circle_parent_class)->build) (object, document, repr);

	sp_object_read_attr (object, "cx");
	sp_object_read_attr (object, "cy");
	sp_object_read_attr (object, "r");
}
Exemplo n.º 4
0
static void
sp_line_build (SPObject * object, SPDocument * document, Inkscape::XML::Node * repr)
{
        if (((SPObjectClass *) parent_class)->build) {
		((SPObjectClass *) parent_class)->build (object, document, repr);
        }

	sp_object_read_attr (object, "x1");
	sp_object_read_attr (object, "y1");
	sp_object_read_attr (object, "x2");
	sp_object_read_attr (object, "y2");
}
Exemplo n.º 5
0
/**
 * Reads the Inkscape::XML::Node, and initializes SPFeTurbulence variables.  For this to get called,
 * our name must be associated with a repr via "sp_object_type_register".  Best done through
 * sp-object-repr.cpp's repr_name_entries array.
 */
static void
sp_feTurbulence_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
{
    if (((SPObjectClass *) feTurbulence_parent_class)->build) {
        ((SPObjectClass *) feTurbulence_parent_class)->build(object, document, repr);
    }

    /*LOAD ATTRIBUTES FROM REPR HERE*/
    sp_object_read_attr(object, "baseFrequency");
    sp_object_read_attr(object, "numOctaves");
    sp_object_read_attr(object, "seed");
    sp_object_read_attr(object, "stitchTiles");
    sp_object_read_attr(object, "type");
}
Exemplo n.º 6
0
/**
 * Reads the Inkscape::XML::Node, and initializes SPPointLight variables.  For this to get called,
 * our name must be associated with a repr via "sp_object_type_register".  Best done through
 * sp-object-repr.cpp's repr_name_entries array.
 */
static void
sp_fepointlight_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
{
    if (((SPObjectClass *) fePointLight_parent_class)->build) {
        ((SPObjectClass *) fePointLight_parent_class)->build(object, document, repr);
    }

    //Read values of key attributes from XML nodes into object.
    sp_object_read_attr(object, "x");
    sp_object_read_attr(object, "y");
    sp_object_read_attr(object, "z");

//is this necessary?
    sp_document_add_resource(document, "fepointlight", object);
}
Exemplo n.º 7
0
static void
sp_mask_build (SPObject *object, SPDocument *document, SPRepr *repr)
{
	SPMask *mask;

	mask = SP_MASK (object);

	if (((SPObjectClass *) parent_class)->build)
		((SPObjectClass *) parent_class)->build (object, document, repr);

	sp_object_read_attr (object, "maskUnits");
	sp_object_read_attr (object, "maskContentUnits");

	/* Register ourselves */
	sp_document_add_resource (document, "mask", object);
}
Exemplo n.º 8
0
static void sp_polygon_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
{
    if (((SPObjectClass *) parent_class)->build) {
        ((SPObjectClass *) parent_class)->build(object, document, repr);
    }

    sp_object_read_attr(object, "points");
}
Exemplo n.º 9
0
static void sp_glyph_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
{
    if (((SPObjectClass *) (parent_class))->build) {
        ((SPObjectClass *) (parent_class))->build(object, document, repr);
    }

    sp_object_read_attr(object, "unicode");
    sp_object_read_attr(object, "glyph-name");
    sp_object_read_attr(object, "d");
    sp_object_read_attr(object, "orientation");
    sp_object_read_attr(object, "arabic-form");
    sp_object_read_attr(object, "lang");
    sp_object_read_attr(object, "horiz-adv-x");
    sp_object_read_attr(object, "vert-origin-x");
    sp_object_read_attr(object, "vert-origin-y");
    sp_object_read_attr(object, "vert-adv-y");
}
Exemplo n.º 10
0
/**
 *  * Receives update notifications.
 *   */
static void
sp_fepointlight_update(SPObject *object, SPCtx *ctx, guint flags)
{
    SPFePointLight *fePointLight = SP_FEPOINTLIGHT(object);
    (void)fePointLight;

    if (flags & SP_OBJECT_MODIFIED_FLAG) {
        /* do something to trigger redisplay, updates? */
        sp_object_read_attr(object, "x");
        sp_object_read_attr(object, "y");
        sp_object_read_attr(object, "z");
    }

    if (((SPObjectClass *) fePointLight_parent_class)->update) {
        ((SPObjectClass *) fePointLight_parent_class)->update(object, ctx, flags);
    }
}
Exemplo n.º 11
0
static void
sp_textpath_build(SPObject *object, SPDocument *doc, Inkscape::XML::Node *repr)
{
    //SPTextPath *textpath = SP_TEXTPATH(object);
	
    sp_object_read_attr(object, "x");
    sp_object_read_attr(object, "y");
    sp_object_read_attr(object, "dx");
    sp_object_read_attr(object, "dy");
    sp_object_read_attr(object, "rotate");
    sp_object_read_attr(object, "startOffset");
    sp_object_read_attr(object, "xlink:href");
	
    bool  no_content=true;
    for (Inkscape::XML::Node* rch = repr->firstChild() ; rch != NULL; rch = rch->next()) {
        if ( rch->type() == Inkscape::XML::TEXT_NODE ) {no_content=false;break;}
    }
	
    if ( no_content ) {
        Inkscape::XML::Document *xml_doc = sp_document_repr_doc(doc);
        Inkscape::XML::Node* rch = xml_doc->createTextNode("");
        repr->addChild(rch, NULL);
    }
	
    if (((SPObjectClass *) textpath_parent_class)->build)
        ((SPObjectClass *) textpath_parent_class)->build(object, doc, repr);
}
Exemplo n.º 12
0
/**
 * Reads the Inkscape::XML::Node, and initializes SPFeImage variables.  For this to get called,
 * our name must be associated with a repr via "sp_object_type_register".  Best done through
 * sp-object-repr.cpp's repr_name_entries array.
 */
static void
sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
{
    // Save document reference so we can load images with relative paths.
    SPFeImage *feImage = SP_FEIMAGE(object);
    feImage->document = document;

    if (((SPObjectClass *) feImage_parent_class)->build) {
        ((SPObjectClass *) feImage_parent_class)->build(object, document, repr);
    }

    /*LOAD ATTRIBUTES FROM REPR HERE*/

    sp_object_read_attr(object, "x");
    sp_object_read_attr(object, "y");
    sp_object_read_attr(object, "width");
    sp_object_read_attr(object, "height");
    sp_object_read_attr(object, "xlink:href");

}
Exemplo n.º 13
0
static void
sp_clippath_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
{
    if (((SPObjectClass *) parent_class)->build)
        ((SPObjectClass *) parent_class)->build(object, document, repr);

    sp_object_read_attr(object, "clipPathUnits");

    /* Register ourselves */
    sp_document_add_resource(document, "clipPath", object);
}
Exemplo n.º 14
0
/**
 * Reads the Inkscape::XML::Node, and initializes SPFeComposite variables.  For this to get called,
 * our name must be associated with a repr via "sp_object_type_register".  Best done through
 * sp-object-repr.cpp's repr_name_entries array.
 */
static void
sp_feComposite_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
{
    if (((SPObjectClass *) feComposite_parent_class)->build) {
        ((SPObjectClass *) feComposite_parent_class)->build(object, document, repr);
    }

    SPFeComposite *comp = SP_FECOMPOSITE(object);

    sp_object_read_attr(object, "operator");
    if (comp->composite_operator == COMPOSITE_ARITHMETIC) {
        sp_object_read_attr(object, "k1");
        sp_object_read_attr(object, "k2");
        sp_object_read_attr(object, "k3");
        sp_object_read_attr(object, "k4");
    }
    sp_object_read_attr(object, "in2");

    /* Unlike normal in, in2 is required attribute. Make sure, we can call
     * it by some name. */
    if (comp->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
        comp->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
    {
        SPFilter *parent = SP_FILTER(object->parent);
        comp->in2 = sp_filter_primitive_name_previous_out(comp);
        repr->setAttribute("in2", sp_filter_name_for_image(parent, comp->in2));
    }
}
Exemplo n.º 15
0
/**
 * Reads the Inkscape::XML::Node, and initializes SPFeBlend variables.  For this to get called,
 * our name must be associated with a repr via "sp_object_type_register".  Best done through
 * sp-object-repr.cpp's repr_name_entries array.
 */
static void
sp_feBlend_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
{
    SPFeBlend *blend = SP_FEBLEND(object);

    if (((SPObjectClass *) feBlend_parent_class)->build) {
        ((SPObjectClass *) feBlend_parent_class)->build(object, document, repr);
    }

    /*LOAD ATTRIBUTES FROM REPR HERE*/
    sp_object_read_attr(object, "mode");
    sp_object_read_attr(object, "in2");

    /* Unlike normal in, in2 is required attribute. Make sure, we can call
     * it by some name. */
    if (blend->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
        blend->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
    {
        SPFilter *parent = SP_FILTER(object->parent);
        blend->in2 = sp_filter_primitive_name_previous_out(blend);
        repr->setAttribute("in2", sp_filter_name_for_image(parent, blend->in2));
    }
}
Exemplo n.º 16
0
/**
 *  * Receives update notifications.
 *   */
static void
sp_glyph_update(SPObject *object, SPCtx *ctx, guint flags)
{
    SPGlyph *glyph = SP_GLYPH(object);
    (void)glyph;

    if (flags & SP_OBJECT_MODIFIED_FLAG) {
        /* do something to trigger redisplay, updates? */
            sp_object_read_attr(object, "unicode");
            sp_object_read_attr(object, "glyph-name");
            sp_object_read_attr(object, "d");
            sp_object_read_attr(object, "orientation");
            sp_object_read_attr(object, "arabic-form");
            sp_object_read_attr(object, "lang");
            sp_object_read_attr(object, "horiz-adv-x");
            sp_object_read_attr(object, "vert-origin-x");
            sp_object_read_attr(object, "vert-origin-y");
            sp_object_read_attr(object, "vert-adv-y");
    }

    if (((SPObjectClass *) parent_class)->update) {
        ((SPObjectClass *) parent_class)->update(object, ctx, flags);
    }
}
Exemplo n.º 17
0
static void
sp_clippath_build (SPObject *object, SPDocument *document, SPRepr *repr)
{
	SPClipPath *cp;

	cp = SP_CLIPPATH (object);

	if (((SPObjectClass *) parent_class)->build)
		((SPObjectClass *) parent_class)->build (object, document, repr);

	sp_object_read_attr (object, "clipPathUnits");

	/* Register ourselves */
	sp_document_add_resource (document, "clipPath", object);
}
Exemplo n.º 18
0
/**
 * Receives update notifications.
 */
static void
sp_feBlend_update(SPObject *object, SPCtx *ctx, guint flags)
{
    SPFeBlend *blend = SP_FEBLEND(object);

    if (flags & SP_OBJECT_MODIFIED_FLAG) {
        sp_object_read_attr(object, "mode");
        sp_object_read_attr(object, "in2");
    }

    /* Unlike normal in, in2 is required attribute. Make sure, we can call
     * it by some name. */
    if (blend->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
        blend->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
    {
        SPFilter *parent = SP_FILTER(object->parent);
        blend->in2 = sp_filter_primitive_name_previous_out(blend);
        object->repr->setAttribute("in2", sp_filter_name_for_image(parent, blend->in2));
    }

    if (((SPObjectClass *) feBlend_parent_class)->update) {
        ((SPObjectClass *) feBlend_parent_class)->update(object, ctx, flags);
    }
}
Exemplo n.º 19
0
static void
sp_spiral_build (SPObject * object, SPDocument * document, SPRepr * repr)
{
	if (((SPObjectClass *) parent_class)->build)
		((SPObjectClass *) parent_class)->build (object, document, repr);

	sp_object_read_attr (object, "sodipodi:cx");
	sp_object_read_attr (object, "sodipodi:cy");
	sp_object_read_attr (object, "sodipodi:expansion");
	sp_object_read_attr (object, "sodipodi:revolution");
	sp_object_read_attr (object, "sodipodi:radius");
	sp_object_read_attr (object, "sodipodi:argument");
	sp_object_read_attr (object, "sodipodi:t0");
}
Exemplo n.º 20
0
static void
sp_tspan_build(SPObject *object, SPDocument *doc, Inkscape::XML::Node *repr)
{
    //SPTSpan *tspan = SP_TSPAN(object);
	
    sp_object_read_attr(object, "x");
    sp_object_read_attr(object, "y");
    sp_object_read_attr(object, "dx");
    sp_object_read_attr(object, "dy");
    sp_object_read_attr(object, "rotate");
    sp_object_read_attr(object, "sodipodi:role");
	
    if (((SPObjectClass *) tspan_parent_class)->build)
        ((SPObjectClass *) tspan_parent_class)->build(object, doc, repr);
}
Exemplo n.º 21
0
/**
 * Receives update notifications.
 */
static void
sp_fontface_update(SPObject *object, SPCtx *ctx, guint flags)
{
    if (flags & (SP_OBJECT_MODIFIED_FLAG)) {
        sp_object_read_attr(object, "font-family");
        sp_object_read_attr(object, "font-style");
        sp_object_read_attr(object, "font-variant");
        sp_object_read_attr(object, "font-weight");
        sp_object_read_attr(object, "font-stretch");
        sp_object_read_attr(object, "font-size");
        sp_object_read_attr(object, "unicode-range");
        sp_object_read_attr(object, "units-per-em");
        sp_object_read_attr(object, "panose-1");
        sp_object_read_attr(object, "stemv");
        sp_object_read_attr(object, "stemh");
        sp_object_read_attr(object, "slope");
        sp_object_read_attr(object, "cap-height");
        sp_object_read_attr(object, "x-height");
        sp_object_read_attr(object, "accent-height");
        sp_object_read_attr(object, "ascent");
        sp_object_read_attr(object, "descent");
        sp_object_read_attr(object, "widths");
        sp_object_read_attr(object, "bbox");
        sp_object_read_attr(object, "ideographic");
        sp_object_read_attr(object, "alphabetic");
        sp_object_read_attr(object, "mathematical");
        sp_object_read_attr(object, "hanging");
        sp_object_read_attr(object, "v-ideographic");
        sp_object_read_attr(object, "v-alphabetic");
        sp_object_read_attr(object, "v-mathematical");
        sp_object_read_attr(object, "v-hanging");
        sp_object_read_attr(object, "underline-position");
        sp_object_read_attr(object, "underline-thickness");
        sp_object_read_attr(object, "strikethrough-position");
        sp_object_read_attr(object, "strikethrough-thickness");
        sp_object_read_attr(object, "overline-position");
        sp_object_read_attr(object, "overline-thickness");
    }

    if (((SPObjectClass *) parent_class)->update) {
        ((SPObjectClass *) parent_class)->update(object, ctx, flags);
    }
}
Exemplo n.º 22
0
static void
sp_arc_build (SPObject *object, SPDocument *document, SPRepr *repr)
{
	SPVersion version;

	if (((SPObjectClass *) arc_parent_class)->build)
		(* ((SPObjectClass *) arc_parent_class)->build) (object, document, repr);

	version = sp_object_get_sodipodi_version (object);

	if (sp_version_inside_range (version, 0, 0, 0, 25)) {
		/* Old spec violating arc attributes */
		sp_object_read_attr (object, "cx");
		sp_object_read_attr (object, "cy");
		sp_object_read_attr (object, "rx");
		sp_object_read_attr (object, "ry");
	} else {
		/* New attributes */
		sp_object_read_attr (object, "sodipodi:cx");
		sp_object_read_attr (object, "sodipodi:cy");
		sp_object_read_attr (object, "sodipodi:rx");
		sp_object_read_attr (object, "sodipodi:ry");
	}

	sp_object_read_attr (object, "sodipodi:start");
	sp_object_read_attr (object, "sodipodi:end");
	sp_object_read_attr (object, "sodipodi:open");

	if (sp_version_inside_range (version, 0, 0, 0, 25)) {
		/* fixme: I am 99.9% sure we can do this here safely, but check nevertheless (Lauris) */
		sp_arc_write (object, repr, SP_OBJECT_WRITE_EXT);
		sp_repr_set_attr (repr, "cx", NULL);
		sp_repr_set_attr (repr, "cy", NULL);
		sp_repr_set_attr (repr, "rx", NULL);
		sp_repr_set_attr (repr, "ry", NULL);
	}
}
Exemplo n.º 23
0
void
sp_sel_trans_ungrab (SPSelTrans * seltrans)
{
	SPItem * item;
	const GSList * l;
	gchar tstr[80];
	NRPointD p;
	unsigned int updh;

	g_return_if_fail (seltrans->grabbed);

	updh = TRUE;
	if (!seltrans->empty && seltrans->changed) {
		l = sp_selection_item_list (SP_DT_SELECTION (seltrans->desktop));

		tstr[79] = '\0';

		while (l != NULL) {
			item = SP_ITEM (l->data);
			/* fixme: We do not have to set it here (Lauris) */
			if (seltrans->show == SP_SELTRANS_SHOW_OUTLINE) {
				NRMatrixF i2d, i2dnew;
				sp_item_i2d_affine (item, &i2d);
				nr_matrix_multiply_ffd (&i2dnew, &i2d, &seltrans->current);
				sp_item_set_i2d_affine (item, &i2dnew);
			}
			if (seltrans->transform == SP_SELTRANS_TRANSFORM_OPTIMIZE) {
				sp_item_write_transform (item, SP_OBJECT_REPR (item), &item->transform);
				/* because item/repr affines may be out of sync, invoke reread */
				/* fixme: We should test equality to avoid unnecessary rereads */
				/* fixme: This probably is not needed (Lauris) */
				sp_object_read_attr (SP_OBJECT (item), "transform");
			} else {
				if (sp_svg_transform_write (tstr, 79, &item->transform)) {
					sp_repr_set_attr (SP_OBJECT (item)->repr, "transform", tstr);
				} else {
					sp_repr_set_attr (SP_OBJECT (item)->repr, "transform", NULL);
				}
			}
			l = l->next;
		}
		p = seltrans->center;
		seltrans->center.x = NR_MATRIX_DF_TRANSFORM_X (&seltrans->current, p.x, p.y);
		seltrans->center.y = NR_MATRIX_DF_TRANSFORM_Y (&seltrans->current, p.x, p.y);
		
		sp_document_done (SP_DT_DOCUMENT (seltrans->desktop));
		sp_selection_changed (SP_DT_SELECTION (seltrans->desktop));

		updh = FALSE;
	}

	if (seltrans->items) {
		int i;
		for (i = 0; i < seltrans->nitems; i++) sp_object_unref (SP_OBJECT (seltrans->items[i]), NULL);
		nr_free (seltrans->items);
		seltrans->items = NULL;
	}
	if (seltrans->transforms) {
		nr_free (seltrans->transforms);
		seltrans->transforms = NULL;
	}
	seltrans->nitems = 0;

	seltrans->grabbed = FALSE;
	seltrans->show_handles = TRUE;
	
	sp_canvas_item_hide (seltrans->norm);
	sp_canvas_item_hide (seltrans->grip);

        if (seltrans->show == SP_SELTRANS_SHOW_OUTLINE) {
		sp_canvas_item_hide (seltrans->l1);
		sp_canvas_item_hide (seltrans->l2);
		sp_canvas_item_hide (seltrans->l3);
		sp_canvas_item_hide (seltrans->l4);
	}

	sp_sel_trans_update_volatile_state (seltrans);
	if (updh) sp_sel_trans_update_handles (seltrans);
	if (seltrans->stamp_cache) {
		g_slist_free(seltrans->stamp_cache);
		seltrans->stamp_cache = NULL;
	}

}
Exemplo n.º 24
0
/**
 *  Given a repr, this sets the data items in the path object such as
 *  fill & style attributes, markers, and CSS properties.
 */
static void
sp_path_build (SPObject *object, SPDocument *document, SPRepr *repr)
{
	SPPath *path;
	SPVersion version;
	const gchar* marker_value;

	path = SP_PATH (object);

	version = sp_object_get_sodipodi_version (object);

	/* Fixes old Sodipodi nodetype to namespaced parameter */
	if (sp_version_inside_range (version, 0, 0, 0, 25)) {
		const gchar *str;
		str = sp_repr_attr (repr, "INKSCAPE-PATH-NODE-TYPES");
		sp_repr_set_attr (repr, "sodipodi:nodetypes", str);
		sp_repr_set_attr (repr, "INKSCAPE-PATH-NODE-TYPES", NULL);
	}

	sp_object_read_attr (object, "d");

	/* Are these calls actually necessary? */
	sp_object_read_attr (object, "marker");
	sp_object_read_attr (object, "marker-start");
	sp_object_read_attr (object, "marker-mid");
	sp_object_read_attr (object, "marker-end");

	if (sp_version_inside_range (version, 0, 0, 0, 25)) {
		SPShape *shape;
		SPCSSAttr *css;
		const gchar *val;
		gboolean changed;
		gboolean open;
		shape = (SPShape *) path;
		/* Remove fill from open paths for compatibility with inkscape < 0.25 */
		/* And set fill-rule of closed paths to evenodd */
		/* We force style rewrite at moment (Lauris) */
		changed = TRUE;
		open = FALSE;
		if (shape->curve && shape->curve->bpath) {
			ArtBpath *bp;
			for (bp = shape->curve->bpath; bp->code != ART_END; bp++) {
				if (bp->code == ART_MOVETO_OPEN) {
					open = TRUE;
					break;
				}
			}
		}
		css = sp_repr_css_attr (repr, "style");
		if (open) {
			val = sp_repr_css_property (css, "fill", NULL);
			if (val && strcmp (val, "none")) {
				sp_repr_css_set_property (css, "fill", "none");
				changed = TRUE;
			}
		} else {
			val = sp_repr_css_property (css, "fill-rule", NULL);
			if (!val) {
				sp_repr_css_set_property (css, "fill-rule", "evenodd");
				changed = TRUE;
			}
		}
		if (changed) {
			sp_repr_css_set (repr, css, "style");
		}
		sp_repr_css_attr_unref (css);
	}

	if (((SPObjectClass *) parent_class)->build) {
		((SPObjectClass *) parent_class)->build (object, document, repr);
	}
}
Exemplo n.º 25
0
static void sp_fontface_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
{
    if (((SPObjectClass *) (parent_class))->build) {
        ((SPObjectClass *) (parent_class))->build(object, document, repr);
    }

    sp_object_read_attr(object, "font-family");
    sp_object_read_attr(object, "font-style");
    sp_object_read_attr(object, "font-variant");
    sp_object_read_attr(object, "font-weight");
    sp_object_read_attr(object, "font-stretch");
    sp_object_read_attr(object, "font-size");
    sp_object_read_attr(object, "unicode-range");
    sp_object_read_attr(object, "units-per-em");
    sp_object_read_attr(object, "panose-1");
    sp_object_read_attr(object, "stem-v");
    sp_object_read_attr(object, "stem-h");
    sp_object_read_attr(object, "slope");
    sp_object_read_attr(object, "cap-height");
    sp_object_read_attr(object, "x-height");
    sp_object_read_attr(object, "accent-height");
    sp_object_read_attr(object, "ascent");
    sp_object_read_attr(object, "descent");
    sp_object_read_attr(object, "widths");
    sp_object_read_attr(object, "bbox");
    sp_object_read_attr(object, "ideographic");
    sp_object_read_attr(object, "alphabetic");
    sp_object_read_attr(object, "mathematical");
    sp_object_read_attr(object, "ranging");
    sp_object_read_attr(object, "v-ideogaphic");
    sp_object_read_attr(object, "v-alphabetic");
    sp_object_read_attr(object, "v-mathematical");
    sp_object_read_attr(object, "v-hanging");
    sp_object_read_attr(object, "underline-position");
    sp_object_read_attr(object, "underline-thickness");
    sp_object_read_attr(object, "strikethrough-position");
    sp_object_read_attr(object, "strikethrough-thickness");
    sp_object_read_attr(object, "overline-position");
    sp_object_read_attr(object, "overline-thickness");
}