From 8521695565e41f5cce4f5b8cba6754d8cd0c8854 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sun, 2 Sep 2007 16:37:15 +0000 Subject: LPE: add RandomParam type. (bzr r3662) --- src/live_effects/parameter/parameter.cpp | 2 +- src/live_effects/parameter/parameter.h | 19 +-- src/live_effects/parameter/random.cpp | 194 +++++++++++++++++++++++++++++++ src/live_effects/parameter/random.h | 76 ++++++++++++ src/live_effects/parameter/todo.txt | 2 +- 5 files changed, 282 insertions(+), 11 deletions(-) create mode 100644 src/live_effects/parameter/random.cpp create mode 100644 src/live_effects/parameter/random.h (limited to 'src/live_effects/parameter') diff --git a/src/live_effects/parameter/parameter.cpp b/src/live_effects/parameter/parameter.cpp index 42dd21995..94d5e3f8e 100644 --- a/src/live_effects/parameter/parameter.cpp +++ b/src/live_effects/parameter/parameter.cpp @@ -110,7 +110,7 @@ ScalarParam::param_set_range(gdouble min, gdouble max) if (rsu) rsu->getS()->setRange(min, max); - param_set_value(value); + param_set_value(value); // reset value to see whether it is in ranges } void diff --git a/src/live_effects/parameter/parameter.h b/src/live_effects/parameter/parameter.h index d8659600a..e6cabbdd9 100644 --- a/src/live_effects/parameter/parameter.h +++ b/src/live_effects/parameter/parameter.h @@ -68,31 +68,32 @@ public: Inkscape::UI::Widget::Registry* wr, Effect* effect, gdouble default_value = 1.0); - ~ScalarParam(); + virtual ~ScalarParam(); - bool param_readSVGValue(const gchar * strvalue); - gchar * param_writeSVGValue() const; + virtual bool param_readSVGValue(const gchar * strvalue); + virtual gchar * param_writeSVGValue() const; - void param_set_default(); + virtual void param_set_default(); void param_set_value(gdouble val); void param_make_integer(bool yes = true); void param_set_range(gdouble min, gdouble max); - Gtk::Widget * param_getWidget(); + virtual Gtk::Widget * param_getWidget(); inline operator gdouble() { return value; }; -private: - ScalarParam(const ScalarParam&); - ScalarParam& operator=(const ScalarParam&); - +protected: gdouble value; gdouble min; gdouble max; bool integer; gdouble defvalue; Inkscape::UI::Widget::RegisteredScalar * rsu; + +private: + ScalarParam(const ScalarParam&); + ScalarParam& operator=(const ScalarParam&); }; } //namespace LivePathEffect diff --git a/src/live_effects/parameter/random.cpp b/src/live_effects/parameter/random.cpp new file mode 100644 index 000000000..846c2f9e8 --- /dev/null +++ b/src/live_effects/parameter/random.cpp @@ -0,0 +1,194 @@ +#define INKSCAPE_LIVEPATHEFFECT_PARAMETER_RANDOM_CPP + +/* + * Copyright (C) Johan Engelen 2007 + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include "live_effects/parameter/random.h" +#include "live_effects/effect.h" +#include "svg/svg.h" +#include "libnr/nr-values.h" + +#include +#include "ui/widget/random.h" + +#include "svg/stringstream.h" + +#include "verbs.h" + +#define noLPERANDOMPARAM_DEBUG + +namespace Inkscape { + +namespace LivePathEffect { + + +RandomParam::RandomParam( const Glib::ustring& label, const Glib::ustring& tip, + const Glib::ustring& key, Inkscape::UI::Widget::Registry* wr, + Effect* effect, gdouble default_value, long default_seed) + : Parameter(label, tip, key, wr, effect) +{ + defvalue = default_value; + value = defvalue; + min = -NR_HUGE; + max = NR_HUGE; + integer = false; + regrandom = NULL; + + defseed = default_seed; + startseed = defseed; + seed = startseed; +} + +RandomParam::~RandomParam() +{ + if (regrandom) + delete regrandom; +} + +bool +RandomParam::param_readSVGValue(const gchar * strvalue) +{ + double newval, newstartseed; + gchar** stringarray = g_strsplit (strvalue, ";", 2); + unsigned int success = sp_svg_number_read_d(stringarray[0], &newval); + if (success == 1) { + success += sp_svg_number_read_d(stringarray[1], &newstartseed); + if (success == 2) { + param_set_value(newval, newstartseed); + } else { + param_set_value(newval, defseed); + } + g_strfreev(stringarray); + return true; + } + g_strfreev(stringarray); + return false; +} + +gchar * +RandomParam::param_writeSVGValue() const +{ + Inkscape::SVGOStringStream os; + os << value << ';' << startseed; + gchar * str = g_strdup(os.str().c_str()); + return str; +} + +void +RandomParam::param_set_default() +{ + param_set_value(defvalue, defseed); +} + +void +RandomParam::param_set_value(gdouble val, long newseed) +{ + value = val; + if (integer) + value = round(value); + if (value > max) + value = max; + if (value < min) + value = min; + + startseed = setup_seed(newseed); + seed = startseed; + + if (regrandom) + regrandom->setValue(value, startseed); +} + +void +RandomParam::param_set_range(gdouble min, gdouble max) +{ + this->min = min; + this->max = max; + if (regrandom) + regrandom->getR()->setRange(min, max); + + param_set_value(value, startseed); // reset value, to check whether it is in range +} + +void +RandomParam::param_make_integer(bool yes) +{ + integer = yes; + if (regrandom) { + regrandom->getR()->setDigits(0); + regrandom->getR()->setIncrements(1, 10); + } +} + +void +RandomParam::resetRandomizer() +{ + seed = startseed; +} + + +Gtk::Widget * +RandomParam::param_getWidget() +{ + // TODO: add a button to set a different startseed + if (!regrandom) { + regrandom = new Inkscape::UI::Widget::RegisteredRandom(); + regrandom->init(param_label, param_tooltip, param_key, *param_wr, param_effect->getRepr(), param_effect->getSPDoc()); + regrandom->setValue(value, startseed); + if (integer) + param_make_integer(); + + regrandom->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change random parameter")); + } + return dynamic_cast (regrandom->getR()); +} + +RandomParam::operator gdouble() +{ + return rand() * value; +}; + +/* RNG stolen from /display/nr-filter-turbulence.cpp */ +#define RAND_m 2147483647 /* 2**31 - 1 */ +#define RAND_a 16807 /* 7**5; primitive root of m */ +#define RAND_q 127773 /* m / a */ +#define RAND_r 2836 /* m % a */ +#define BSize 0x100 + +long +RandomParam::setup_seed(long lSeed) +{ + if (lSeed <= 0) lSeed = -(lSeed % (RAND_m - 1)) + 1; + if (lSeed > RAND_m - 1) lSeed = RAND_m - 1; + return lSeed; +} + +// generates random number between 0 and 1 +gdouble +RandomParam::rand() +{ + long result; + result = RAND_a * (seed % RAND_q) - RAND_r * (seed / RAND_q); + if (result <= 0) result += RAND_m; + seed = result; + + gdouble dresult = (gdouble)(result % BSize) / BSize; + return dresult; +} + + +} /* namespace LivePathEffect */ +} /* namespace Inkscape */ + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 : diff --git a/src/live_effects/parameter/random.h b/src/live_effects/parameter/random.h new file mode 100644 index 000000000..772f46ac6 --- /dev/null +++ b/src/live_effects/parameter/random.h @@ -0,0 +1,76 @@ +#ifndef INKSCAPE_LIVEPATHEFFECT_PARAMETER_RANDOM_H +#define INKSCAPE_LIVEPATHEFFECT_PARAMETER_RANDOM_H + +/* + * Inkscape::LivePathEffectParameters + * +* Copyright (C) Johan Engelen 2007 + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include "live_effects/parameter/parameter.h" +#include +#include <2geom/point.h> +#include <2geom/path.h> + +#include "ui/widget/registry.h" +#include "ui/widget/registered-widget.h" + +namespace Inkscape { + +namespace LivePathEffect { + +class RandomParam : public Parameter { +public: + RandomParam( const Glib::ustring& label, + const Glib::ustring& tip, + const Glib::ustring& key, + Inkscape::UI::Widget::Registry* wr, + Effect* effect, + gdouble default_value = 1.0, + long default_seed = 0); + virtual ~RandomParam(); + + virtual bool param_readSVGValue(const gchar * strvalue); + virtual gchar * param_writeSVGValue() const; + virtual void param_set_default(); + + virtual Gtk::Widget * param_getWidget(); + + void param_set_value(gdouble val, long newseed); + void param_make_integer(bool yes = true); + void param_set_range(gdouble min, gdouble max); + + void resetRandomizer(); + + operator gdouble(); + inline gdouble get_value() + { return value; } ; + +protected: + long startseed; + long seed; + long defseed; + + gdouble value; + gdouble min; + gdouble max; + bool integer; + gdouble defvalue; + + Inkscape::UI::Widget::RegisteredRandom * regrandom; + +private: + long setup_seed(long); + gdouble rand(); + + RandomParam(const RandomParam&); + RandomParam& operator=(const RandomParam&); +}; + +} //namespace LivePathEffect + +} //namespace Inkscape + +#endif diff --git a/src/live_effects/parameter/todo.txt b/src/live_effects/parameter/todo.txt index f1a1b4220..d82411db0 100644 --- a/src/live_effects/parameter/todo.txt +++ b/src/live_effects/parameter/todo.txt @@ -5,5 +5,5 @@ For example, the spinbuttons for scalarparam can "hang" which is very very very - add more types! straightlinepaths: for example for the gears effect. (curves are not important there) -random number: it must also store the random number generator seed!!! + -- cgit v1.2.3