[PD-cvs] SF.net SVN: pure-data: [9867] trunk/pd

millerpuckette at users.sourceforge.net millerpuckette at users.sourceforge.net
Thu May 22 20:25:28 CEST 2008


Revision: 9867
          http://pure-data.svn.sourceforge.net/pure-data/?rev=9867&view=rev
Author:   millerpuckette
Date:     2008-05-22 11:25:27 -0700 (Thu, 22 May 2008)

Log Message:
-----------
0.42-0 test 01.  No real work yet, just bug fixes and updates.

Modified Paths:
--------------
    trunk/pd/doc/1.manual/x5.htm
    trunk/pd/doc/3.audio.examples/I01.Fourier.analysis.pd
    trunk/pd/doc/5.reference/help-intro.pd
    trunk/pd/src/d_fftroutine.c
    trunk/pd/src/d_math.c
    trunk/pd/src/g_array.c
    trunk/pd/src/g_canvas.c
    trunk/pd/src/g_canvas.h
    trunk/pd/src/g_editor.c
    trunk/pd/src/g_graph.c
    trunk/pd/src/g_template.c
    trunk/pd/src/g_text.c
    trunk/pd/src/m_class.c
    trunk/pd/src/m_pd.h
    trunk/pd/src/notes.txt
    trunk/pd/src/s_main.c
    trunk/pd/src/s_path.c
    trunk/pd/src/s_stuff.h
    trunk/pd/src/x_arithmetic.c
    trunk/pd/src/x_time.c

Added Paths:
-----------
    trunk/pd/doc/5.reference/exp~-help.pd
    trunk/pd/doc/5.reference/log~-help.pd
    trunk/pd/doc/5.reference/pow~-help.pd

Modified: trunk/pd/doc/1.manual/x5.htm
===================================================================
--- trunk/pd/doc/1.manual/x5.htm	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/doc/1.manual/x5.htm	2008-05-22 18:25:27 UTC (rev 9867)
@@ -20,6 +20,15 @@
 
 <H3> <A name="s2"> 5.1. release notes </A> </H3>
 
+<P> ------------------ 0.42 ---------------------------
+
+<P> ".pdrc" loading suppressed if pd is started with "-noprefs".
+
+<P> Bug fix in pipe object: if sending a list to pipe, it didn't update the
+delay time when asked to.
+
+<P> 
+
 <P> ------------------ 0.41-3,4 ---------------------------
 
 <P> 2 fixes for PC: no bonk~, and the audio device selection

Modified: trunk/pd/doc/3.audio.examples/I01.Fourier.analysis.pd
===================================================================
--- trunk/pd/doc/3.audio.examples/I01.Fourier.analysis.pd	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/doc/3.audio.examples/I01.Fourier.analysis.pd	2008-05-22 18:25:27 UTC (rev 9867)
@@ -1,6 +1,6 @@
-#N canvas 25 8 688 708 12;
+#N canvas 247 4 688 708 12;
 #X floatatom 38 264 7 0 0 0 - - -;
-#N canvas 0 0 450 300 graph1 0;
+#N canvas 0 0 450 300 (subpatch) 0;
 #X array \$0-real 64 float 2;
 #X coords 0 64 64 -64 256 200 1;
 #X restore 423 184 graph;
@@ -12,7 +12,7 @@
 #X obj 38 637 tabwrite~ \$0-real;
 #X obj 67 614 tabwrite~ \$0-imaginary;
 #X obj 38 384 osc~;
-#N canvas 0 0 450 300 graph1 0;
+#N canvas 0 0 450 300 (subpatch) 0;
 #X array \$0-imaginary 64 float 2;
 #X coords 0 64 64 -64 256 200 1;
 #X restore 423 417 graph;
@@ -20,8 +20,8 @@
 #X floatatom 91 316 3 0 100 0 - - -;
 #X obj 91 337 / 100;
 #X obj 38 191 / 64;
-#X text 504 163 real part;
-#X text 489 398 imaginary part;
+#X text 595 165 real part;
+#X text 550 398 imaginary part;
 #X obj 80 545 loadbang;
 #X text 94 166 <- frequency;
 #X text 133 182 (as multiple;

Added: trunk/pd/doc/5.reference/exp~-help.pd
===================================================================
--- trunk/pd/doc/5.reference/exp~-help.pd	                        (rev 0)
+++ trunk/pd/doc/5.reference/exp~-help.pd	2008-05-22 18:25:27 UTC (rev 9867)
@@ -0,0 +1,23 @@
+#N canvas 35 5 531 296 10;
+#X obj 19 107 sig~;
+#X obj 50 167 loadbang;
+#X obj 50 191 metro 100;
+#X obj 50 215 snapshot~;
+#X floatatom 19 88 5 0 0 0 - - -;
+#X floatatom 50 240 7 0 0 0 - - -;
+#X text 314 271 updated for Pd version 0.42.;
+#X text 83 131 <-- optional creation argument initializes right inlet
+(the base of the logarithm).;
+#X obj 21 14 exp~;
+#X text 60 14 - exponential function;
+#X text 76 31 raises the Euler number 'e' (about 2.718) \, to the power
+of the input signal.;
+#X text 18 272 See also:;
+#X obj 92 271 pow~;
+#X obj 20 132 exp~;
+#X connect 0 0 13 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 4 0 0 0;
+#X connect 13 0 3 0;

Modified: trunk/pd/doc/5.reference/help-intro.pd
===================================================================
--- trunk/pd/doc/5.reference/help-intro.pd	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/doc/5.reference/help-intro.pd	2008-05-22 18:25:27 UTC (rev 9867)
@@ -81,15 +81,15 @@
 #X text 119 1178 - greater or lesser of 2 numbers;
 #X obj 19 1201 clip;
 #X text 119 1201 - force a number into a range;
-#X obj 16 1251 notein;
-#X obj 75 1251 ctlin;
-#X obj 126 1251 pgmin;
-#X obj 176 1251 bendin;
-#X obj 235 1251 touchin;
-#X obj 16 1274 polytouchin;
-#X obj 120 1274 midiin;
-#X obj 179 1274 sysexin;
-#X text 318 1263 - MIDI input;
+#X obj 16 1261 notein;
+#X obj 75 1261 ctlin;
+#X obj 126 1261 pgmin;
+#X obj 176 1261 bendin;
+#X obj 235 1261 touchin;
+#X obj 16 1284 polytouchin;
+#X obj 120 1284 midiin;
+#X obj 179 1284 sysexin;
+#X text 318 1273 - MIDI input;
 #X obj 19 1317 noteout;
 #X obj 87 1317 ctlout;
 #X obj 147 1317 pgmout;
@@ -99,8 +99,6 @@
 #X obj 210 1338 midiout;
 #X text 318 1327 - MIDI output;
 #X obj 20 1370 makenote;
-#X text 109 1368 - schedule a delayed "note off" message corresponding
-to a note-on;
 #X obj 19 1402 stripnote;
 #X text 112 1403 - strip "note off" messages;
 #X obj 17 1441 tabread;
@@ -143,18 +141,17 @@
 #X obj 16 2052 q8_rsqrt~;
 #X text 116 2052 - cheap reciprocal square root (beware -- 8 bits!)
 ;
-#X obj 16 2082 q8_sqrt~;
-#X text 116 2082 - cheap square root (beware -- 8 bits!);
-#X obj 16 2112 wrap~;
-#X text 116 2112 - wraparound (fractional part;
-#X obj 16 2142 fft~;
-#X text 116 2142 - complex forward discrete Fourier transform;
-#X obj 16 2172 ifft~;
-#X text 116 2172 - complex inverse discrete Fourier transform;
-#X obj 16 2202 rfft~;
-#X text 116 2202 - real forward discrete Fourier transform;
-#X obj 16 2232 rifft~;
-#X text 116 2232 - real inverse discrete Fourier transform;
+#X obj 16 2074 q8_sqrt~;
+#X text 116 2074 - cheap square root (beware -- 8 bits!);
+#X obj 16 2104 wrap~;
+#X obj 16 2134 fft~;
+#X text 116 2134 - complex forward discrete Fourier transform;
+#X obj 16 2156 ifft~;
+#X text 116 2156 - complex inverse discrete Fourier transform;
+#X obj 16 2186 rfft~;
+#X text 116 2186 - real forward discrete Fourier transform;
+#X obj 16 2208 rifft~;
+#X text 116 2208 - real inverse discrete Fourier transform;
 #X obj 16 2262 framp~;
 #X text 116 2262 - output a ramp for each block;
 #X obj 16 2292 mtof~;
@@ -314,7 +311,7 @@
 #X text 20 961 ------------------------- MATH -----------------;
 #X text 19 721 ------------------------- TIME --------------------------
 ;
-#X text 17 1232 ------------------------ MIDI -------------------------
+#X text 17 1242 ------------------------ MIDI -------------------------
 ;
 #X text 24 120 --------------- GLUE ----------------;
 #X text 18 3768 ------------------------ SUBWINDOWS ------------------------
@@ -358,3 +355,13 @@
 Right-click (or double-click on a Macintosh) on any object to get its
 "help window".;
 #X text 118 4368 - get a pointer into a list within a scalar;
+#X obj 19 1224 wrap;
+#X text 118 1224 - wrap a number to range [0 \, 1);
+#X text 116 2104 - wraparound (fractional part);
+#X obj 15 2236 pow~;
+#X obj 59 2236 log~;
+#X obj 103 2236 exp~;
+#X text 197 2238 - math;
+#X obj 149 2237 abs~;
+#X text 109 1368 - schedule delayed "note off" message corresponding
+to a note-on;

Added: trunk/pd/doc/5.reference/log~-help.pd
===================================================================
--- trunk/pd/doc/5.reference/log~-help.pd	                        (rev 0)
+++ trunk/pd/doc/5.reference/log~-help.pd	2008-05-22 18:25:27 UTC (rev 9867)
@@ -0,0 +1,26 @@
+#N canvas 299 273 531 296 10;
+#X obj 19 103 sig~;
+#X obj 50 167 loadbang;
+#X obj 50 191 metro 100;
+#X obj 50 215 snapshot~;
+#X floatatom 19 79 5 0 0 0 - - -;
+#X obj 60 103 sig~;
+#X floatatom 60 79 5 0 0 0 - - -;
+#X floatatom 50 240 7 0 0 0 - - -;
+#X text 316 257 updated for Pd version 0.42.;
+#X obj 21 14 log~;
+#X text 60 14 - logarithms;
+#X text 76 31 computes the logarithm of the left inlet \, to the base
+'e' (about 2.718) \, or to another base specified by the inlet or a
+cration argument.;
+#X obj 20 132 log~ 2;
+#X text 83 131 <-- optional creation argument initializes right inlet
+(the base of the logarithm).;
+#X connect 0 0 12 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 7 0;
+#X connect 4 0 0 0;
+#X connect 5 0 12 1;
+#X connect 6 0 5 0;
+#X connect 12 0 3 0;

Added: trunk/pd/doc/5.reference/pow~-help.pd
===================================================================
--- trunk/pd/doc/5.reference/pow~-help.pd	                        (rev 0)
+++ trunk/pd/doc/5.reference/pow~-help.pd	2008-05-22 18:25:27 UTC (rev 9867)
@@ -0,0 +1,30 @@
+#N canvas 191 0 534 413 10;
+#X obj 21 14 pow~;
+#X obj 67 109 sig~;
+#X obj 98 173 loadbang;
+#X obj 98 197 metro 100;
+#X obj 98 221 snapshot~;
+#X floatatom 67 73 5 0 0 0 - - -;
+#X obj 108 109 sig~;
+#X floatatom 108 73 5 0 0 0 - - -;
+#X obj 68 138 pow~ 2;
+#X floatatom 98 246 7 0 0 0 - - -;
+#X obj 413 268 pow~ 2;
+#X text 20 271 An optional creation argument initializes right inlet:
+;
+#X text 319 384 updated for Pd version 0.42.;
+#X text 23 303 WARNING: it's easy to generate "infinity" by accident
+\, and if you do \, the DSP chain may dramatically slow down if you're
+using an i386 or ia64 processor. Out-of-range floating point values
+are thousands of times slower to compute with than in-range ones.;
+#X text 68 12 - raise a signal to a numeric power (given by another
+signal). The left inlet must be a positive number. The right inlet
+my be positive \, zero \, or negative.;
+#X connect 1 0 8 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 9 0;
+#X connect 5 0 1 0;
+#X connect 6 0 8 1;
+#X connect 7 0 6 0;
+#X connect 8 0 4 0;

Modified: trunk/pd/src/d_fftroutine.c
===================================================================
--- trunk/pd/src/d_fftroutine.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/d_fftroutine.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -98,7 +98,7 @@
 #define        FALSE                   0
 #endif
 
-#define        SAMPLE float     /* data type used in calculation */
+#define        SAMPLE PD_FLOATTYPE     /* data type used in calculation */
 
 #define        SHORT_SIZE              sizeof(short)
 #define        INT_SIZE                sizeof(int)
@@ -154,8 +154,8 @@
 
 
 void cfft(int trnsfrm_dir, int npnt, int window,
-    float *source_buf, int source_form, int source_scale,
-    float *result_buf, int result_form, int result_scale, int debug);
+    SAMPLE *source_buf, int source_form, int source_scale,
+    SAMPLE *result_buf, int result_form, int result_scale, int debug);
 
 
 /*****************************************************************************/
@@ -172,10 +172,10 @@
 void create_hanning(SAMPLE *window, int n, SAMPLE scale);
 void create_rectangular(SAMPLE *window, int n, SAMPLE scale);
 void short_to_float(short *short_buf, float *float_buf, int n);
-void load_registers(FFT_NET *fft_net, float *buf, int buf_form,
+void load_registers(FFT_NET *fft_net, SAMPLE *buf, int buf_form,
     int buf_scale, int trnsfrm_dir);
 void compute_fft(FFT_NET  *fft_net);
-void store_registers(FFT_NET    *fft_net, float *buf, int buf_form,
+void store_registers(FFT_NET    *fft_net, SAMPLE *buf, int buf_form,
     int buf_scale, int debug);
 void build_fft_network(FFT_NET *fft_net, int n, int window_type);
 
@@ -184,8 +184,8 @@
 /*****************************************************************************/
 
 void cfft(int trnsfrm_dir, int npnt, int window,
-    float *source_buf, int source_form, int source_scale,
-    float *result_buf, int result_form, int result_scale, int debug)
+    SAMPLE *source_buf, int source_form, int source_scale,
+    SAMPLE *result_buf, int result_form, int result_scale, int debug)
 
 /* modifies: result_buf
    effects:  Computes npnt FFT specified by form, scale, and dir parameters.  
@@ -471,7 +471,7 @@
 /* REGISTER LOAD AND STORE                                                   */
 /*****************************************************************************/
 
-void load_registers(FFT_NET *fft_net, float *buf, int buf_form,
+void load_registers(FFT_NET *fft_net, SAMPLE *buf, int buf_form,
     int buf_scale, int trnsfrm_dir)
 
 /* effects:  Multiplies the input buffer with the appropriate window and
@@ -605,7 +605,7 @@
 }
 
 
-void store_registers(FFT_NET    *fft_net, float *buf, int buf_form,
+void store_registers(FFT_NET    *fft_net, SAMPLE *buf, int buf_form,
     int buf_scale, int debug)
 
 /* modifies: buf
@@ -989,10 +989,10 @@
 
 /* here's the meat: */
 
-void pd_fft(float *buf, int npoints, int inverse)
+void pd_fft(t_float *buf, int npoints, int inverse)
 {
   double renorm;
-  float *fp, *fp2;
+  SAMPLE *fp, *fp2;
   int i;
   renorm = (inverse ? npoints : 1.);
   cfft((inverse ? INVERSE : FORWARD), npoints, RECTANGULAR, 

Modified: trunk/pd/src/d_math.c
===================================================================
--- trunk/pd/src/d_math.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/d_math.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -97,7 +97,7 @@
 
     /* these are used in externs like "bonk" */
 
-float q8_rsqrt(float f)
+t_float q8_rsqrt(t_float f)
 {
     long l = *(long *)(&f);
     if (f < 0) return (0);
@@ -105,7 +105,7 @@
             rsqrt_mantissatab[(l >> 13) & 0x3ff]);
 }
 
-float q8_sqrt(float f)
+t_float q8_sqrt(t_float f)
 {
     long l = *(long *)(&f);
     if (f < 0) return (0);
@@ -116,8 +116,8 @@
     /* the old names are OK unless we're in IRIX N32 */
 
 #ifndef N32
-float qsqrt(float f) {return (q8_sqrt(f)); }
-float qrsqrt(float f) {return (q8_rsqrt(f)); }
+t_float qsqrt(t_float f) {return (q8_sqrt(f)); }
+t_float qrsqrt(t_float f) {return (q8_rsqrt(f)); }
 #endif
 
 
@@ -555,7 +555,190 @@
     class_addmethod(powtodb_tilde_class, (t_method)powtodb_tilde_dsp, gensym("dsp"), 0);
 }
 
+/* ----------------------------- pow ----------------------------- */
+static t_class *pow_tilde_class;
 
+typedef struct _pow_tilde
+{
+    t_object x_obj;
+    t_float x_f;
+} t_pow_tilde;
+
+static void *pow_tilde_new(t_symbol *s, int argc, t_atom *argv)
+{
+    t_pow_tilde *x = (t_pow_tilde *)pd_new(pow_tilde_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
+    outlet_new(&x->x_obj, &s_signal);
+    x->x_f = 0;
+    return (x);
+}
+
+t_int *pow_tilde_perform(t_int *w)
+{
+    t_sample *in1 = (t_sample *)(w[1]);
+    t_sample *in2 = (t_sample *)(w[2]);
+    t_sample *out = (t_sample *)(w[3]);
+    int n = (int)(w[4]);
+    while (n--)
+    {
+        float f = *in1++;
+        if (f > 0)
+            *out = pow(f, *in2);
+        else *out = 0;
+        out++;
+        in2++;
+    }
+    return (w+5);
+}
+
+static void pow_tilde_dsp(t_pow_tilde *x, t_signal **sp)
+{
+    dsp_add(pow_tilde_perform, 4,
+        sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+}
+
+static void pow_tilde_setup(void)
+{
+    pow_tilde_class = class_new(gensym("pow~"), (t_newmethod)pow_tilde_new, 0,
+        sizeof(t_pow_tilde), 0, A_DEFFLOAT, 0);
+    CLASS_MAINSIGNALIN(pow_tilde_class, t_pow_tilde, x_f);
+    class_addmethod(pow_tilde_class, (t_method)pow_tilde_dsp, gensym("dsp"), 0);
+}
+
+/* ----------------------------- exp ----------------------------- */
+static t_class *exp_tilde_class;
+
+typedef struct _exp_tilde
+{
+    t_object x_obj;
+    t_float x_f;
+} t_exp_tilde;
+
+static void *exp_tilde_new(t_symbol *s, int argc, t_atom *argv)
+{
+    t_exp_tilde *x = (t_exp_tilde *)pd_new(exp_tilde_class);
+    outlet_new(&x->x_obj, &s_signal);
+    return (x);
+}
+
+t_int *exp_tilde_perform(t_int *w)
+{
+    t_sample *in1 = (t_sample *)(w[1]);
+    t_sample *out = (t_sample *)(w[2]);
+    int n = (int)(w[3]);
+    while (n--)
+        *out = exp(*in1);
+    return (w+4);
+}
+
+static void exp_tilde_dsp(t_exp_tilde *x, t_signal **sp)
+{
+    dsp_add(exp_tilde_perform, 3,
+        sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
+}
+
+static void exp_tilde_setup(void)
+{
+    exp_tilde_class = class_new(gensym("exp~"), (t_newmethod)exp_tilde_new, 0,
+        sizeof(t_exp_tilde), 0, 0);
+    CLASS_MAINSIGNALIN(exp_tilde_class, t_exp_tilde, x_f);
+    class_addmethod(exp_tilde_class, (t_method)exp_tilde_dsp, gensym("dsp"), 0);
+}
+
+/* ----------------------------- log ----------------------------- */
+static t_class *log_tilde_class;
+
+typedef struct _log_tilde
+{
+    t_object x_obj;
+    t_float x_f;
+} t_log_tilde;
+
+static void *log_tilde_new(t_symbol *s, int argc, t_atom *argv)
+{
+    t_log_tilde *x = (t_log_tilde *)pd_new(log_tilde_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
+    outlet_new(&x->x_obj, &s_signal);
+    x->x_f = 0;
+    return (x);
+}
+
+t_int *log_tilde_perform(t_int *w)
+{
+    t_sample *in1 = (t_sample *)(w[1]);
+    t_sample *in2 = (t_sample *)(w[2]);
+    t_sample *out = (t_sample *)(w[3]);
+    int n = (int)(w[4]);
+    while (n--)
+    {
+        float f = *in1++, g = *in2++;
+        if (f <= 0)
+            *out = -1000;   /* rather than blow up, output a number << 0 */
+        else if (g <= 0)
+            *out = log(f);
+        else *out = log(f)/log(g);
+        out++;
+    }
+    return (w+5);
+}
+
+static void log_tilde_dsp(t_log_tilde *x, t_signal **sp)
+{
+    dsp_add(log_tilde_perform, 4,
+        sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+}
+
+static void log_tilde_setup(void)
+{
+    log_tilde_class = class_new(gensym("log~"), (t_newmethod)log_tilde_new, 0,
+        sizeof(t_log_tilde), 0, A_DEFFLOAT, 0);
+    CLASS_MAINSIGNALIN(log_tilde_class, t_log_tilde, x_f);
+    class_addmethod(log_tilde_class, (t_method)log_tilde_dsp, gensym("dsp"), 0);
+}
+
+/* ----------------------------- abs ----------------------------- */
+static t_class *abs_tilde_class;
+
+typedef struct _abs_tilde
+{
+    t_object x_obj;
+    t_float x_f;
+} t_abs_tilde;
+
+static void *abs_tilde_new(t_symbol *s, int argc, t_atom *argv)
+{
+    t_abs_tilde *x = (t_abs_tilde *)pd_new(abs_tilde_class);
+    outlet_new(&x->x_obj, &s_signal);
+    return (x);
+}
+
+t_int *abs_tilde_perform(t_int *w)
+{
+    t_sample *in1 = (t_sample *)(w[1]);
+    t_sample *out = (t_sample *)(w[2]);
+    int n = (int)(w[3]);
+    while (n--)
+    {
+        float f = *in1++;
+        *out = (f >= 0 ? f : -f);
+    }
+    return (w+4);
+}
+
+static void abs_tilde_dsp(t_abs_tilde *x, t_signal **sp)
+{
+    dsp_add(abs_tilde_perform, 3,
+        sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
+}
+
+static void abs_tilde_setup(void)
+{
+    abs_tilde_class = class_new(gensym("abs~"), (t_newmethod)abs_tilde_new, 0,
+        sizeof(t_abs_tilde), 0, 0);
+    CLASS_MAINSIGNALIN(abs_tilde_class, t_abs_tilde, x_f);
+    class_addmethod(abs_tilde_class, (t_method)abs_tilde_dsp, gensym("dsp"), 0);
+}
+
 /* ------------------------ global setup routine ------------------------- */
 
 void d_math_setup(void)
@@ -571,6 +754,10 @@
     rmstodb_tilde_setup();
     dbtopow_tilde_setup();
     powtodb_tilde_setup();
+    pow_tilde_setup();
+    exp_tilde_setup();
+    log_tilde_setup();
+    abs_tilde_setup();
 
     class_sethelpsymbol(mtof_tilde_class, s);
     class_sethelpsymbol(ftom_tilde_class, s);

Modified: trunk/pd/src/g_array.c
===================================================================
--- trunk/pd/src/g_array.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/g_array.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -1402,13 +1402,14 @@
     }
     for (i = 0; i < nelem; i++)
     {
-        if (!fscanf(fd, "%f", ((t_float *)(array->a_vec +
-            elemsize * i) + yonset)))
+        float f;
+        if (!fscanf(fd, "%f", &f))
         {
             post("%s: read %d elements into table of size %d",
                 filename->s_name, i, nelem);
             break;
         }
+        else *((t_float *)(array->a_vec + elemsize * i) + yonset) = f;
     }
     while (i < nelem)
         *((t_float *)(array->a_vec +

Modified: trunk/pd/src/g_canvas.c
===================================================================
--- trunk/pd/src/g_canvas.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/g_canvas.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -47,7 +47,7 @@
 static void canvas_stop_dsp(void);
 static void canvas_drawlines(t_canvas *x);
 static void canvas_setbounds(t_canvas *x, int x1, int y1, int x2, int y2);
-static void canvas_reflecttitle(t_canvas *x);
+void canvas_reflecttitle(t_canvas *x);
 static void canvas_addtolist(t_canvas *x);
 static void canvas_takeofflist(t_canvas *x);
 static void canvas_pop(t_canvas *x, t_floatarg fvis);
@@ -682,145 +682,7 @@
     }
 }
 
-/* ----  editors -- perhaps this and "vis" should go to g_editor.c ------- */
 
-static t_editor *editor_new(t_glist *owner)
-{
-    char buf[40];
-    t_editor *x = (t_editor *)getbytes(sizeof(*x));
-    x->e_connectbuf = binbuf_new();
-    x->e_deleted = binbuf_new();
-    x->e_glist = owner;
-    sprintf(buf, ".x%lx", (t_int)owner);
-    x->e_guiconnect = guiconnect_new(&owner->gl_pd, gensym(buf));
-    return (x);
-}
-
-static void editor_free(t_editor *x, t_glist *y)
-{
-    glist_noselect(y);
-    guiconnect_notarget(x->e_guiconnect, 1000);
-    binbuf_free(x->e_connectbuf);
-    binbuf_free(x->e_deleted);
-    freebytes((void *)x, sizeof(*x));
-}
-
-    /* recursively create or destroy all editors of a glist and its 
-    sub-glists, as long as they aren't toplevels. */
-void canvas_create_editor(t_glist *x, int createit)
-{
-    t_gobj *y;
-    t_object *ob;
-    if (createit)
-    {
-        if (x->gl_editor)
-            bug("canvas_create_editor");
-        else
-        {
-            x->gl_editor = editor_new(x);
-            for (y = x->gl_list; y; y = y->g_next)
-                if (ob = pd_checkobject(&y->g_pd))
-                    rtext_new(x, ob);
-        }
-    }
-    else
-    {
-        if (!x->gl_editor)
-            bug("canvas_create_editor");
-        else
-        {
-            for (y = x->gl_list; y; y = y->g_next)
-                if (ob = pd_checkobject(&y->g_pd))
-                    rtext_free(glist_findrtext(x, ob));
-            editor_free(x->gl_editor, x);
-            x->gl_editor = 0;
-        }
-    }
-    for (y = x->gl_list; y; y = y->g_next)
-        if (pd_class(&y->g_pd) == canvas_class &&
-            ((t_canvas *)y)->gl_isgraph && !((t_canvas *)y)->gl_havewindow)
-                canvas_create_editor((t_canvas *)y, createit);
-}
-
-    /* we call this when we want the window to become visible, mapped, and
-    in front of all windows; or with "f" zero, when we want to get rid of
-    the window. */
-void canvas_vis(t_canvas *x, t_floatarg f)
-{
-    char buf[30];
-    int flag = (f != 0);
-    if (flag)
-    {
-        /* post("havewindow %d, isgraph %d, isvisible %d  editor %d",
-            x->gl_havewindow, x->gl_isgraph, glist_isvisible(x),
-                (x->gl_editor != 0)); */
-            /* test if we're already visible and toplevel */
-        if (x->gl_editor)
-        {           /* just put us in front */
-#ifdef MSW
-            canvas_vis(x, 0);
-            canvas_vis(x, 1);
-#else
-            sys_vgui("raise .x%lx\n", x);
-            sys_vgui("focus .x%lx.c\n", x);
-            sys_vgui("wm deiconify .x%lx\n", x);  
-#endif
-        }
-        else
-        {
-            canvas_create_editor(x, 1);
-            sys_vgui("pdtk_canvas_new .x%lx %d %d +%d+%d %d\n", x,
-                (int)(x->gl_screenx2 - x->gl_screenx1),
-                (int)(x->gl_screeny2 - x->gl_screeny1),
-                (int)(x->gl_screenx1), (int)(x->gl_screeny1),
-                x->gl_edit);
-            canvas_reflecttitle(x);
-            x->gl_havewindow = 1;
-            canvas_updatewindowlist();
-        }
-    }
-    else    /* make invisible */
-    {
-        int i;
-        t_canvas *x2;
-        if (!x->gl_havewindow)
-        {
-                /* bug workaround -- a graph in a visible patch gets "invised"
-                when the patch is closed, and must lose the editor here.  It's
-                probably not the natural place to do this.  Other cases like
-                subpatches fall here too but don'd need the editor freed, so
-                we check if it exists. */
-            if (x->gl_editor)
-                canvas_create_editor(x, 0);
-            return;
-        }
-        sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", x);
-        glist_noselect(x);
-        if (glist_isvisible(x))
-            canvas_map(x, 0);
-        canvas_create_editor(x, 0);
-        sys_vgui("destroy .x%lx\n", x);
-        for (i = 1, x2 = x; x2; x2 = x2->gl_next, i++)
-            ;
-        sys_vgui(".mbar.find delete %d\n", i);
-            /* if we're a graph on our parent, and if the parent exists
-               and is visible, show ourselves on parent. */
-        if (glist_isgraph(x) && x->gl_owner)
-        {
-            t_glist *gl2 = x->gl_owner;
-            if (!x->gl_owner->gl_isdeleting)
-                canvas_create_editor(x, 1);
-            if (glist_isvisible(gl2))
-                gobj_vis(&x->gl_gobj, gl2, 0);
-            x->gl_havewindow = 0;
-            if (glist_isvisible(gl2))
-                gobj_vis(&x->gl_gobj, gl2, 1);
-        }
-        else x->gl_havewindow = 0;
-        canvas_updatewindowlist();
-    }
-}
-
     /* we call this on a non-toplevel glist to "open" it into its
     own window. */
 void glist_menu_open(t_glist *x)
@@ -835,7 +697,8 @@
                 /* erase ourself in parent window */
             gobj_vis(&x->gl_gobj, gl2, 0);
                     /* get rid of our editor (and subeditors) */
-            canvas_create_editor(x, 0);
+            if (x->gl_editor)
+                canvas_create_editor(x, 0);
             x->gl_havewindow = 1;
                     /* redraw ourself in parent window (blanked out this time) */
             gobj_vis(&x->gl_gobj, gl2, 1);
@@ -1475,6 +1338,22 @@
     }
 }
 
+static void canvas_completepath(char *from, char *to)
+{
+    if (sys_isabsolutepath(from))
+    {
+        to[0] = '\0';
+    }
+    else
+    {   // if not absolute path, append Pd lib dir
+        strncpy(to, sys_libdir->s_name, FILENAME_MAX-4);
+        to[FILENAME_MAX-3] = '\0';
+        strcat(to, "/");
+    }
+    strncat(to, from, FILENAME_MAX-strlen(to));
+    to[FILENAME_MAX-1] = '\0';
+}
+
 static void canvas_declare(t_canvas *x, t_symbol *s, int argc, t_atom *argv)
 {
     int i;
@@ -1496,12 +1375,7 @@
         }
         else if ((argc > i+1) && !strcmp(flag, "-stdpath"))
         {
-            strncpy(strbuf, sys_libdir->s_name, MAXPDSTRING-3);
-            strbuf[MAXPDSTRING-4] = 0;
-            strcat(strbuf, "/");
-            strncpy(strbuf, atom_getsymbolarg(i+1, argc, argv)->s_name,
-                MAXPDSTRING-strlen(strbuf));
-            strbuf[MAXPDSTRING-1] = 0;
+            canvas_completepath(atom_getsymbolarg(i+1, argc, argv)->s_name, strbuf);
             e->ce_path = namelist_append(e->ce_path, strbuf, 0);
             i++;
         }
@@ -1512,12 +1386,7 @@
         }
         else if ((argc > i+1) && !strcmp(flag, "-stdlib"))
         {
-            strncpy(strbuf, sys_libdir->s_name, MAXPDSTRING-3);
-            strbuf[MAXPDSTRING-4] = 0;
-            strcat(strbuf, "/");
-            strncpy(strbuf, atom_getsymbolarg(i+1, argc, argv)->s_name,
-                MAXPDSTRING-strlen(strbuf));
-            strbuf[MAXPDSTRING-1] = 0;
+            canvas_completepath(atom_getsymbolarg(i+1, argc, argv)->s_name, strbuf);
             sys_load_lib(0, strbuf);
             i++;
         }
@@ -1564,9 +1433,16 @@
         for (nl = y->gl_env->ce_path; nl; nl = nl->nl_next)
         {
             char realname[MAXPDSTRING];
-            strncpy(realname, dir, MAXPDSTRING);
-            realname[MAXPDSTRING-3] = 0;
-            strcat(realname, "/");
+            if (sys_isabsolutepath(nl->nl_string))
+            {
+                realname[0] = '\0';
+            }
+            else
+            {   /* if not absolute path, append Pd lib dir */
+                strncpy(realname, dir, MAXPDSTRING);
+                realname[MAXPDSTRING-3] = 0;
+                strcat(realname, "/");
+            }
             strncat(realname, nl->nl_string, MAXPDSTRING-strlen(realname));
             realname[MAXPDSTRING-1] = 0;
             if ((fd = sys_trytoopenone(realname, name, ext,

Modified: trunk/pd/src/g_canvas.h
===================================================================
--- trunk/pd/src/g_canvas.h	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/g_canvas.h	2008-05-22 18:25:27 UTC (rev 9867)
@@ -7,8 +7,8 @@
 structures until being unified in version 0.35.
 
 A glist occupies its own window if the "gl_havewindow" flag is set.  Its
-appearance on its "parent" or "owner" (if it has one) is as a graph if
-"gl_isgraph" is set, and otherwise as a text box.
+appearance on its "parent", also called "owner", (if it has one) is as a graph
+if "gl_isgraph" is set, and otherwise as a text box.
 
 A glist is "root" if it has no owner, i.e., a document window.  In this
 case "gl_havewindow" is always set.
@@ -353,6 +353,7 @@
 EXTERN void gobj_save(t_gobj *x, t_binbuf *b);
 EXTERN void gobj_properties(t_gobj *x, struct _glist *glist);
 EXTERN void gobj_save(t_gobj *x, t_binbuf *b);
+EXTERN int gobj_shouldvis(t_gobj *x, struct _glist *glist);
 
 /* -------------------- functions on glists --------------------- */
 EXTERN t_glist *glist_new( void);
@@ -414,7 +415,6 @@
 EXTERN int text_ycoord(t_text *x, t_glist *glist);
 EXTERN int text_xpix(t_text *x, t_glist *glist);
 EXTERN int text_ypix(t_text *x, t_glist *glist);
-EXTERN int text_shouldvis(t_text *x, t_glist *glist);
 
 /* -------------------- functions on rtexts ------------------------- */
 #define RTEXT_DOWN 1

Modified: trunk/pd/src/g_editor.c
===================================================================
--- trunk/pd/src/g_editor.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/g_editor.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -61,30 +61,45 @@
         (*x->g_pd->c_wb->w_deletefn)(x, glist);
 }
 
-void gobj_vis(t_gobj *x, struct _glist *glist, int flag)
+int gobj_shouldvis(t_gobj *x, struct _glist *glist)
 {
-    if (x->g_pd->c_wb && x->g_pd->c_wb->w_visfn)
+    t_object *ob;
+    if (!glist->gl_havewindow && glist->gl_isgraph && glist->gl_goprect &&
+        glist->gl_owner && (pd_class(&glist->gl_pd) != garray_class))
     {
-        if (!glist->gl_havewindow && glist->gl_isgraph && glist->gl_goprect &&
-            glist->gl_owner && (pd_class(&glist->gl_pd) != garray_class))
-        {
-            /* if we're graphing-on-parent and the object falls outside the
-            graph rectangle, don't draw it. */
-            int x1, y1, x2, y2, gx1, gy1, gx2, gy2, m;
-            gobj_getrect(&glist->gl_gobj, glist->gl_owner, &x1, &y1, &x2, &y2);
-            if (x1 > x2)
-                m = x1, x1 = x2, x2 = m;
-            if (y1 > y2)
-                m = y1, y1 = y2, y2 = m;
-            gobj_getrect(x, glist, &gx1, &gy1, &gx2, &gy2);
-            if (gx1 < x1 || gx1 > x2 || gx2 < x1 || gx2 > x2 ||
-                gy1 < y1 || gy1 > y2 || gy2 < y1 || gy2 > y2)
-                    return;
-        }
-        (*x->g_pd->c_wb->w_visfn)(x, glist, flag);
+        /* if we're graphing-on-parent and the object falls outside the
+        graph rectangle, don't draw it. */
+        int x1, y1, x2, y2, gx1, gy1, gx2, gy2, m;
+        gobj_getrect(&glist->gl_gobj, glist->gl_owner, &x1, &y1, &x2, &y2);
+        if (x1 > x2)
+            m = x1, x1 = x2, x2 = m;
+        if (y1 > y2)
+            m = y1, y1 = y2, y2 = m;
+        gobj_getrect(x, glist, &gx1, &gy1, &gx2, &gy2);
+        if (gx1 < x1 || gx1 > x2 || gx2 < x1 || gx2 > x2 ||
+            gy1 < y1 || gy1 > y2 || gy2 < y1 || gy2 > y2)
+                return (0);
     }
+    if (ob = pd_checkobject(&x->g_pd))
+    {
+        /* return true if the text box should be drawn.  We don't show text
+        boxes inside graphs---except comments, if we're doing the new
+        (goprect) style. */
+        return (glist->gl_havewindow ||
+            (ob->te_pd != canvas_class &&
+                ob->te_pd->c_wb != &text_widgetbehavior) ||
+            (ob->te_pd == canvas_class && (((t_glist *)ob)->gl_isgraph)) ||
+            (glist->gl_goprect && (ob->te_type == T_TEXT)));
+    }
+    else return (1);
 }
 
+void gobj_vis(t_gobj *x, struct _glist *glist, int flag)
+{
+    if (x->g_pd->c_wb && x->g_pd->c_wb->w_visfn && gobj_shouldvis(x, glist))
+        (*x->g_pd->c_wb->w_visfn)(x, glist, flag);
+}
+
 int gobj_click(t_gobj *x, struct _glist *glist,
     int xpix, int ypix, int shift, int alt, int dbl, int doit)
 {
@@ -765,9 +780,8 @@
 {
     int x1, y1, x2, y2;
     t_text *ob;
-    if ((ob = pd_checkobject(&y->g_pd)) && 
-        !text_shouldvis(ob, x))
-            return (0);
+    if (!gobj_shouldvis(y, x))
+        return (0);
     gobj_getrect(y, x, &x1, &y1, &x2, &y2);
     if (xpos >= x1 && xpos <= x2 && ypos >= y1 && ypos <= y2)
     {
@@ -817,12 +831,157 @@
         x, xpos, ypos, canprop, canopen);
 }
 
+/* ----  editors -- perhaps this and "vis" should go to g_editor.c ------- */
+
+static t_editor *editor_new(t_glist *owner)
+{
+    char buf[40];
+    t_editor *x = (t_editor *)getbytes(sizeof(*x));
+    x->e_connectbuf = binbuf_new();
+    x->e_deleted = binbuf_new();
+    x->e_glist = owner;
+    sprintf(buf, ".x%lx", (t_int)owner);
+    x->e_guiconnect = guiconnect_new(&owner->gl_pd, gensym(buf));
+    return (x);
+}
+
+static void editor_free(t_editor *x, t_glist *y)
+{
+    glist_noselect(y);
+    guiconnect_notarget(x->e_guiconnect, 1000);
+    binbuf_free(x->e_connectbuf);
+    binbuf_free(x->e_deleted);
+    freebytes((void *)x, sizeof(*x));
+}
+
+    /* recursively create or destroy all editors of a glist and its 
+    sub-glists, as long as they aren't toplevels. */
+void canvas_create_editor(t_glist *x, int createit)
+{
+    t_gobj *y;
+    t_object *ob;
+    if (createit)
+    {
+        if (x->gl_editor)
+            bug("canvas_create_editor");
+        else
+        {
+            x->gl_editor = editor_new(x);
+            for (y = x->gl_list; y; y = y->g_next)
+                if (ob = pd_checkobject(&y->g_pd))
+                    rtext_new(x, ob);
+        }
+    }
+    else
+    {
+        if (!x->gl_editor)
+            bug("canvas_create_editor");
+        else
+        {
+            for (y = x->gl_list; y; y = y->g_next)
+                if (ob = pd_checkobject(&y->g_pd))
+                    rtext_free(glist_findrtext(x, ob));
+            editor_free(x->gl_editor, x);
+            x->gl_editor = 0;
+        }
+    }
+    for (y = x->gl_list; y; y = y->g_next)
+        if (pd_class(&y->g_pd) == canvas_class &&
+            ((t_canvas *)y)->gl_isgraph && !((t_canvas *)y)->gl_havewindow)
+                canvas_create_editor((t_canvas *)y, createit);
+}
+
+void canvas_reflecttitle(t_canvas *x);
+void canvas_map(t_canvas *x, t_floatarg f);
+
+    /* we call this when we want the window to become visible, mapped, and
+    in front of all windows; or with "f" zero, when we want to get rid of
+    the window. */
+void canvas_vis(t_canvas *x, t_floatarg f)
+{
+    char buf[30];
+    int flag = (f != 0);
+    if (flag)
+    {
+        /* post("havewindow %d, isgraph %d, isvisible %d  editor %d",
+            x->gl_havewindow, x->gl_isgraph, glist_isvisible(x),
+                (x->gl_editor != 0)); */
+            /* test if we're already visible and toplevel */
+        if (x->gl_editor)
+        {           /* just put us in front */
+#ifdef MSW
+            canvas_vis(x, 0);
+            canvas_vis(x, 1);
+#else
+            sys_vgui("raise .x%lx\n", x);
+            sys_vgui("focus .x%lx.c\n", x);
+            sys_vgui("wm deiconify .x%lx\n", x);  
+#endif
+        }
+        else
+        {
+            canvas_create_editor(x, 1);
+            sys_vgui("pdtk_canvas_new .x%lx %d %d +%d+%d %d\n", x,
+                (int)(x->gl_screenx2 - x->gl_screenx1),
+                (int)(x->gl_screeny2 - x->gl_screeny1),
+                (int)(x->gl_screenx1), (int)(x->gl_screeny1),
+                x->gl_edit);
+            canvas_reflecttitle(x);
+            x->gl_havewindow = 1;
+            canvas_updatewindowlist();
+        }
+    }
+    else    /* make invisible */
+    {
+        int i;
+        t_canvas *x2;
+        if (!x->gl_havewindow)
+        {
+                /* bug workaround -- a graph in a visible patch gets "invised"
+                when the patch is closed, and must lose the editor here.  It's
+                probably not the natural place to do this.  Other cases like
+                subpatches fall here too but don'd need the editor freed, so
+                we check if it exists. */
+            if (x->gl_editor)
+                canvas_create_editor(x, 0);
+            return;
+        }
+        sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", x);
+        glist_noselect(x);
+        if (glist_isvisible(x))
+            canvas_map(x, 0);
+        canvas_create_editor(x, 0);
+        sys_vgui("destroy .x%lx\n", x);
+        for (i = 1, x2 = x; x2; x2 = x2->gl_next, i++)
+            ;
+        sys_vgui(".mbar.find delete %d\n", i);
+            /* if we're a graph on our parent, and if the parent exists
+               and is visible, show ourselves on parent. */
+        if (glist_isgraph(x) && x->gl_owner)
+        {
+            t_glist *gl2 = x->gl_owner;
+            if (!x->gl_owner->gl_isdeleting)
+                canvas_create_editor(x, 1);
+            if (glist_isvisible(gl2))
+                gobj_vis(&x->gl_gobj, gl2, 0);
+            x->gl_havewindow = 0;
+            if (glist_isvisible(gl2))
+                gobj_vis(&x->gl_gobj, gl2, 1);
+        }
+        else x->gl_havewindow = 0;
+        canvas_updatewindowlist();
+    }
+}
+
     /* set a canvas up as a graph-on-parent.  Set reasonable defaults for
     any missing paramters and redraw things if necessary. */
 void canvas_setgraph(t_glist *x, int flag, int nogoprect)
 {
     if (!flag && glist_isgraph(x))
     {
+        int hadeditor = (x->gl_editor != 0);
+        if (hadeditor)
+            canvas_create_editor(x, 0);
         if (x->gl_owner && !x->gl_loading && glist_isvisible(x->gl_owner))
             gobj_vis(&x->gl_gobj, x->gl_owner, 0);
         x->gl_isgraph = 0;
@@ -831,6 +990,8 @@
             gobj_vis(&x->gl_gobj, x->gl_owner, 1);
             canvas_fixlinesfor(x->gl_owner, &x->gl_obj);
         }
+        if (hadeditor)
+            canvas_create_editor(x, 1);
     }
     else if (flag)
     {

Modified: trunk/pd/src/g_graph.c
===================================================================
--- trunk/pd/src/g_graph.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/g_graph.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -176,8 +176,9 @@
 
 t_canvas *glist_getcanvas(t_glist *x)
 {
-    while (x->gl_owner && !x->gl_havewindow && x->gl_isgraph)
-        x = x->gl_owner;
+    while (x->gl_owner && !x->gl_havewindow && x->gl_isgraph &&
+        gobj_shouldvis(&x->gl_gobj, x->gl_owner))
+            x = x->gl_owner;
     return((t_canvas *)x);
 }
 
@@ -671,7 +672,6 @@
 
 /* --------------------------- widget behavior  ------------------- */
 
-extern t_widgetbehavior text_widgetbehavior;
 int garray_getname(t_garray *x, t_symbol **namep);
 
 
@@ -904,7 +904,7 @@
             hadwindow = x->gl_havewindow;
             x->gl_havewindow = 0;
             for (g = x->gl_list; g; g = g->g_next)
-                if ((!(ob = pd_checkobject(&g->g_pd))) || text_shouldvis(ob, x))
+                if (gobj_shouldvis(g, x))
             {
                     /* don't do this for arrays, just let them hang outside the
                     box. */
@@ -1107,8 +1107,6 @@
         A_SYMBOL, A_FLOAT, A_SYMBOL, A_DEFFLOAT, A_NULL);
     class_addmethod(canvas_class, (t_method)canvas_menuarray,
         gensym("menuarray"), A_NULL);
-    class_addmethod(canvas_class, (t_method)glist_arraydialog,
-        gensym("arraydialog"), A_SYMBOL, A_FLOAT, A_FLOAT, A_FLOAT, A_NULL);
     class_addmethod(canvas_class, (t_method)glist_sort,
         gensym("sort"), A_NULL);
 }

Modified: trunk/pd/src/g_template.c
===================================================================
--- trunk/pd/src/g_template.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/g_template.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -721,11 +721,11 @@
         t_symbol *fd_symbol;    /* the field is a constant symbol */
         t_symbol *fd_varsym;    /* the field is variable and this is the name */
     } fd_un;
-    t_float fd_v1;        /* min and max values */
-    t_float fd_v2;
-    t_float fd_screen1;   /* min and max screen values */
-    t_float fd_screen2;
-    t_float fd_quantum;   /* quantization in value */ 
+    float fd_v1;        /* min and max values */
+    float fd_v2;
+    float fd_screen1;   /* min and max screen values */
+    float fd_screen2;
+    float fd_quantum;   /* quantization in value */ 
 };
 
 static void fielddesc_setfloat_const(t_fielddesc *fd, t_float f)
@@ -2225,7 +2225,7 @@
     else
     {
             /* key entry for a numeric field.  This is just a stopgap. */
-        t_float newf;
+        float newf;
         if (drawnumber_motion_firstkey)
             sbuf[0] = 0;
         else sprintf(sbuf, "%g", template_getfloat(drawnumber_motion_template,

Modified: trunk/pd/src/g_text.c
===================================================================
--- trunk/pd/src/g_text.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/g_text.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -989,7 +989,7 @@
     t_text *x = (t_text *)z;
     t_rtext *y = glist_findrtext(glist, x);
     rtext_select(y, state);
-    if (glist_isvisible(glist) && text_shouldvis(x, glist))
+    if (glist_isvisible(glist) && gobj_shouldvis(&x->te_g, glist))
         sys_vgui(".x%lx.c itemconfigure %sR -fill %s\n", glist, 
             rtext_gettag(y), (state? "blue" : "black"));
 }
@@ -1007,22 +1007,12 @@
     canvas_deletelinesfor(glist, x);
 }
 
-    /* return true if the text box should be drawn.  We don't show text boxes
-    inside graphs---except comments, if we're doing the new (goprect) style. */
-int text_shouldvis(t_text *x, t_glist *glist)
-{
-    return (glist->gl_havewindow ||
-        (x->te_pd != canvas_class && x->te_pd->c_wb != &text_widgetbehavior) ||
-        (x->te_pd == canvas_class && (((t_glist *)x)->gl_isgraph)) ||
-        (glist->gl_goprect && (x->te_type == T_TEXT)));
-}
-
 static void text_vis(t_gobj *z, t_glist *glist, int vis)
 {
     t_text *x = (t_text *)z;
     if (vis)
     {
-        if (text_shouldvis(x, glist))
+        if (gobj_shouldvis(&x->te_g, glist))
         {
             t_rtext *y = glist_findrtext(glist, x);
             if (x->te_type == T_ATOM)
@@ -1035,7 +1025,7 @@
     else
     {
         t_rtext *y = glist_findrtext(glist, x);
-        if (text_shouldvis(x, glist))
+        if (gobj_shouldvis(&x->te_g, glist))
         {
             text_eraseborder(x, glist, rtext_gettag(y));
             rtext_erase(y);

Modified: trunk/pd/src/m_class.c
===================================================================
--- trunk/pd/src/m_class.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/m_class.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -18,6 +18,10 @@
 #include <string.h>
 #include <stdio.h>
 
+#ifdef _MSC_VER  /* This is only for Microsoft's compiler, not cygwin, e.g. */
+#define snprintf sprintf_s
+#endif
+
 static t_symbol *class_loadsym;     /* name under which an extern is invoked */
 static void pd_defaultfloat(t_pd *x, t_float f);
 static void pd_defaultlist(t_pd *x, t_symbol *s, int argc, t_atom *argv);
@@ -149,7 +153,6 @@
     argument form, one for the multiple one; see select_setup() to find out
     how this is handled.  */
 
-extern t_widgetbehavior text_widgetbehavior;
 extern void text_save(t_gobj *z, t_binbuf *b);
 
 t_class *class_new(t_symbol *s, t_newmethod newmethod, t_method freemethod,
@@ -168,7 +171,7 @@
     {
         if (count == MAXPDARG)
         {
-            error("class %s: sorry: only %d creation args allowed",
+            error("class %s: sorry: only %d args typechecked; use A_GIMME",
                 s->s_name, MAXPDARG);
             break;
         }
@@ -300,6 +303,19 @@
     }
     else
     {
+        int i;
+        for (i = 0; i < c->c_nmethod; i++)
+            if (c->c_methods[i].me_name == sel)
+        {
+            char nbuf[80];
+            snprintf(nbuf, 80, "%s_aliased", sel->s_name);
+            c->c_methods[i].me_name = gensym(nbuf);
+            if (c == pd_objectmaker)
+                post("warning: class '%s' overwritten; old one renamed '%s'",
+                    sel->s_name, nbuf);
+            else post("warning: old method '%s' for class '%s' renamed '%s'",
+                sel->s_name, c->c_name->s_name, nbuf);
+        }
         c->c_methods = t_resizebytes(c->c_methods,
             c->c_nmethod * sizeof(*c->c_methods),
             (c->c_nmethod + 1) * sizeof(*c->c_methods));

Modified: trunk/pd/src/m_pd.h
===================================================================
--- trunk/pd/src/m_pd.h	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/m_pd.h	2008-05-22 18:25:27 UTC (rev 9867)
@@ -9,9 +9,9 @@
 #endif
 
 #define PD_MAJOR_VERSION 0
-#define PD_MINOR_VERSION 41
-#define PD_BUGFIX_VERSION 4
-#define PD_TEST_VERSION ""
+#define PD_MINOR_VERSION 42
+#define PD_BUGFIX_VERSION 0
+#define PD_TEST_VERSION "test1"
 
 /* old name for "MSW" flag -- we have to take it for the sake of many old
 "nmakefiles" for externs, which will define NT and not MSW */
@@ -55,12 +55,16 @@
 #define MAXPDARG 5              /* max number of args we can typecheck today */
 
 /* signed and unsigned integer types the size of a pointer:  */
-/* GG: long is the size of a pointer */
-typedef long t_int;
+#if !defined(PD_LONGINTTYPE)
+#define PD_LONGINTTYPE long
+#endif
+#if !defined(PD_FLOATTYPE)
+#define PD_FLOATTYPE float
+#endif
+typedef PD_LONGINTTYPE t_int;       /* pointer-size integer */
+typedef PD_FLOATTYPE t_float;       /* a float type at most the same size */
+typedef PD_FLOATTYPE t_floatarg;    /* float type for function calls */
 
-typedef float t_float;  /* a floating-point number at most the same size */
-typedef float t_floatarg;  /* floating-point type for function calls */
-
 typedef struct _symbol
 {
     char *s_name;
@@ -443,7 +447,7 @@
 EXTERN void post(const char *fmt, ...);
 EXTERN void startpost(const char *fmt, ...);
 EXTERN void poststring(const char *s);
-EXTERN void postfloat(float f);
+EXTERN void postfloat(t_floatarg f);
 EXTERN void postatom(int argc, t_atom *argv);
 EXTERN void endpost(void);
 EXTERN void error(const char *fmt, ...);
@@ -457,6 +461,7 @@
 
 /* ------------  system interface routines ------------------- */
 EXTERN int sys_isreadablefile(const char *name);
+EXTERN int sys_isabsolutepath(const char *dir);
 EXTERN void sys_bashfilename(const char *from, char *to);
 EXTERN void sys_unbashfilename(const char *from, char *to);
 EXTERN int open_via_path(const char *name, const char *ext, const char *dir,
@@ -474,7 +479,7 @@
 
 /* --------------- signals ----------------------------------- */
 
-typedef float t_sample;
+typedef PD_FLOATTYPE t_sample;
 #define MAXLOGSIG 32
 #define MAXSIGSIZE (1 << MAXLOGSIG)
 

Modified: trunk/pd/src/notes.txt
===================================================================
--- trunk/pd/src/notes.txt	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/notes.txt	2008-05-22 18:25:27 UTC (rev 9867)
@@ -43,6 +43,7 @@
 loading e-mailed patches without removing headers crashes pd
 check if _vsnprintf with zero argument in windows works any better...
 detect adc~ and dac~ reblocking
+wierd bug: help doesn't work if pd is started in 5.reference directory
 
 more demonstration patches:
 vibrato using variable delay
@@ -50,6 +51,8 @@
 document ||, |, etc, better
 
 features:
+pasting should look at current mouse location
+optionally suppress leading "." directories and files on "open"
 change config.h to #ifdef _MSC_VER (include MSW fake) else include a real one
 stick snprintf alias in the MSW fake.
 flag to prevent unlocking patches
@@ -80,7 +83,6 @@
     flag to hide array names 
 think of a way to embed abstractions in a patch
 make watchdog work for MACOSX
-pasting should look at current mouse location
 delete-in-rectangle message to Pds
 put serial object in main dist (see rat at telecoma, Apr. 25; winfried May 22)
 open/save panel to take messages to init directory, and to set extent list

Modified: trunk/pd/src/s_main.c
===================================================================
--- trunk/pd/src/s_main.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/s_main.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -282,7 +282,8 @@
     if (!noprefs)
         sys_loadpreferences();                  /* load default settings */
 #ifndef MSW
-    sys_rcfile();                               /* parse the startup file */
+    if (!noprefs)
+        sys_rcfile();                           /* parse the startup file */
 #endif
     if (sys_argparse(argc-1, argv+1))           /* parse cmd line */
         return (1);

Modified: trunk/pd/src/s_path.c
===================================================================
--- trunk/pd/src/s_path.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/s_path.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -69,6 +69,24 @@
     *to = 0;
 }
 
+/* test if path is absolute or relative, based on leading /, env vars, ~, etc */
+int sys_isabsolutepath(const char *dir)
+{
+    if (dir[0] == '/' || dir[0] == '~'
+#ifdef MSW
+        || dir[0] == '%' || (dir[1] == ':' && dir[2] == '/')
+#endif
+        )
+    {
+        return 1;
+    }
+    else
+    {
+        return 0;            
+    }
+}
+
+
 /*******************  Utility functions used below ******************/
 
 /*!
@@ -250,11 +268,7 @@
 int sys_open_absolute(const char *name, const char* ext,
     char *dirresult, char **nameresult, unsigned int size, int bin, int *fdp)
 {
-    if (name[0] == '/' 
-#ifdef MSW
-        || (name[1] == ':' && name[2] == '/')
-#endif
-            )
+    if (sys_isabsolutepath(name))
     {
         char dirbuf[MAXPDSTRING];
         int dirlen = (strrchr(name, '/') - name);

Modified: trunk/pd/src/s_stuff.h
===================================================================
--- trunk/pd/src/s_stuff.h	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/s_stuff.h	2008-05-22 18:25:27 UTC (rev 9867)
@@ -325,3 +325,4 @@
                                   int pitch,
                                   int value);
 /* } jsarlo */
+extern t_widgetbehavior text_widgetbehavior;

Modified: trunk/pd/src/x_arithmetic.c
===================================================================
--- trunk/pd/src/x_arithmetic.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/x_arithmetic.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -623,7 +623,6 @@
     outlet_float(x->ob_outlet, r);
 }
 
-
 static t_class *exp_class;      /* ----------- exp --------------- */
 
 static void *exp_new(void)
@@ -659,6 +658,20 @@
     outlet_float(x->ob_outlet, fabsf(f));
 }
 
+static t_class *wrap_class;      /* ----------- wrap --------------- */
+
+static void *wrap_new(void)
+{
+    t_object *x = (t_object *)pd_new(wrap_class);
+    outlet_new(x, &s_float);
+    return (x);
+}
+
+static void wrap_float(t_object *x, t_float f)
+{
+    outlet_float(x->ob_outlet, f - floor(f));
+}
+
 /* ------------------------  misc ------------------------ */
 
 static t_class *clip_class;
@@ -898,6 +911,11 @@
     class_addfloat(abs_class, (t_method)abs_float);    
     class_sethelpsymbol(abs_class, math_sym);
 
+    wrap_class = class_new(gensym("wrap"), wrap_new, 0,
+        sizeof(t_object), 0, 0);
+    class_addfloat(wrap_class, (t_method)wrap_float);    
+    class_sethelpsymbol(wrap_class, math_sym);
+
 /* ------------------------  misc ------------------------ */
 
     clip_setup();

Modified: trunk/pd/src/x_time.c
===================================================================
--- trunk/pd/src/x_time.c	2008-05-22 17:28:51 UTC (rev 9866)
+++ trunk/pd/src/x_time.c	2008-05-22 18:25:27 UTC (rev 9867)
@@ -334,7 +334,7 @@
         {
             char stupid[80];
             atom_string(&argv[argc-1], stupid, 79);
-            post("pipe: %s: bad time delay value", stupid);
+            pd_error(x, "pipe: %s: bad time delay value", stupid);
             deltime = 0;
         }
         else deltime = argv[argc-1].a_w.w_float;
@@ -385,7 +385,7 @@
             }
             else
             {
-                if (c != 'f') error("pack: %s: bad type",
+                if (c != 'f') pd_error(x, "pipe: %s: bad type",
                     ap->a_w.w_symbol->s_name);
                 SETFLOAT(&vp->p_atom, 0);
                 vp->p_outlet = outlet_new(&x->x_obj, &s_float);
@@ -437,7 +437,7 @@
         case A_POINTER:
             if (gpointer_check(w->w_gpointer, 1))
                 outlet_pointer(p->p_outlet, w->w_gpointer);
-            else post("pipe: stale pointer");
+            else pd_error(x, "pipe: stale pointer");
             break;
         }
     }
@@ -454,7 +454,13 @@
     t_atom *ap;
     t_word *w;
     h->h_gp = (t_gpointer *)getbytes(x->x_nptr * sizeof(t_gpointer));
-    if (ac > n) ac = n;
+    if (ac > n)
+    {
+        if (av[n].a_type == A_FLOAT)
+            x->x_deltime = av[n].a_w.w_float;
+        else pd_error(x, "pipe: symbol or pointer in time inlet");
+        ac = n;
+    }
     for (i = 0, gp = x->x_gp, p = x->x_vec, ap = av; i < ac;
         i++, p++, ap++)
     {
@@ -465,7 +471,7 @@
         case A_POINTER:
             gpointer_unset(gp);
             if (ap->a_type != A_POINTER)
-                post("pipe: bad pointer");
+                pd_error(x, "pipe: bad pointer");
             else
             {
                 *gp = *(ap->a_w.w_gpointer);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Pd-cvs mailing list