effect.cpp revision 6f4a90e526af850ffc36064f58f09c190f3b633f
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#define INKSCAPE_LIVEPATHEFFECT_CPP
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm/*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm *
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Released under GNU GPL, read the file 'COPYING' for more information
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen#include "live_effects/effect.h"
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "display/display-forward.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "xml/node-event-vector.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "sp-object.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "attributes.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "message-stack.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "desktop.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "inkscape.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "document.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include <glibmm/i18n.h>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "live_effects/lpeobject.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "live_effects/parameter/parameter.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include <glibmm/ustring.h>
d9c673867f424647c1586c356cc0ac1d34d0a98ajohanengelen#include "libnr/n-art-bpath-2geom.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "display/curve.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include <gtkmm.h>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include <exception>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen#include <2geom/sbasis-to-bezier.h>
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen#include <2geom/matrix.h>
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm// include effects:
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen#include "live_effects/lpe-patternalongpath.h"
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen#include "live_effects/lpe-bendpath.h"
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud#include "live_effects/lpe-sketch.h"
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud#include "live_effects/lpe-vonkoch.h"
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud#include "live_effects/lpe-knot.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "live_effects/lpe-slant.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "live_effects/lpe-test-doEffect-stack.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "live_effects/lpe-gears.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "live_effects/lpe-curvestitch.h"
8d9f5d586a04809427ce1df284a5720112177991cilix#include "live_effects/lpe-circle_with_radius.h"
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix#include "live_effects/lpe-perspective_path.h"
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak#include "live_effects/lpe-spiro.h"
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen#include "live_effects/lpe-constructgrid.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen#include "nodepath.h"
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmnamespace Inkscape {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmnamespace LivePathEffect {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmconst Util::EnumData<EffectType> LPETypeData[INVALID_LPE] = {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // {constant defined in effect.h, N_("name of your effect"), "name of your effect in SVG"}
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen {BEND_PATH, N_("Bend"), "bend_path"},
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen {PATTERN_ALONG_PATH, N_("Pattern Along Path"), "skeletal"}, // for historic reasons, this effect is called skeletal(strokes) in Inkscape:SVG
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud {SKETCH, N_("Sketch"), "sketch"},
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud {VONKOCH, N_("VonKoch"), "vonkoch"},
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud {KNOT, N_("Knot"), "knot"},
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#ifdef LPE_ENABLE_TEST_EFFECTS
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm {SLANT, N_("Slant"), "slant"},
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm {DOEFFECTSTACK_TEST, N_("doEffect stack test"), "doeffectstacktest"},
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#endif
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm {GEARS, N_("Gears"), "gears"},
8d9f5d586a04809427ce1df284a5720112177991cilix {CURVE_STITCH, N_("Stitch Sub-Paths"), "curvestitching"},
8d9f5d586a04809427ce1df284a5720112177991cilix {CIRCLE_WITH_RADIUS, N_("Circle (center+radius)"), "circle_with_radius"},
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix {PERSPECTIVE_PATH, N_("Perspective path"), "perspective_path"},
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak {SPIRO, N_("Spiro spline"), "spiro"},
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen {CONSTRUCT_GRID, N_("Construct grid"), "construct_grid"},
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm};
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmconst Util::EnumDataConverter<EffectType> LPETypeConverter(LPETypeData, INVALID_LPE);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::New(EffectType lpenr, LivePathEffectObject *lpeobj)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm Effect* neweffect = NULL;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm switch (lpenr) {
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen case PATTERN_ALONG_PATH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEPatternAlongPath(lpeobj) );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm break;
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen case BEND_PATH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEBendPath(lpeobj) );
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen break;
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud case SKETCH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPESketch(lpeobj) );
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud break;
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud case VONKOCH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEVonKoch(lpeobj) );
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud break;
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud case KNOT:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEKnot(lpeobj) );
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud break;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#ifdef LPE_ENABLE_TEST_EFFECTS
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm case SLANT:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPESlant(lpeobj) );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm break;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm case DOEFFECTSTACK_TEST:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEdoEffectStackTest(lpeobj) );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm break;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#endif
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm case GEARS:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEGears(lpeobj) );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm break;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm case CURVE_STITCH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPECurveStitch(lpeobj) );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm break;
8d9f5d586a04809427ce1df284a5720112177991cilix case CIRCLE_WITH_RADIUS:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPECircleWithRadius(lpeobj) );
8d9f5d586a04809427ce1df284a5720112177991cilix break;
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix case PERSPECTIVE_PATH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEPerspectivePath(lpeobj) );
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix break;
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak case SPIRO:
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak neweffect = static_cast<Effect*> ( new LPESpiro(lpeobj) );
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak break;
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen case CONSTRUCT_GRID:
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen neweffect = static_cast<Effect*> ( new LPEConstructGrid(lpeobj) );
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen break;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm default:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm g_warning("LivePathEffect::Effect::New called with invalid patheffect type (%d)", lpenr);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm neweffect = NULL;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm break;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (neweffect) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm neweffect->readallParameters(SP_OBJECT_REPR(lpeobj));
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return neweffect;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::Effect(LivePathEffectObject *lpeobject)
fbb4eb8b63e74d9441220a73a8ca858425be4bd4johanengelen : oncanvasedit_it(0),
fbb4eb8b63e74d9441220a73a8ca858425be4bd4johanengelen lpeobj(lpeobject),
fbb4eb8b63e74d9441220a73a8ca858425be4bd4johanengelen concatenate_before_pwd2(false)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::~Effect()
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
eaa9bdc7bf7b73397e536edd47490d84e4420bd8bryceGlib::ustring
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::getName()
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (lpeobj->effecttype_set && lpeobj->effecttype < INVALID_LPE)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return Glib::ustring( _(LPETypeConverter.get_label(lpeobj->effecttype).c_str()) );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm else
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return Glib::ustring( _("No effect") );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgkvoid
2d107ef9730aff3f4d776ae0c2f7d983e289ce02joncruzEffect::doBeforeEffect (SPLPEItem */*lpeitem*/)
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk{
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk //Do nothing for simple effects
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk}
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm/*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Here be the doEffect function chain:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::doEffect (SPCurve * curve)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
5675f17bbbc00f2c970b4d4966ce55d86775f7a6johanengelen NArtBpath *new_bpath = doEffect_nartbpath(SP_CURVE_BPATH(curve));
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (new_bpath && new_bpath != SP_CURVE_BPATH(curve)) { // FIXME, add function to SPCurve to change bpath? or a copy function?
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (curve->_bpath) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm g_free(curve->_bpath); //delete old bpath
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm curve->_bpath = new_bpath;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmNArtBpath *
5675f17bbbc00f2c970b4d4966ce55d86775f7a6johanengelenEffect::doEffect_nartbpath (NArtBpath * path_in)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm try {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm std::vector<Geom::Path> orig_pathv = BPath_to_2GeomPath(path_in);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
5675f17bbbc00f2c970b4d4966ce55d86775f7a6johanengelen std::vector<Geom::Path> result_pathv = doEffect_path(orig_pathv);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm NArtBpath *new_bpath = BPath_from_2GeomPath(result_pathv);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return new_bpath;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
ab5f33e91458710ed8dd2b2a1b3a53e4227d4856johanengelen catch (std::exception & e) {
feb44ad276e996ca244e071f936c61b009bd73f4johanengelen g_warning("Exception during LPE %s execution. \n %s", getName().c_str(), e.what());
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm SP_ACTIVE_DESKTOP->messageStack()->flash( Inkscape::WARNING_MESSAGE,
feb44ad276e996ca244e071f936c61b009bd73f4johanengelen _("An exception occurred during execution of the Path Effect.") );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm NArtBpath *path_out;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm unsigned ret = 0;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm while ( path_in[ret].code != NR_END ) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm ++ret;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm unsigned len = ++ret;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm path_out = g_new(NArtBpath, len);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm memcpy(path_out, path_in, len * sizeof(NArtBpath));
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return path_out;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstd::vector<Geom::Path>
ecda720053ff791e35dae3c5c1177bc225b6cdf1johanengelenEffect::doEffect_path (std::vector<Geom::Path> const & path_in)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
46c4893a7458eda6edcd064121bc000634af7a09johanengelen std::vector<Geom::Path> path_out;
46c4893a7458eda6edcd064121bc000634af7a09johanengelen
46c4893a7458eda6edcd064121bc000634af7a09johanengelen if ( !concatenate_before_pwd2 ) {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen // default behavior
46c4893a7458eda6edcd064121bc000634af7a09johanengelen for (unsigned int i=0; i < path_in.size(); i++) {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen Geom::Piecewise<Geom::D2<Geom::SBasis> > pwd2_in = path_in[i].toPwSb();
46c4893a7458eda6edcd064121bc000634af7a09johanengelen Geom::Piecewise<Geom::D2<Geom::SBasis> > pwd2_out = doEffect_pwd2(pwd2_in);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen std::vector<Geom::Path> path = Geom::path_from_piecewise( pwd2_out, LPE_CONVERSION_TOLERANCE);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen // add the output path vector to the already accumulated vector:
46c4893a7458eda6edcd064121bc000634af7a09johanengelen for (unsigned int j=0; j < path.size(); j++) {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen path_out.push_back(path[j]);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen }
46c4893a7458eda6edcd064121bc000634af7a09johanengelen }
46c4893a7458eda6edcd064121bc000634af7a09johanengelen } else {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen // concatenate the path into possibly discontinuous pwd2
46c4893a7458eda6edcd064121bc000634af7a09johanengelen Geom::Piecewise<Geom::D2<Geom::SBasis> > pwd2_in;
46c4893a7458eda6edcd064121bc000634af7a09johanengelen for (unsigned int i=0; i < path_in.size(); i++) {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen pwd2_in.concat( path_in[i].toPwSb() );
46c4893a7458eda6edcd064121bc000634af7a09johanengelen }
46c4893a7458eda6edcd064121bc000634af7a09johanengelen Geom::Piecewise<Geom::D2<Geom::SBasis> > pwd2_out = doEffect_pwd2(pwd2_in);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen path_out = Geom::path_from_piecewise( pwd2_out, LPE_CONVERSION_TOLERANCE);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return path_out;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmGeom::Piecewise<Geom::D2<Geom::SBasis> >
ecda720053ff791e35dae3c5c1177bc225b6cdf1johanengelenEffect::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm g_warning("Effect has no doEffect implementation");
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return pwd2_in;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::readallParameters(Inkscape::XML::Node * repr)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen std::vector<Parameter *>::iterator it = param_vector.begin();
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen while (it != param_vector.end()) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen Parameter * param = *it;
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen const gchar * key = param->param_key.c_str();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm const gchar * value = repr->attribute(key);
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen if (value) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen bool accepted = param->param_readSVGValue(value);
2d107ef9730aff3f4d776ae0c2f7d983e289ce02joncruz if (!accepted) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen g_warning("Effect::readallParameters - '%s' not accepted for %s", value, key);
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen }
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen } else {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen // set default value
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen param->param_set_default();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm it++;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
0fc5ce7045233dae7e15fdc86774370f1b1d73cbjohanengelen/* This function does not and SHOULD NOT write to XML */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid
0fc5ce7045233dae7e15fdc86774370f1b1d73cbjohanengelenEffect::setParameter(const gchar * key, const gchar * new_value)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen Parameter * param = getParameter(key);
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen if (param) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (new_value) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen bool accepted = param->param_readSVGValue(new_value);
2d107ef9730aff3f4d776ae0c2f7d983e289ce02joncruz if (!accepted) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm g_warning("Effect::setParameter - '%s' not accepted for %s", new_value, key);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm } else {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // set default value
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen param->param_set_default();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::registerParameter(Parameter * param)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen param_vector.push_back(param);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen/**
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen* This *creates* a new widget, management of deletion should be done by the caller
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen*/
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmGtk::Widget *
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelenEffect::newWidget(Gtk::Tooltips * tooltips)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen // use manage here, because after deletion of Effect object, others might still be pointing to this widget.
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen Gtk::VBox * vbox = Gtk::manage( new Gtk::VBox() );
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen vbox->set_border_width(5);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen std::vector<Parameter *>::iterator it = param_vector.begin();
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen while (it != param_vector.end()) {
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen Parameter * param = *it;
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen Gtk::Widget * widg = param->param_newWidget(tooltips);
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen Glib::ustring * tip = param->param_getTooltip();
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen if (widg) {
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen vbox->pack_start(*widg, true, true, 2);
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen if (tip != NULL) {
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen tooltips->set_tip(*widg, *tip);
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen it++;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return dynamic_cast<Gtk::Widget *>(vbox);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelenInkscape::XML::Node *
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::getRepr()
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return SP_OBJECT_REPR(lpeobj);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelenSPDocument *
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::getSPDoc()
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (SP_OBJECT_DOCUMENT(lpeobj) == NULL) g_message("Effect::getSPDoc() returns NULL");
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return SP_OBJECT_DOCUMENT(lpeobj);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelenParameter *
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelenEffect::getParameter(const char * key)
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen{
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen Glib::ustring stringkey(key);
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen std::vector<Parameter *>::iterator it = param_vector.begin();
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen while (it != param_vector.end()) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen Parameter * param = *it;
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen if ( param->param_key == key) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen return param;
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen }
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen it++;
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen }
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen return NULL;
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen}
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelenParameter *
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelenEffect::getNextOncanvasEditableParam()
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen{
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak if (param_vector.size() == 0) // no parameters
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak return NULL;
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen oncanvasedit_it++;
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak if (oncanvasedit_it >= static_cast<int>(param_vector.size())) {
a0334366488989ef25fb812d7030d298c0917c96johanengelen oncanvasedit_it = 0;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
a0334366488989ef25fb812d7030d298c0917c96johanengelen int old_it = oncanvasedit_it;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen do {
a0334366488989ef25fb812d7030d298c0917c96johanengelen Parameter * param = param_vector[oncanvasedit_it];
a0334366488989ef25fb812d7030d298c0917c96johanengelen if(param && param->oncanvas_editable) {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen return param;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen } else {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen oncanvasedit_it++;
f9504c822b72a774b910958446fd1e730235b7cbjoncruz if (oncanvasedit_it == static_cast<int>(param_vector.size())) { // loop round the map
a0334366488989ef25fb812d7030d298c0917c96johanengelen oncanvasedit_it = 0;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen } while (oncanvasedit_it != old_it); // iterate until complete loop through map has been made
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen return NULL;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen}
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelenvoid
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelenEffect::editNextParamOncanvas(SPItem * item, SPDesktop * desktop)
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen{
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen if (!desktop) return;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen Parameter * param = getNextOncanvasEditableParam();
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen if (param) {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen param->param_editOncanvas(item, desktop);
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen gchar *message = g_strdup_printf(_("Editing parameter <b>%s</b>."), param->param_label.c_str());
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, message);
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen g_free(message);
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen } else {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen desktop->messageStack()->flash( Inkscape::WARNING_MESSAGE,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen _("None of the applied path effect's parameters can be edited on-canvas.") );
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen/* This function should reset the defaults and is used for example to initialize an effect right after it has been applied to a path
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen* The nice thing about this is that this function can use knowledge of the original path and set things accordingly for example to the size or origin of the original path!
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen*/
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelenvoid
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelenEffect::resetDefaults(SPItem * /*item*/)
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen{
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen // do nothing for simple effects
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen}
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelenvoid
a797dcb8e284cab19f60b3eff93a53a62abda263johanengelenEffect::setup_nodepath(Inkscape::NodePath::Path *np)
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen{
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen np->helperpath_rgba = 0xff0000ff;
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen np->helperpath_width = 1.0;
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen}
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelenvoid
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelenEffect::transform_multiply(Geom::Matrix const& postmul, bool set)
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen{
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen // cycle through all parameters. Most parameters will not need transformation, but path and point params do.
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen for (std::vector<Parameter *>::iterator it = param_vector.begin(); it != param_vector.end(); it++) {
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen Parameter * param = *it;
bdd7add6c064afee52d2eabeaa18f745430e5a4djohanengelen param->param_transform_multiply(postmul, set);
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen }
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen}
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm} /* namespace LivePathEffect */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm} /* namespace Inkscape */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm/*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm Local Variables:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm mode:c++
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm c-file-style:"stroustrup"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm indent-tabs-mode:nil
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm fill-column:99
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm End:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm*/
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :