From 6f38a27d1c1410036a90d802327c15a7aeec00f6 Mon Sep 17 00:00:00 2001 From: "N.N." Date: Thu, 19 Mar 2009 21:39:18 +0000 Subject: cols and rows messages added svn path=/trunk/externals/pdvjtools/; revision=10880 --- videogrid/videogrid.cc | 217 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 147 insertions(+), 70 deletions(-) diff --git a/videogrid/videogrid.cc b/videogrid/videogrid.cc index ea2bf9a..a6555c1 100644 --- a/videogrid/videogrid.cc +++ b/videogrid/videogrid.cc @@ -1,6 +1,6 @@ extern "C" -{ +{ /* videogrid external for Puredata Lluis Gomez i Bigorda :: lluis-at-hangar.org @@ -27,21 +27,21 @@ along with this program. If not, see . #include #include -/* - * incloure les definicions de variables i prototipus de dades i de funcions de puredata +/* + * incloure les definicions de variables i prototipus de dades i de funcions de puredata */ #include "m_pd.h" -/* - * incloure estructures de dades i capceleres de funcions gàfiques bàsiques de pd +/* + * incloure estructures de dades i capceleres de funcions gàfiques bàsiques de pd */ #include "g_canvas.h" -/* - * incloure estructures de dades i capceleres de funcions per traballar amb threads +/* + * incloure estructures de dades i capceleres de funcions per traballar amb threads */ #include "pthread.h" /* some linux distros need this to compile ffmpeg correctly as cpp */ -#define __STDC_CONSTANT_MACROS 1 +#define __STDC_CONSTANT_MACROS 1 /* ffmpeg includes */ #include @@ -141,7 +141,7 @@ int convertir_img_ff(pathimage pathFitxer, tipus_format f, int W, int H, int pos int i, videoStream; AVCodecContext *pCodecCtx; AVCodec *pCodec; - AVFrame *pFrame; + AVFrame *pFrame; AVFrame *pFrameRGB; AVPacket packet; int frameFinished; @@ -190,7 +190,7 @@ int convertir_img_ff(pathimage pathFitxer, tipus_format f, int W, int H, int pos if(avcodec_open(pCodecCtx, pCodec)<0) return -1; // Could not open codec - // Hack to correct wrong frame rates that seem to be generated by some + // Hack to correct wrong frame rates that seem to be generated by some // codecs // if(pCodecCtx->frame_rate>1000 && pCodecCtx->frame_rate_base==1) // pCodecCtx->frame_rate_base=1000; @@ -219,15 +219,15 @@ int convertir_img_ff(pathimage pathFitxer, tipus_format f, int W, int H, int pos if(packet.stream_index==videoStream) { // Decode video frame - avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, + avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, packet.data, packet.size); // Did we get a video frame? if(frameFinished) { // Convert the image from its native format to RGB - //img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24, - // (AVPicture*)pFrame, pCodecCtx->pix_fmt, pCodecCtx->width, + //img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24, + // (AVPicture*)pFrame, pCodecCtx->pix_fmt, pCodecCtx->width, // pCodecCtx->height); img_convert_ctx = sws_getContext( pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, @@ -253,15 +253,15 @@ int convertir_img_ff(pathimage pathFitxer, tipus_format f, int W, int H, int pos if(packet.stream_index==videoStream) { // Decode video frame - avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, + avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, packet.data, packet.size); // Did we get a video frame? if(frameFinished) { // Convert the image from its native format to RGB - //img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24, - // (AVPicture*)pFrame, pCodecCtx->pix_fmt, pCodecCtx->width, + //img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24, + // (AVPicture*)pFrame, pCodecCtx->pix_fmt, pCodecCtx->width, // pCodecCtx->height); img_convert_ctx = sws_getContext( pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, @@ -312,7 +312,7 @@ int convertir_img(pathimage pathFitxer, tipus_format f, int W, int H, int posi){ unsigned char *qt_frame = NULL; /* quicktime decoder */ quicktime_t *qt; - /* quicktime color model */ + /* quicktime color model */ int qt_cmodel; int nN = posi; @@ -329,39 +329,39 @@ int convertir_img(pathimage pathFitxer, tipus_format f, int W, int H, int posi){ /* post("videogrid: no video stream"); */ quicktime_close(qt); return -1; - + } else if (!quicktime_supported_video(qt,0)) { /* post("videogrid: unsupported video codec\n"); */ quicktime_close(qt); return -1; } - else + else { qt_cmodel = BC_YUV420P; x_vwidth = quicktime_video_width(qt,0); x_vheight = quicktime_video_height(qt,0); - + free(qt_frame); qt_frame = (unsigned char*)malloc(x_vwidth*x_vheight*4); - + int size = x_vwidth * x_vheight; qt_rows[0] = &qt_frame[0]; qt_rows[2] = &qt_frame[size]; qt_rows[1] = &qt_frame[size + (size>>2)]; - + quicktime_set_cmodel(qt, qt_cmodel); } /* int length = quicktime_video_length(qt,0); */ /* int Vpos = quicktime_video_position(qt,0); */ lqt_decode_video(qt, qt_rows, 0); - + switch(qt_cmodel){ case BC_YUV420P: /* printf(" "); */ /* post("videogrid: qt colormodel : BC_YUV420P"); */ - + /* per a fer la miniatura cada k colomnes pillem una cada l files pillem una */ @@ -482,7 +482,7 @@ int desencuar (Cua *cua) /* printf("Cua buida\a\n"); */ return 0; } - + } /* funció que retorna si la cua és buida */ @@ -494,7 +494,7 @@ int cuaBuida(Cua *cua) /* elimina el contingut de la cua */ void eliminarCua(Cua *cua) { - while (!cuaBuida(cua)) desencuar(cua); + while (!cuaBuida(cua)) desencuar(cua); /* printf("Cua eliminada\n"); */ } @@ -525,7 +525,7 @@ void escriuCua(Cua *cua) actual = actual->seguent; }while(actual); post("]\n"); - + } else post("EMPTY: NO THUMBS INSIDE\n"); @@ -540,7 +540,7 @@ static int videogridcount = 0; /* definició de la classe i la seva estructura de dades */ typedef struct _videogrid { - t_object x_obj; + t_object x_obj; /* declaració de la sortida de l'objecte */ t_outlet *x_sortida; /* llista d'objectes gràfics */ @@ -721,6 +721,7 @@ void load_tk_procs () { sys_gui("focus $id.1rangef.name\n"); sys_gui("}\n"); + /* sys_gui("proc table {w content args} {\n"); sys_gui("frame $w -bg black\n"); sys_gui("set r 0\n"); @@ -746,6 +747,7 @@ void load_tk_procs () { sys_gui("}\n"); sys_gui("pack .tauler\n"); sys_gui("}\n"); + */ } /* calcula la posició x del tauler a partir de la posició de l'element de la cua (d'esquerra a dreta) */ @@ -785,7 +787,7 @@ void eliminar_imatges_temporals(int maxim){ int format_adequat_v(path nomF, t_symbol *format_list){ int retorn = 0; - + path ig_path = ""; strcat(ig_path,nomF); path fl; @@ -855,14 +857,14 @@ void videogrid_afegir_imatge(t_videogrid *x, path entrada) fferror=convertir_img_ff(entrada,FORMAT_MINIATURA, x->x_w_cell, x->x_h_cell, nN); } /* post ("%d",fferror); */ - if (fferror>=0) { + if (fferror>=0) { /* encua el nou node */ encuar(&x->x_cua, entrada); /* si no és el primer element a encuar incrementem la posicio de la última imatge insertada */ if(numNodes(&x->x_cua) != 0) x->x_ultima_img ++; - /* - * si assoleix el maxim torna a començar, - * inicialitzant la posició en el tauler de la última imatge insertada + /* + * si assoleix el maxim torna a començar, + * inicialitzant la posició en el tauler de la última imatge insertada */ if(x->x_ultima_img == maxim) x->x_ultima_img = 0; @@ -870,11 +872,11 @@ void videogrid_afegir_imatge(t_videogrid *x, path entrada) strcat(ig_path,nNstr); strcat(ig_path,"."); strcat(ig_path,FORMAT_MINIATURA); - + sys_vgui("image create photo img%x%d -file %s\n",x,nN,ig_path); - sys_vgui(".x%x.c create image %d %d -image img%x%d -tags %xS%d\n", + sys_vgui(".x%x.c create image %d %d -image img%x%d -tags %xS%d\n", glist_getcanvas(x->x_glist), - text_xpix(&x->x_obj, x->x_glist) + getX(x,nN) + (x->x_w_cell/2), + text_xpix(&x->x_obj, x->x_glist) + getX(x,nN) + (x->x_w_cell/2), text_ypix(&x->x_obj, x->x_glist) + getY(x,nN) + (x->x_h_cell/2), x,nN,x,nN); if(nN == 0){ @@ -915,14 +917,14 @@ void videogrid_drawme(t_videogrid *x, t_glist *glist, int firsttime) // videogrid_afegir_imatge(x,actual->pathFitxer); convertir_img_ff(actual->pathFitxer,FORMAT_MINIATURA, x->x_w_cell, x->x_h_cell, nN); sys_vgui("image create photo img%x%d -file %s\n",x,nN,ig_path); - sys_vgui(".x%x.c create image %d %d -image img%x%d -tags %xS%d\n", + sys_vgui(".x%x.c create image %d %d -image img%x%d -tags %xS%d\n", glist_getcanvas(x->x_glist),text_xpix(&x->x_obj, x->x_glist) + getX(x,nN) + (x->x_w_cell/2), text_ypix(&x->x_obj, x->x_glist) + getY(x,nN) + (x->x_h_cell/2),x,nN,x,nN); actual = actual->seguent; nN++; }while(actual); } } - else { + else { sys_vgui(".x%x.c coords %xGRID %d %d %d %d\n", glist_getcanvas(glist), x, text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist),text_xpix(&x->x_obj, glist) + (x->x_num_col*x->x_w_cell) + 1 + (x->x_num_col * GRUIX) + GRUIX, text_ypix(&x->x_obj, glist) + (x->x_num_fil*x->x_h_cell) + 1 + (x->x_num_fil * GRUIX) + GRUIX); if(!cuaBuida(&x->x_cua)) { @@ -934,13 +936,13 @@ void videogrid_drawme(t_videogrid *x, t_glist *glist, int firsttime) text_xpix(&x->x_obj, x->x_glist) + getX(x,contador) + (x->x_w_cell/2), text_ypix(&x->x_obj, x->x_glist) + getY(x,contador) + (x->x_h_cell/2)); contador++; } - + /* char buf[800]; sprintf(buf, "pdtk_videogrid_table %%s %s %d %d\n", x->x_name->s_name, x->x_num_fil, x->x_num_col); gfxstub_new(&x->x_obj.ob_pd, x, buf); */ } if (x->x_pos_selected > -1){ - sys_vgui(".x%x.c coords %xGRASP %d %d %d %d\n", glist_getcanvas(glist), x, + sys_vgui(".x%x.c coords %xGRASP %d %d %d %d\n", glist_getcanvas(glist), x, text_xpix(&x->x_obj, x->x_glist) + getX(x,x->x_pos_selected), text_ypix(&x->x_obj, x->x_glist) + getY(x,x->x_pos_selected), text_xpix(&x->x_obj, x->x_glist) + getX(x,x->x_pos_selected) + x->x_w_cell, text_ypix(&x->x_obj, x->x_glist) + getY(x,x->x_pos_selected) + x->x_h_cell); } @@ -999,7 +1001,7 @@ void videogrid_erase(t_videogrid* x,t_glist* glist, int toclear) sys_vgui(".x%x.c delete %xLINIA\n", glist_getcanvas(x->x_glist), x); } /* v 0.2 -- elimina el marc de la casella seleccionada */ - if(x->x_pos_selected > -1){ + if(x->x_pos_selected > -1){ sys_vgui(".x%x.c delete %xGRASP\n", glist_getcanvas(glist), x); x->x_pos_selected = -1; } @@ -1031,7 +1033,7 @@ void videogrid_putvideo(t_videogrid *x, t_symbol *entrada) /* mètode de la classe que es dispara al rebre una entrada de missatge amb [putvideodir +string( com a paràmetre */ void *videogrid_putvideodir_thread(void *z) -{ +{ t_videogrid *x = (t_videogrid *)z; DIR *dirp; struct dirent * direntp; @@ -1045,9 +1047,9 @@ void *videogrid_putvideodir_thread(void *z) maxim = x->x_num_fil * x->x_num_col; strcpy(directoriAnterior, x->x_dir_actual); strcpy(x->x_dir_actual, x->x_dir_canvi); - /* - * si es el mateix directori entrat l'ultim busca la ultima imatge afegida - * per a seguir a encuant a partir d'ella en endavant + /* + * si es el mateix directori entrat l'ultim busca la ultima imatge afegida + * per a seguir a encuant a partir d'ella en endavant */ if(strcmp(directoriAnterior, x->x_dir_actual) == 0){ /* post("Videogrid: Repeteix directori %s\n", x->x_dir_actual); */ @@ -1086,7 +1088,7 @@ void *videogrid_putvideodir_thread(void *z) /* incrementa la posició en el directori */ numPosDir++; /* si el nombre de nodes encuats per aquest directori no supera el màxim enca el nou node */ - if(numEncuats < maxim){ + if(numEncuats < maxim){ /* post("s'encua la imatge %s\n", direntp->d_name); */ /* concatena el path i el nom de la imatge */ strcpy(nomImatge,direntp->d_name); @@ -1121,9 +1123,9 @@ void videogrid_putvideodir(t_videogrid *x, t_symbol *entrada) pthread_t unthread; pthread_attr_t unatribut; pthread_attr_init( &unatribut ); - + strcpy(x->x_dir_canvi,entrada->s_name); - + // ---------------- THREAD CREAT ------------------------- pthread_mutex_init(&x->x_lock, NULL); // int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg); @@ -1191,19 +1193,90 @@ void videogrid_seek(t_videogrid *x, t_floatarg postauler) } } +/* v 0.2.3 -- mètode de la classe que modifica el nombre de files del tauler [rows N( */ +void videogrid_rows(t_videogrid *x, t_floatarg nfil) +{ + /* post("rows a %d\n",postauler); */ + int maxim, maxdigit, ncol; + /* el màxim es fixa pel nombre de digits utilitzats pel nom de la imatge temporal */ + maxdigit = pow(10,BYTES_NUM_TEMP); + ncol = x->x_num_col; + if((nfil*ncol) <= maxdigit){ + if((nfil*ncol) > 0){ + x->x_num_fil = nfil; + /* x->x_num_col = ncol; */ + }else{ + post("Videogrid: The number of rows and columns is less than the minimum allowed: 1 cell.\n"); + } + }else{ + post("Videogrid: The number of rows and columns exceeds the maximum allowed: a total of %d cells.\n",maxdigit); + } + /* post("Videogrid: Modified values\n name = %s\n rows = %d \t cols = %d.\n", x->x_name->s_name, x->x_num_fil, x->x_num_col); */ + /* elimina els nodes no representables amb la nova configuració */ + maxim = x->x_num_fil * x->x_num_col; + int extret; + videogrid_erase(x, x->x_glist,0); + /* si hi ha més nodes a la cua que el maxim */ + while((numNodes(&x->x_cua)) > maxim){ + /* desencuem */ + extret = desencuar(&x->x_cua); + } + /* al reestablir el tamany del tauler cal saber la posició de l'últim element */ + x->x_ultima_img = numNodes(&x->x_cua) - 1; + if (x->x_ultima_img < 0) x->x_ultima_img = 0; + x->x_tauler_primer = x->x_cua.davanter; + videogrid_drawme(x, x->x_glist, 1); +} + +/* v 0.2.3 -- mètode de la classe que modifica el nombre de columnes del tauler [cols N( */ +void videogrid_cols(t_videogrid *x, t_floatarg ncol) +{ + /* post("rows a %d\n",postauler); */ + /* post("rows a %d\n",postauler); */ + int maxim, maxdigit, nfil; + /* el màxim es fixa pel nombre de digits utilitzats pel nom de la imatge temporal */ + maxdigit = pow(10,BYTES_NUM_TEMP); + nfil = x->x_num_fil; + if((nfil*ncol) <= maxdigit){ + if((nfil*ncol) > 0){ + /* x->x_num_fil = nfil; */ + x->x_num_col = ncol; + }else{ + post("Videogrid: The number of rows and columns is less than the minimum allowed: 1 cell.\n"); + } + }else{ + post("Videogrid: The number of rows and columns exceeds the maximum allowed: a total of %d cells.\n",maxdigit); + } + /* post("Videogrid: Modified values\n name = %s\n rows = %d \t cols = %d.\n", x->x_name->s_name, x->x_num_fil, x->x_num_col); */ + /* elimina els nodes no representables amb la nova configuració */ + maxim = x->x_num_fil * x->x_num_col; + int extret; + videogrid_erase(x, x->x_glist,0); + /* si hi ha més nodes a la cua que el maxim */ + while((numNodes(&x->x_cua)) > maxim){ + /* desencuem */ + extret = desencuar(&x->x_cua); + } + /* al reestablir el tamany del tauler cal saber la posició de l'últim element */ + x->x_ultima_img = numNodes(&x->x_cua) - 1; + if (x->x_ultima_img < 0) x->x_ultima_img = 0; + x->x_tauler_primer = x->x_cua.davanter; + videogrid_drawme(x, x->x_glist, 1); +} + static int videogrid_click(t_gobj *z, struct _glist *glist, int xpix, int ypix, int shift, int alt, int dbl, int doit) { t_videogrid* x = (t_videogrid *)z; int x_pos = xpix - text_xpix(&x->x_obj, x->x_glist); int y_pos = ypix - text_ypix(&x->x_obj, x->x_glist); int xa, ya, postauler; - if (doit) + if (doit) { - /* obtenir la posicio en el tauler */ + /* obtenir la posicio en el tauler */ // -- v 0.2 -- midoficacio pel gruix del marc // xa = ((x_pos) / (x->x_w_cell + GRUIX + 1)); ya = ((y_pos) / (x->x_h_cell + GRUIX + 1)) * x->x_num_col; - postauler = ya + xa; + postauler = ya + xa; // -- v 0.2 -- seleciona la casella disparant el path // videogrid_seek(x, postauler); } @@ -1300,8 +1373,8 @@ static void videogrid_save(t_gobj *z, t_binbuf *b) Node *actual; int maxim = x->x_num_fil * x->x_num_col; int contador = x->x_ultima_img + 1; - - if (contador > maxim) { + + if (contador > maxim) { contador = 0; } /* printf("\n contador %d i maxim %d i laultimaPOS %d \n", contador, maxim, x->x_ultima_img); */ @@ -1312,7 +1385,7 @@ static void videogrid_save(t_gobj *z, t_binbuf *b) */ /* prenem el davanter de la cua */ actual=x->x_cua.davanter; - + while(contador < numNodes(&x->x_cua)){ /* afegim els paths del davanter fins a l'ultim node al tauler */ strcat(cadenaPaths, actual->pathFitxer); @@ -1376,7 +1449,7 @@ static void videogrid_dialog(t_videogrid *x, t_symbol *s, int argc, t_atom *argv switch (argc) { case 3: /* versio inicial */ - if (argv[0].a_type != A_SYMBOL || argv[1].a_type != A_FLOAT || argv[2].a_type != A_FLOAT) + if (argv[0].a_type != A_SYMBOL || argv[1].a_type != A_FLOAT || argv[2].a_type != A_FLOAT) { post("Videogrid: error_ Some of the values are inconsistent in its data type.\n"); return; @@ -1387,7 +1460,7 @@ static void videogrid_dialog(t_videogrid *x, t_symbol *s, int argc, t_atom *argv break; case 5: /* versio 0.1 */ - if (argv[0].a_type != A_SYMBOL || argv[1].a_type != A_FLOAT || argv[2].a_type != A_FLOAT || argv[3].a_type != A_SYMBOL || argv[4].a_type != A_SYMBOL) + if (argv[0].a_type != A_SYMBOL || argv[1].a_type != A_FLOAT || argv[2].a_type != A_FLOAT || argv[3].a_type != A_SYMBOL || argv[4].a_type != A_SYMBOL) { post("Videogrid: error_ Some of the values are inconsistent in its data type.\n"); return; @@ -1420,7 +1493,7 @@ static void videogrid_dialog(t_videogrid *x, t_symbol *s, int argc, t_atom *argv x->x_h_cell = 40; case 7: /* versio 0.2.1 */ - if (argv[0].a_type != A_SYMBOL || argv[1].a_type != A_FLOAT || argv[2].a_type != A_FLOAT || argv[3].a_type != A_SYMBOL || argv[4].a_type != A_SYMBOL || argv[5].a_type != A_SYMBOL || argv[6].a_type != A_SYMBOL) + if (argv[0].a_type != A_SYMBOL || argv[1].a_type != A_FLOAT || argv[2].a_type != A_FLOAT || argv[3].a_type != A_SYMBOL || argv[4].a_type != A_SYMBOL || argv[5].a_type != A_SYMBOL || argv[6].a_type != A_SYMBOL) { post("Videogrid: error_ Some of the values are inconsistent in its data type.\n"); return; @@ -1434,7 +1507,7 @@ static void videogrid_dialog(t_videogrid *x, t_symbol *s, int argc, t_atom *argv x->x_format_list = argv[6].a_w.w_symbol; x->x_w_cell = 60; x->x_h_cell = 40; - break; + break; case 9: /* versio 0.2.2 */ @@ -1567,7 +1640,7 @@ static void *videogrid_new(t_symbol* name, int argc, t_atom *argv) x->x_w_cell = 60; x->x_h_cell = 40; break; - + case 7: /* versio 0.2.1 */ x->x_num_fil = (int)atom_getintarg(1, argc, argv); @@ -1621,7 +1694,7 @@ static void *videogrid_new(t_symbol* name, int argc, t_atom *argv) // -- ATENCIO! NO AFEGEIX ELS PATHS !!! // // -- imagegrid_afegir_imatge(x,tt->s_name); // } - + token = strtok(cadenaPaths,"|"); while(token){ tt = gensym(token); @@ -1632,7 +1705,7 @@ static void *videogrid_new(t_symbol* name, int argc, t_atom *argv) free(cadenaPaths); */ break; - + default: /* crea un objecte nou per defecte */ /* post("NEW imagegrid created.\n"); */ @@ -1649,9 +1722,9 @@ static void *videogrid_new(t_symbol* name, int argc, t_atom *argv) x->x_h_cell = 40; break; } -/* +/* * printf("S'ha instanciat un videogrid anomenat %s amb les caracteristiques seguents:",x->x_name->s_name); - * printf("Nombre de files %d - Nombre de columnes: %d", x->x_num_fil, x->x_num_col); + * printf("Nombre de files %d - Nombre de columnes: %d", x->x_num_fil, x->x_num_col); */ return (x); @@ -1664,14 +1737,14 @@ static void videogrid_destroy(t_videogrid *x){ } /* generacio d'una nova classe */ -/* al carregar la nova llibreria my_lib pd intenta cridar la funció my_lib_setup */ +/* al carregar la nova llibreria my_lib pd intenta cridar la funció my_lib_setup */ /* aquesta crea la nova classe i les seves propietats només un sol cop */ void videogrid_setup(void) { load_tk_procs(); post("videogrid: version 0.2.1"); - post("written by Sergi Lario (slario@gmail.com) & Lluis Gomez i Bigorda (lluis@artefacte.org)"); + post("written by Sergi Lario (slario@gmail.com) & Lluis Gomez i Bigorda (lluis@artefacte.org)"); videogrid_class = class_new(gensym("videogrid"), (t_newmethod)videogrid_new, @@ -1681,7 +1754,7 @@ void videogrid_setup(void) A_GIMME, 0); -/* +/* * class_new crea la nova classe retornant un punter al seu prototipus, * el primer argument es el nom simbolic de la classe, * el segon i tercer corresponen al constructor i destructor de la classe respectivament, @@ -1689,7 +1762,7 @@ void videogrid_setup(void) * el destructor allibera la memoria reservada al destruir l'objecte per qualsevol causa) * el quart correspon a la mida de l'estructura de dades, per tal de poder reservar la memoria necessària, * el cinquè influeix en el mòde de representació gràfica del objectes. Per defecte CLASS_DEFAULT o '0', - * la resta d'arguments defineixen els arguments de l'objecte i el seu tipus, la llista acaba amb 0 + * la resta d'arguments defineixen els arguments de l'objecte i el seu tipus, la llista acaba amb 0 */ class_addbang(videogrid_class, videogrid_bang); @@ -1697,17 +1770,21 @@ void videogrid_setup(void) class_addmethod(videogrid_class, (t_method)videogrid_putvideo,gensym("putvideo"), A_DEFSYMBOL, 0); class_addmethod(videogrid_class, (t_method)videogrid_putvideodir,gensym("putvideodir"), A_DEFSYMBOL, 0); - + class_addmethod(videogrid_class, (t_method)videogrid_dialog, gensym("dialog"), A_GIMME, 0); class_addmethod(videogrid_class, (t_method)videogrid_click, gensym("click"), A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0); class_addmethod(videogrid_class, (t_method)videogrid_clear, gensym("clear"), A_GIMME, 0); - + class_addmethod(videogrid_class, (t_method)videogrid_seek, gensym("seek"), A_FLOAT, 0); + class_addmethod(videogrid_class, (t_method)videogrid_rows, gensym("rows"), A_FLOAT, 0); + + class_addmethod(videogrid_class, (t_method)videogrid_cols, gensym("cols"), A_FLOAT, 0); + /* inicia el comportament de videogrid */ - + videogrid_setwidget(); #if PD_MINOR_VERSION >= 37 -- cgit v1.2.1