diff options
author | Pablo Martín <caedesv@users.sourceforge.net> | 2003-09-07 21:39:37 +0000 |
---|---|---|
committer | Pablo Martín <caedesv@users.sourceforge.net> | 2003-09-07 21:39:37 +0000 |
commit | 599a8e20c02fa48bab5102d15fab79dd6b631c95 (patch) | |
tree | 80e8760e6a8fdc7d9144370dc569b38232b2b315 /system/type/pdp_image_words.c | |
parent | b509942daafa671a5b5ede267b6e786619ce8173 (diff) |
Updating to last version of pdp 0.12.2
svn path=/trunk/externals/pdp/; revision=940
Diffstat (limited to 'system/type/pdp_image_words.c')
-rw-r--r-- | system/type/pdp_image_words.c | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/system/type/pdp_image_words.c b/system/type/pdp_image_words.c new file mode 100644 index 0000000..32b6652 --- /dev/null +++ b/system/type/pdp_image_words.c @@ -0,0 +1,176 @@ +/* + * Pure Data Packet system implementation. : methods for the 16 bit image packet + * Copyright (c) by Tom Schouten <pdp@zzz.kotnet.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +/* image packet method implementation */ + + +#include "pdp.h" +#include "pdp_forth.h" + + + +// (p0, p1) -> (p0 (operator) p1) +t_pdp_word_error pdp_word_image_pp(t_pdp_stack *s, void *process_routine) +{ + int chanmask = -1; + int packet1 = -1; + int packet2 = -1; + + /* handle stack underflow */ + if (s->elements < 2) return e_underflow; + + /* get the packets from the stack */ + pdp_stack_pop_packet(s, &packet1); + pdp_stack_pop_packet(s, &packet2); + + /* ensure the destination packet is writable */ + pdp_packet_replace_with_writable(&packet1); + + /* process */ + pdp_imageproc_dispatch_2buf(process_routine, 0, chanmask, packet1, packet2); + + /* push result on stack */ + pdp_stack_push_packet(s, packet1); + + /* release the second packet */ + pdp_packet_mark_unused(packet2); + + return e_ok; +} + +t_pdp_word_error pdp_word_image_add(t_pdp_stack *s) {return pdp_word_image_pp(s, pdp_imageproc_add_process);} +t_pdp_word_error pdp_word_image_mul(t_pdp_stack *s) {return pdp_word_image_pp(s, pdp_imageproc_mul_process);} + + +/* enter a (float packet packet) -> (packet) routine */ +#define ENTER_FPP_P(f, p0, p1) \ +void *x; \ +int p0; \ +int p1; \ +float f; \ +if (s->elements < (3)) return e_underflow; \ +pdp_stack_pop_float(s, &(f)); \ +pdp_stack_pop_packet(s, &(p0)); \ +pdp_stack_pop_packet(s, &(p1)); \ +pdp_packet_replace_with_writable(&(p0)); + +/* leave a (float packet packet) -> (packet) routine */ +#define LEAVE_FPP_P(p0, p1) \ +pdp_stack_push_packet(s, p0); \ +pdp_packet_mark_unused(p1); \ +return e_ok; + + +// (f, p0, p1) -> ((1-f)*p0 + f*p1) +t_pdp_word_error pdp_word_image_mix(t_pdp_stack *s) +{ + ENTER_FPP_P(mix, p0, p1); + + /* process */ + x = pdp_imageproc_mix_new(); + pdp_imageproc_mix_setleftgain(x, 1.0f - mix); + pdp_imageproc_mix_setrightgain(x, mix); + pdp_imageproc_dispatch_2buf(&pdp_imageproc_mix_process, x, -1, p0, p1); + pdp_imageproc_mix_delete(x); + + LEAVE_FPP_P(p0, p1); +} + +// (f, p0) -> (f*p0) +t_pdp_word_error pdp_word_image_gain(t_pdp_stack *s) +{ + void *gaindata; + int chanmask = -1; + int packet = -1; + float gain = 0.5f; + + /* handle stack underflow */ + if (s->elements < 2) return e_underflow; + + /* get the packets from the stack */ + pdp_stack_pop_float(s, &gain); + pdp_stack_pop_packet(s, &packet); + + /* ensure the destination packet is writable */ + pdp_packet_replace_with_writable(&packet); + + /* process */ + gaindata = pdp_imageproc_gain_new(); + pdp_imageproc_gain_setgain(gaindata, gain); + pdp_imageproc_dispatch_1buf(&pdp_imageproc_gain_process, gaindata, chanmask, packet); + pdp_imageproc_mix_delete(gaindata); + + /* push result on stack */ + pdp_stack_push_packet(s, packet); + + return e_ok; + +} +// (f, p0) -> (f*p0) +t_pdp_word_error pdp_word_image_chanmask(t_pdp_stack *s) +{ + unsigned int chanmask = 0; + int packet = -1; + + /* handle stack underflow */ + if (s->elements < 2) return e_underflow; + + /* get the packets from the stack */ + pdp_stack_pop_int(s, &chanmask); + pdp_stack_pop_packet(s, &packet); + + /* ensure the destination packet is writable */ + pdp_packet_replace_with_writable(&packet); + + /* set channel mask */ + pdp_packet_image_set_chanmask(packet, chanmask); + + /* push result on stack */ + pdp_stack_push_packet(s, packet); + + return e_ok; + +} + +static void _add_image_primitive(char *name, int in, int out, int type_index, void *w) +{ + pdp_forthdict_add_primitive(pdp_gensym(name), w, in, out, type_index, pdp_gensym("image/*/*")); +} + + +void pdp_image_words_setup(t_pdp_class *c) +{ + /* add image specific words */ + _add_image_primitive ("add", 2, 1, 0, pdp_word_image_add); + _add_image_primitive ("mix", 3, 1, 1, pdp_word_image_mix); + _add_image_primitive ("scale", 2, 1, 1, pdp_word_image_gain); + _add_image_primitive ("mul", 2, 1, 0, pdp_word_image_mul); + _add_image_primitive ("chanmask", 2, 1, 1, pdp_word_image_chanmask); + + /* add some type oblivious words */ + pdp_forthdict_compile_word(pdp_gensym("add3"), "(add dup add)", 2, 1, -1, 0); + pdp_forthdict_compile_word(pdp_gensym("mixtest"), "(0.8 2 mov mix)", 2, 1, -1, 0); + + + /* define a processor: + + def = pdp_forth_compile_def("(inlist, outlist, setup, process)"); + */ +} |