void sp_sel_trans_stamp (SPSelTrans * seltrans) { /* stamping mode */ SPItem * original_item, * copy_item; SPRepr * original_repr, * copy_repr; GSList * l; gchar tstr[80]; NRMatrixF i2d, i2dnew; NRMatrixF *new_affine; tstr[79] = '\0'; if (!seltrans->empty) { if (seltrans->stamp_cache) { l = seltrans->stamp_cache; } else { /* Build cache */ l = (GSList *) sp_selection_item_list (SP_DT_SELECTION (seltrans->desktop)); l = g_slist_copy (l); l = g_slist_sort (l, (GCompareFunc) sp_object_compare_position); seltrans->stamp_cache = l; } while (l) { original_item = SP_ITEM(l->data); original_repr = (SPRepr *)(SP_OBJECT (original_item)->repr); copy_repr = sp_repr_duplicate (original_repr); copy_item = (SPItem *) sp_document_add_repr (SP_DT_DOCUMENT (seltrans->desktop), copy_repr); if (seltrans->show == SP_SELTRANS_SHOW_OUTLINE) { sp_item_i2d_affine (original_item, &i2d); nr_matrix_multiply_ffd (&i2dnew, &i2d, &seltrans->current); sp_item_set_i2d_affine (copy_item, &i2dnew); new_affine = ©_item->transform; } else { new_affine = &original_item->transform; } if (sp_svg_transform_write (tstr, 80, new_affine)) { sp_repr_set_attr (copy_repr, "transform", tstr); } else { sp_repr_set_attr (copy_repr, "transform", NULL); } sp_repr_unref (copy_repr); l = l->next; } sp_document_done (SP_DT_DOCUMENT (seltrans->desktop)); } }
gchar * sp_svg_transform_write(Geom::Matrix const *transform) { return sp_svg_transform_write(*transform); }
/** * Write gradient attributes to repr. */ Inkscape::XML::Node *SPGradient::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { SPPaintServer::write(xml_doc, repr, flags); if (flags & SP_OBJECT_WRITE_BUILD) { GSList *l = NULL; for (SPObject *child = this->firstChild(); child; child = child->getNext()) { Inkscape::XML::Node *crepr = child->updateRepr(xml_doc, NULL, flags); if (crepr) { l = g_slist_prepend(l, crepr); } } while (l) { repr->addChild((Inkscape::XML::Node *) l->data, NULL); Inkscape::GC::release((Inkscape::XML::Node *) l->data); l = g_slist_remove(l, l->data); } } if (this->ref->getURI()) { gchar *uri_string = this->ref->getURI()->toString(); repr->setAttribute("xlink:href", uri_string); g_free(uri_string); } if ((flags & SP_OBJECT_WRITE_ALL) || this->units_set) { switch (this->units) { case SP_GRADIENT_UNITS_USERSPACEONUSE: repr->setAttribute("gradientUnits", "userSpaceOnUse"); break; default: repr->setAttribute("gradientUnits", "objectBoundingBox"); break; } } if ((flags & SP_OBJECT_WRITE_ALL) || this->gradientTransform_set) { gchar *c=sp_svg_transform_write(this->gradientTransform); repr->setAttribute("gradientTransform", c); g_free(c); } if ((flags & SP_OBJECT_WRITE_ALL) || this->spread_set) { /* FIXME: Ensure that this->spread is the inherited value * if !this->spread_set. Not currently happening: see SPGradient::modified. */ switch (this->spread) { case SP_GRADIENT_SPREAD_REFLECT: repr->setAttribute("spreadMethod", "reflect"); break; case SP_GRADIENT_SPREAD_REPEAT: repr->setAttribute("spreadMethod", "repeat"); break; default: repr->setAttribute("spreadMethod", "pad"); break; } } if ( (flags & SP_OBJECT_WRITE_EXT) && this->isSwatch() ) { if ( this->isSolid() ) { repr->setAttribute( "osb:paint", "solid" ); } else { repr->setAttribute( "osb:paint", "gradient" ); } } else { repr->setAttribute( "osb:paint", 0 ); } return repr; }
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; } }