diff options
author | Juha Vehviläinen <jusu@users.sourceforge.net> | 2002-07-06 17:50:18 +0000 |
---|---|---|
committer | Juha Vehviläinen <jusu@users.sourceforge.net> | 2002-07-06 17:50:18 +0000 |
commit | 4d64e4cd434426234a5c313c151cd79b6afc299e (patch) | |
tree | 5c23dd6acc65b869741d3bb9d33912d74bb7407d /Patches/vrgb~.c |
*** empty log message ***svn2git-root
svn path=/trunk/Framestein/; revision=27
Diffstat (limited to 'Patches/vrgb~.c')
-rw-r--r-- | Patches/vrgb~.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/Patches/vrgb~.c b/Patches/vrgb~.c new file mode 100644 index 0000000..d4e2cec --- /dev/null +++ b/Patches/vrgb~.c @@ -0,0 +1,117 @@ +#include "m_pd.h" +#include "math.h" +#include "sharemem.h" +#include "vframe.h" +#include "plugin.h" +#include "displaydepth.h" + +/* -------------------------- vrgb~ ------------------------------ */ +static t_class *vrgb_class; + +typedef struct _vrgb +{ + t_object x_obj; + float x_f; + float mode; /* 0=rgb 1=r ... */ + int depth; +} t_vrgb; + +static t_int *vrgb_perform(t_int *w) +{ + t_float *in = (t_float *)(w[1]); + t_float *r = (t_float *)(w[2]); + t_float *g = (t_float *)(w[3]); + t_float *b = (t_float *)(w[4]); + int n = (int)(w[5]); + t_vrgb *x = (t_vrgb *)(w[6]); + byte cr, cg, cb; + short c16; + long c32; + + // support "x->mode" later.... + + switch(x->depth) + { + case 16: + while (n--) + { + c16 = sampletocolor16(*in++); + cr = r16(c16); + cg = g16(c16); + cb = b16(c16); + *r++ = cr / 255.0; + *g++ = cg / 255.0; + *b++ = cb / 255.0; + +/* *r++ = colortosample16(rgbtocolor16(cr, 0, 0)); + *g++ = colortosample16(rgbtocolor16(0, cg, 0)); + *b++ = colortosample16(rgbtocolor16(0, 0, cb)); +*/ } + break; + case 32: + while (n--) + { + c32 = sampletocolor32(*in++); + cr = r32(c32); + cg = g32(c32); + cb = b32(c32); + *r++ = cr / 255.0; + *g++ = cg / 255.0; + *b++ = cb / 255.0; + +/* *b++ = colortosample32(rgbtocolor32(cr, 0, 0)); + *g++ = colortosample32(rgbtocolor32(0, cg, 0)); + *r++ = colortosample32(rgbtocolor32(0, 0, cb)); +*/ } + break; + } + return (w+7); +} + +static void vrgb_dsp(t_vrgb *x, t_signal **sp) +{ + dsp_add(vrgb_perform, 6, + sp[0]->s_vec, + sp[1]->s_vec, + sp[2]->s_vec, + sp[3]->s_vec, + sp[0]->s_n, + x); +} + +static void vrgb_float(t_vrgb *x, t_float f) +{ + x->mode = f; +post("mode %f", f); +} + +static void *vrgb_new(t_floatarg f) +{ + t_vrgb *x = (t_vrgb *)pd_new(vrgb_class); + x->x_f = f; + x->mode=0; + x->depth = getdisplaydepth(); + if(!x->depth) + { + post("vrgb~: getdisplaydepth() failed, defaulting to 16."); + x->depth = 16; + } + outlet_new(&x->x_obj, gensym("signal")); + outlet_new(&x->x_obj, gensym("signal")); + outlet_new(&x->x_obj, gensym("signal")); + return (x); +} + +static void vrgb_destroy(t_vrgb *x) +{ +} + +void vrgb_tilde_setup(void) +{ + vrgb_class = class_new(gensym("vrgb~"), + (t_newmethod)vrgb_new, (t_method)vrgb_destroy, + sizeof(t_vrgb), 0, A_DEFFLOAT, 0); + CLASS_MAINSIGNALIN(vrgb_class, t_vrgb, x_f); + class_addfloat(vrgb_class, (t_method)vrgb_float); + class_addmethod(vrgb_class, (t_method)vrgb_dsp, gensym("dsp"), 0); +} |