Commit d6419fd9 authored by Jonathan Wilkes's avatar Jonathan Wilkes
Browse files

port c6771297b6f03887034c5f121d3dbf701623ab87 from Pd-l2ork: the big Vanilla...

port c6771297b6f03887034c5f121d3dbf701623ab87 from Pd-l2ork: the big Vanilla forward port won't compile without this commit
parent 6c456771
0
0
0
0
0
0
0
0
0
0
0
0.00666678
0.060001
0.173336
0.540009
-0.0266671
-0.20667
-0.406674
-0.713345
-0.833347
-0.933349
-1.04668
-0.980017
-0.800014
-0.686678
-0.526676
-0.443341
-0.360006
-0.20667
-0.140002
-0.0733346
-0.00666678
0.060001
0.173336
0.313339
0.400007
0.433341
0.39334
0.293338
0.18667
0.0800014
0.0400007
0.060001
0.0733346
0.0933349
0.113335
0.126669
0.100002
0.0666678
0.0400007
0.0200003
0.0200003
-0.0400007
-0.0266671
-0.00666678
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
#N canvas 558 349 688 433 12;
#X text 34 388 see also:;
#X text 485 171 (click for details:), f 11;
#N canvas 930 175 716 699 define 0;
#X text 324 399 creation arguments:;
#X text 217 152 send a pointer to a named receive object;
#X floatatom 145 299 5 0 0 0 - - -, f 5;
#X text 46 408 click to open or edit array:;
#X msg 31 116 read scalar-object-help.txt;
#X text 258 117 read/write a file TBW;
#X obj 145 251 r scalar-help-send;
#X text 359 457 template;
#X text 360 478 optional name (TBW);
#X obj 145 275 get scalar-help-template1 x;
#N canvas 464 264 450 300 scalar-help-template1 0;
#X obj 62 55 struct scalar-help-template1 float x float y;
#X obj 55 99 drawpolygon 3 3 0 0 0 30 30 30 30 0 0 0;
#X msg 89 193 traverse pd-scalar-help-template1 \, bang;
#X obj 89 218 pointer;
#X msg 20 195 40 40;
#X obj 53 252 append scalar-help-template1 x y;
#X connect 2 0 3 0;
#X connect 3 0 5 2;
#X connect 4 0 5 0;
#X restore 471 57 pd scalar-help-template1;
#X floatatom 404 244 3 0 500 0 - - -, f 3;
#X obj 506 244 r scalar-help-send;
#X obj 405 282 set scalar-help-template1 x y;
#X floatatom 458 244 3 0 500 0 - - -, f 3;
#X text 32 20 "scalar define" defines and maintains a scalar.;
#X text 471 29 here's the template:;
#X obj 145 324 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
-1 -1;
#X msg 40 152 send scalar-help-send;
#X obj 27 435 scalar define -k scalar-help-template1;
#A set scalar-help-template1 175 150 \;;
#X text 360 435 optional -k flag to keep contents;
#X connect 2 0 17 0;
#X connect 4 0 19 0;
#X connect 6 0 9 0;
#X connect 9 0 2 0;
#X connect 11 0 13 0;
#X connect 12 0 13 2;
#X connect 14 0 13 1;
#X connect 18 0 19 0;
#X restore 486 212 pd define;
#X obj 163 388 text;
#X text 201 210 - create \, store \, and/or edit one;
#X text 96 260 (later);
#X obj 19 8 scalar;
#X text 77 7 - create a scalar datum;
#X obj 90 212 scalar define;
#X text 194 261 - more stuff;
#X text 81 180 The first argument sets the function:;
#X obj 114 387 array;
#X obj 204 388 list;
#X text 101 57 experimental - doesn't do much yet. This is included
in 0.45 to check that its design will work coherently with the array
and text objects.;
#X text 444 398 updated for Pd version 0.45;
......@@ -424,6 +424,7 @@ t_garray *graph_array(t_glist *gl, t_symbol *s, int argc, t_atom *argv)
t_symbol *fill;
t_symbol *outline;
int fflags;
t_symbol *asym = gensym("#A");
if (argc < 3) {pd_error(gl, "garray: not enough args"); return 0;}
t_symbol *name = atom_getsymbolarg(0, argc--, argv++);
......@@ -503,9 +504,19 @@ t_garray *graph_array(t_glist *gl, t_symbol *s, int argc, t_atom *argv)
fill, 1);
template_setsymbol(template, gensym("outlinecolor"), x->x_scalar->sc_vec,
outline, 1);
if (x2 = pd_findbyclass(gensym("#A"), garray_class))
/* bashily unbind #A -- this would create garbage if #A were
multiply bound but we believe in this context it's at most
bound to whichever textobj or array was created most recently */
asym->s_thing = 0;
/* and now bind #A to us to receive following messages in the
saved file or copy buffer */
pd_bind(&x->x_gobj.g_pd, asym);
/*if (x2 = pd_findbyclass(gensym("#A"), garray_class))
pd_unbind(x2, gensym("#A"));
pd_bind(&x->x_gobj.g_pd, gensym("#A"));
pd_bind(&x->x_gobj.g_pd, gensym("#A"));*/
garray_redraw(x);
/* todo: need to test to see if this is necessary
......@@ -1415,6 +1426,28 @@ static int garray_click(t_gobj *z, t_glist *glist,
#define ARRAYWRITECHUNKSIZE 1000
void garray_savecontentsto(t_garray *x, t_binbuf *b)
{
if (x->x_saveit)
{
t_array *array = garray_getarray(x);
int n = array->a_n, n2 = 0;
if (n > 200000)
post("warning: I'm saving an array with %d points!\n", n);
while (n2 < n)
{
int chunk = n - n2, i;
if (chunk > ARRAYWRITECHUNKSIZE)
chunk = ARRAYWRITECHUNKSIZE;
binbuf_addv(b, "si", gensym("#A"), n2);
for (i = 0; i < chunk; i++)
binbuf_addv(b, "f", ((t_word *)(array->a_vec))[n2+i].w_float);
binbuf_addv(b, ";");
n2 += chunk;
}
}
}
void garray_save(t_gobj *z, t_binbuf *b)
{
int filestyle;
......
......@@ -656,6 +656,11 @@ EXTERN t_scalar *scalar_new(t_glist *owner,
EXTERN void word_free(t_word *wp, t_template *tmpl);
EXTERN void scalar_getbasexy(t_scalar *x, t_float *basex, t_float *basey);
EXTERN void scalar_redraw(t_scalar *x, t_glist *glist);
EXTERN void canvas_writescalar(t_symbol *templatesym, t_word *w, t_binbuf *b,
int amarrayelement);
EXTERN int canvas_readscalar(t_glist *x, int natoms, t_atom *vec,
int *p_nextmsg, int selectit);
EXTERN int template_has_elemtemplate(t_template *t, t_template *tmp);
/* ------helper routines for "garrays" and "plots" -------------- */
......
......@@ -46,7 +46,7 @@ static void canvas_reselect(t_canvas *x);
static void canvas_cut(t_canvas *x);
static int paste_xyoffset = 0; /* a counter of pastes to make x,y offsets */
//static void canvas_mouseup_gop(t_canvas *x, t_gobj *g);
static void canvas_done_popup(t_canvas *x, t_float which, t_float xpos,
void canvas_done_popup(t_canvas *x, t_float which, t_float xpos,
t_float ypos);
static void canvas_doarrange(t_canvas *x, t_float which, t_gobj *oldy,
t_gobj *oldy_prev, t_gobj *oldy_next);
......@@ -2254,6 +2254,7 @@ t_gobj *canvas_findhitbox(t_canvas *x, int xpos, int ypos,
return (rval);
}
extern t_class *array_define_class;
extern int scalar_getcanvasfield(t_scalar *x);
/* right-clicking on a canvas object pops up a menu. */
......@@ -2306,6 +2307,14 @@ static void canvas_rightclick(t_canvas *x, int xpos, int ypos, t_gobj *y_sel)
isobject = 1;
}
else isobject = 0;
if (x->gl_owner && ((t_gobj *)x)->g_pd == array_define_class)
{
//fprintf(stderr,"owner=%s\n", ((t_gobj *)x)->g_pd->c_name->s_name);
// special case: we are inside an array define and should not have
// access to any options, so we disable them all
// LATER: consider enabling help and perhaps even limited properties...
return;
}
gui_vmess("gui_canvas_popup", "xiiiii",
x,
xpos,
......@@ -2927,7 +2936,7 @@ static void canvas_doarrange(t_canvas *x, t_float which, t_gobj *oldy,
"open," or "help." */
/* Ivica Ico Bukvic <ico@bukvic.net> 2010-11-17
also added "To Front" and "To Back" */
static void canvas_done_popup(t_canvas *x, t_float which, t_float xpos,
void canvas_done_popup(t_canvas *x, t_float which, t_float xpos,
t_float ypos)
{
//fprintf(stderr,"x->gl_edit=%d\n", x->gl_edit);
......
......@@ -1078,7 +1078,7 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
(int)glist_ytopixels(x, x->gl_xlabely),
x->gl_xlabel[i]->s_name,
sys_font,
glist_getfont(x),
sys_hostfontsize(glist_getfont(x)),
sys_fontweight,
x1,
y1);
......@@ -1094,7 +1094,7 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
(int)glist_ytopixels(x, atof(x->gl_ylabel[i]->s_name)),
x->gl_ylabel[i]->s_name,
sys_font,
glist_getfont(x),
sys_hostfontsize(glist_getfont(x)),
sys_fontweight,
x1,
y1);
......
......@@ -37,8 +37,9 @@ static int canvas_scanbinbuf(int natoms, t_atom *vec, int *p_indexout,
return (i - indexwas);
}
int glist_readscalar(t_glist *x, int natoms, t_atom *vec,
int *p_nextmsg, int selectit);
int canvas_readscalar(t_glist *x, int natoms, t_atom *vec,
int *p_nextmsg, int selectit);
static void canvas_readerror(int natoms, t_atom *vec, int message,
int nline, char *s)
......@@ -116,7 +117,7 @@ static void glist_readatoms(t_glist *x, int natoms, t_atom *vec,
void scalar_doloadbang(t_scalar *x);
int glist_readscalar(t_glist *x, int natoms, t_atom *vec,
int canvas_readscalar(t_glist *x, int natoms, t_atom *vec,
int *p_nextmsg, int selectit)
{
int message, nline;
......@@ -249,7 +250,7 @@ void glist_readfrombinbuf(t_glist *x, t_binbuf *b, char *filename, int selectem)
}
while (nextmsg < natoms)
{
glist_readscalar(x, natoms, vec, &nextmsg, selectem);
canvas_readscalar(x, natoms, vec, &nextmsg, selectem);
}
}
......
......@@ -339,7 +339,7 @@ t_scalar *scalar_new(t_glist *owner, t_symbol *templatesym)
/* Pd method to create a new scalar, add it to a glist, and initialize
it from the message arguments. */
int glist_readscalar(t_glist *x, int natoms, t_atom *vec,
int canvas_readscalar(t_glist *x, int natoms, t_atom *vec,
int *p_nextmsg, int selectit);
void glist_scalar(t_glist *glist,
......@@ -362,7 +362,7 @@ void glist_scalar(t_glist *glist,
natoms = binbuf_getnatom(b);
vec = binbuf_getvec(b);
glist_readscalar(glist, natoms, vec, &nextmsg, 0);
canvas_readscalar(glist, natoms, vec, &nextmsg, 0);
binbuf_free(b);
}
......
......@@ -39,6 +39,7 @@ void x_net_setup(void);
void x_qlist_setup(void);
void x_gui_setup(void);
void x_list_setup(void);
void x_scalar_setup(void);
void expr_setup(void);
void x_preset_setup(void);
void d_arithmetic_setup(void);
......@@ -91,6 +92,7 @@ void conf_init(void)
x_qlist_setup();
x_gui_setup();
x_list_setup();
x_scalar_setup();
expr_setup();
x_preset_setup();
d_arithmetic_setup();
......
......@@ -75,7 +75,7 @@ OPT_SAFE_SRC = g_canvas.c g_graph.c g_text.c g_rtext.c g_array.c g_template.c g_
d_resample.c \
x_arithmetic.c x_connective.c x_interface.c x_midi.c x_misc.c \
x_time.c x_acoustics.c x_net.c x_text.c x_gui.c x_list.c x_array.c x_preset.c\
x_vexp.c x_vexp_if.c x_vexp_fun.c import.c \
x_scalar.c x_vexp.c x_vexp_if.c x_vexp_fun.c import.c \
$(SYSSRC)
SRC = $(TYPE_PUNNING_SRC) $(OPT_SAFE_SRC)
......
......@@ -121,7 +121,7 @@ SRC = g_canvas.c g_graph.c g_text.c g_rtext.c g_array.c g_template.c g_io.c \
d_delay.c d_resample.c x_arithmetic.c x_connective.c x_interface.c \
x_midi.c x_misc.c x_time.c x_acoustics.c x_net.c x_text.c x_gui.c \
x_list.c x_array.c d_soundfile.c g_vslider.c g_vdial.c import.c \
x_vexp.c x_vexp_if.c x_vexp_fun.c \
x_scalar.c x_vexp.c x_vexp_if.c x_vexp_fun.c \
g_undo.c s_utf8.c
SRSRC = u_pdsend.c u_pdreceive.c
......
......@@ -39,7 +39,7 @@ SRC = g_canvas.c g_graph.c g_text.c g_rtext.c g_array.c g_template.c g_io.c \
d_delay.c d_resample.c \
x_arithmetic.c x_connective.c x_interface.c x_midi.c x_misc.c \
x_time.c x_acoustics.c x_net.c x_text.c x_gui.c x_list.c x_array.c d_soundfile.c \
x_vexp.c x_vexp_if.c x_vexp_fun.c $(SYSSRC)
x_scalar.c x_vexp.c x_vexp_if.c x_vexp_fun.c $(SYSSRC)
PADIR = ..\portaudio
INCPA = -I$(PADIR)\include -I$(PADIR)\src\common -I..\lib\asio
......
......@@ -188,7 +188,7 @@ static void *array_define_new(t_symbol *s, int argc, t_atom *argv)
return (x);
}
void garray_save(t_garray *x, t_binbuf *b);
void garray_savecontentsto(t_garray *x, t_binbuf *b);
void array_define_save(t_gobj *z, t_binbuf *bb)
{
......@@ -201,7 +201,7 @@ void array_define_save(t_gobj *z, t_binbuf *bb)
if (gl)
{
garray_save((t_gobj *)gl->gl_list, bb);
garray_savecontentsto((t_garray *)gl->gl_list, bb);
obj_saveformat(&x->gl_obj, bb);
}
else
......@@ -854,6 +854,8 @@ static void *arrayobj_new(t_symbol *s, int argc, t_atom *argv)
}
void canvas_add_for_class(t_class *c);
extern void canvas_done_popup(t_canvas *x, t_float which, t_float xpos,
t_float ypos);
/* ---------------- global setup function -------------------- */
......@@ -871,6 +873,15 @@ void x_array_setup(void )
class_addmethod(array_define_class, (t_method)array_define_ignore,
gensym("editmode"), A_GIMME, 0);
// dummy calls to make it work with Jonathan's additions to the array
class_addmethod(array_define_class, (t_method)array_define_ignore,
gensym("relocate"), A_GIMME, 0);
class_addmethod(array_define_class, (t_method)array_define_ignore,
gensym("scalar_mouseover"), A_GIMME, 0);
// removes complaint that array define has no done-popup call
class_addmethod(array_define_class, (t_method)array_define_ignore,
gensym("done-popup"), A_GIMME, 0);
class_addcreator((t_newmethod)arrayobj_new, gensym("array"), A_GIMME, 0);
class_addcreator((t_newmethod)table_new, gensym("table"),
......
/* Copyright (c) 1997-2013 Miller Puckette and others.
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
/* The "scalar" object. */
#include "m_pd.h"
#include "g_canvas.h"
#include <string.h>
#include <stdio.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef _WIN32
#include <io.h>
#endif
extern t_pd *newest;
t_class *scalar_define_class;
static void *scalar_define_new(t_symbol *s, int argc, t_atom *argv)
{
t_atom a[9];
t_glist *gl;
t_canvas *x, *z = canvas_getcurrent();
t_symbol *templatesym = &s_float, *asym = gensym("#A");
t_template *template;
t_scalar *sc;
int keep = 0;
while (argc && argv->a_type == A_SYMBOL &&
*argv->a_w.w_symbol->s_name == '-')
{
if (!strcmp(argv->a_w.w_symbol->s_name, "-k"))
keep = 1;
else
{
error("scalar define: unknown flag ...");
postatom(argc, argv);
}
argc--; argv++;
}
if (argc && argv->a_type == A_SYMBOL)
{
templatesym = argv->a_w.w_symbol;
argc--; argv++;
}
if (argc)
{
post("warning: scalar define ignoring extra argument: ");
postatom(argc, argv);
}
/* make a canvas... */
SETFLOAT(a, 0);
SETFLOAT(a+1, 50);
SETFLOAT(a+2, 600);
SETFLOAT(a+3, 400);
SETSYMBOL(a+4, s);
SETFLOAT(a+5, 0);
x = canvas_new(0, 0, 6, a);
x->gl_owner = z;
x->gl_private = 0;
/* put a scalar in it */
template = template_findbyname(canvas_makebindsym(templatesym));
if (!template)
{
pd_error(x, "scalar define: couldn't find template %s",
templatesym->s_name);
goto noscalar;
}
sc = scalar_new(x, canvas_makebindsym(templatesym));
if (!sc)
{
pd_error(x, "%s: couldn't create scalar", templatesym->s_name);
goto noscalar;
}
sc->sc_gobj.g_next = 0;
x->gl_list = &sc->sc_gobj;
x->gl_private = keep;
/* bashily unbind #A -- this would create garbage if #A were
multiply bound but we believe in this context it's at most
bound to whichever text_define or array was created most recently */
asym->s_thing = 0;
/* and now bind #A to us to receive following messages in the
saved file or copy buffer */
pd_bind(&x->gl_obj.ob_pd, asym);
noscalar:
newest = &x->gl_pd; /* mimic action of canvas_pop() */
pd_popsym(&x->gl_pd);
x->gl_loading = 0;
/* bash the class to "scalar define" -- see comment in x_array,c */
x->gl_obj.ob_pd = scalar_define_class;
return (x);
}
/* send a pointer to the scalar to whomever is bound to the symbol */
static void scalar_define_send(t_glist *x, t_symbol *s)
{
if (!s->s_thing)
pd_error(x, "scalar_define_send: %s: no such object", s->s_name);
else if (x->gl_list && pd_class(&x->gl_list->g_pd) == scalar_class)
{
t_gpointer gp;
gpointer_init(&gp);
// t_gobj is replaced with t_scalar in vanilla
gpointer_setglist(&gp, x, (t_gobj *)&x->gl_list->g_pd);
pd_pointer(s->s_thing, &gp);
gpointer_unset(&gp);
}
else bug("scalar_define_send");
}
/* set to a list, used to restore from scalar_define_save()s below */
static void scalar_define_set(t_glist *x, t_symbol *s, int argc, t_atom *argv)
{
if (x->gl_list && pd_class(&x->gl_list->g_pd) == scalar_class)
{
t_binbuf *b = binbuf_new();
int nextmsg = 0, natoms;
t_atom *vec;
glist_clear(x);
binbuf_restore(b, argc, argv);
natoms = binbuf_getnatom(b);
vec = binbuf_getvec(b);
canvas_readscalar(x, natoms, vec, &nextmsg, 0);
binbuf_free(b);
}
else bug("scalar_define_set");
}
/* save to a binbuf (for file save or copy) */
static void scalar_define_save(t_gobj *z, t_binbuf *bb)
{
t_glist *x = (t_glist *)z;
binbuf_addv(bb, "ssff", &s__X, gensym("obj"),
(float)x->gl_obj.te_xpix, (float)x->gl_obj.te_ypix);
binbuf_addbinbuf(bb, x->gl_obj.ob_binbuf);
binbuf_addsemi(bb);
if (x->gl_private && x->gl_list &&
pd_class(&x->gl_list->g_pd) == scalar_class)
{
t_binbuf *b2 = binbuf_new();
t_scalar *sc = (t_scalar *)(x->gl_list);
binbuf_addv(bb, "ss", gensym("#A"), gensym("set"));
canvas_writescalar(sc->sc_template, sc->sc_vec, b2, 0);
binbuf_addbinbuf(bb, b2);
binbuf_addsemi(bb);
binbuf_free(b2);
}
}
/* overall creator for "scalar" objects - dispatch to "scalar define" etc */
static void *scalarobj_new(t_symbol *s, int argc, t_atom *argv)
{
if (!argc || argv[0].a_type != A_SYMBOL)
newest = scalar_define_new(s, argc, argv);
else
{
char *str = argv[0].a_w.w_symbol->s_name;
if (!strcmp(str, "d") || !strcmp(str, "define"))
newest = scalar_define_new(s, argc-1, argv+1);
else
{
error("scalar %s: unknown function", str);
newest = 0;
}
}
return (newest);
}
void canvas_add_for_class(t_class *c);
/* ---------------- global setup function -------------------- */
void x_scalar_setup(void )
{
scalar_define_class = class_new(gensym("scalar define"), 0,
(t_method)canvas_free, sizeof(t_canvas), 0, 0);
canvas_add_for_class(scalar_define_class);
class_addmethod(scalar_define_class, (t_method)scalar_define_send,
gensym("send"), A_SYMBOL, 0);
class_addmethod(scalar_define_class, (t_method)scalar_define_set,
gensym("set"