[PD-cvs] externals/gridflow/format aalib.c, 1.1, 1.2 dc1394.c, 1.1, 1.2 jpeg.c, 1.1, 1.2 main.rb, 1.1, 1.2 mpeg3.c, 1.1, 1.2 png.c, 1.1, 1.2 quartz.m, 1.1, 1.2 quicktimeapple.c, 1.1, 1.2 quicktimehw.c, 1.1, 1.2 sdl.c, 1.1, 1.2 videodev.c, 1.1, 1.2 x11.c, 1.1, 1.2

Mathieu Bouchard matju at users.sourceforge.net
Wed Mar 15 05:37:48 CET 2006


Update of /cvsroot/pure-data/externals/gridflow/format
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18681

Modified Files:
	aalib.c dc1394.c jpeg.c main.rb mpeg3.c png.c quartz.m 
	quicktimeapple.c quicktimehw.c sdl.c videodev.c x11.c 
Log Message:
0.8.1


Index: main.rb
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/format/main.rb,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** main.rb	4 Oct 2005 02:02:15 -0000	1.1
--- main.rb	15 Mar 2006 04:37:46 -0000	1.2
***************
*** 238,242 ****
  	def _0_reset; check_file_open; @format.seek 0; end
  	def _1_grid(*a) send_out 0,:grid,*a end
! 	def _0_load name; _0_open name; _0_bang; _0_close end
  }
  
--- 238,242 ----
  	def _0_reset; check_file_open; @format.seek 0; end
  	def _1_grid(*a) send_out 0,:grid,*a end
! 	def _0_load(*a); _0_open(*a); _0_bang; _0_close end
  }
  
***************
*** 351,356 ****
  			r.close
  			STDOUT.reopen w
! 			STDIN.reopen @stream
! 			@stream = File.open filename, "r"
  			exec "gzip", "-dc"
  		end
--- 351,355 ----
  			r.close
  			STDOUT.reopen w
! 			STDIN.reopen filename, "r"
  			exec "gzip", "-dc"
  		end
***************
*** 365,370 ****
  			w.close
  			STDIN.reopen r
! 			STDOUT.reopen @stream
! 			@stream = File.open filename, "w"
  			exec "gzip", "-c"
  		end
--- 364,368 ----
  			w.close
  			STDIN.reopen r
! 			STDOUT.reopen filename, "w"
  			exec "gzip", "-c"
  		end
***************
*** 376,380 ****
  			when :out; "w"
  			else raise "bad mode" end
! 		close
  		case source
  		when :file
--- 374,378 ----
  			when :out; "w"
  			else raise "bad mode" end
! 		@stream.close if @stream
  		case source
  		when :file
***************
*** 722,725 ****
--- 720,744 ----
  	def _0_rgrid_flow(data) @stream.write @bp.pack(data) end
  	def _0_rgrid_end; @stream.flush end
+ 	self
+ }.subclass("#io:tk",1,1) {
+ 	install_rgrid 0
+ 	def initialize(mode)
+ 		if mode!=:out then raise "only #out" end
+ 		super(mode,:file,"/tmp/tk-#{$$}-#{object_id}.ppm")
+ 		GridFlow.gui "toplevel .#{object_id}\n"
+ 		GridFlow.gui "wm title . GridFlow/Tk\n"
+ 		GridFlow.gui "image create photo #{object_id} -width 320 -height 240\n"
+ 		GridFlow.gui "pack [label .#{object_id}.im -image #{object_id}]\n"
+ 	end
+ 	def _0_rgrid_end
+ 		super
+ 		@stream.seek 0,IO::SEEK_SET
+ 		GridFlow.gui "image create photo #{object_id} -file /tmp/tk-#{$$}-#{object_id}.ppm\n"
+ 	end
+ 	def delete
+ 		GridFlow.gui "destroy .#{object_id}\n"
+ 		GridFlow.gui "image delete #{object_id}\n"
+ 	end
+ 	alias close delete
  }
  

Index: x11.c
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/format/x11.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** x11.c	4 Oct 2005 02:02:15 -0000	1.1
--- x11.c	15 Mar 2006 04:37:46 -0000	1.2
***************
*** 3,7 ****
  
  	GridFlow
! 	Copyright (c) 2001,2002,2003 by Mathieu Bouchard
  
  	This program is free software; you can redistribute it and/or
--- 3,7 ----
  
  	GridFlow
! 	Copyright (c) 2001,2002,2003,2004,2005 by Mathieu Bouchard
  
  	This program is free software; you can redistribute it and/or
***************
*** 20,25 ****
  	along with this program; if not, write to the Free Software
  	Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
  
  #include "../base/grid.h.fcs"
  #include <ctype.h>
--- 20,26 ----
  	along with this program; if not, write to the Free Software
  	Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  
+ 	Note: some of the code was adapted from PDP's (the XVideo stuff).
+ */
  #include "../base/grid.h.fcs"
  #include <ctype.h>
***************
*** 29,40 ****
  #include <errno.h>
  #include <sys/time.h>
- 
  #include <X11/Xlib.h>
  #include <X11/Xutil.h>
  #include <X11/StringDefs.h>
- 
- /* X11 Error Handler type */
- typedef int (*XEH)(Display *, XErrorEvent *);
- 
  #ifdef HAVE_X11_SHARED_MEMORY
  #include <sys/ipc.h>
--- 30,36 ----
***************
*** 42,49 ****
  #include <X11/extensions/XShm.h>
  #endif
  
  \class FormatX11 < Format
  struct FormatX11 : Format {
- 	template <class T> void frame_by_type (T bogus);
  /* at the Display/Screen level */
  	Display *display; /* connection to xserver */
--- 38,54 ----
  #include <X11/extensions/XShm.h>
  #endif
+ #ifdef HAVE_X11_XVIDEO
+ #include <X11/extensions/Xv.h>
+ #include <X11/extensions/Xvlib.h>
+ #endif
+ 
+ #undef L
+ #define L gfpost("%s:%d in %s",__FILE__,__LINE__,__PRETTY_FUNCTION__);
+ 
+ /* X11 Error Handler type */
+ typedef int (*XEH)(Display *, XErrorEvent *);
  
  \class FormatX11 < Format
  struct FormatX11 : Format {
  /* at the Display/Screen level */
  	Display *display; /* connection to xserver */
***************
*** 51,84 ****
  	Window root_window;
  	Colormap colormap; /* for 256-color mode */
- 	long black,white; /* color numbers in default colormap */
  	short depth;
! 	bool use_shm;	   /* should use shared memory? */
  	bool use_stripes;  /* use alternate conversion in 256-color mode */
- 	
  /* at the Window level */
- 	int autodraw;        /* how much to send to the display at once */
  	Window window;       /* X11 window number */
  	Window parent;       /* X11 window number of the parent */
  	GC imagegc;          /* X11 graphics context (like java.awt.Graphics) */
  	XImage *ximage;      /* X11 image descriptor */
- 	char *name;          /* window name (for use by window manager) */
  	Pt<uint8> image;     /* the real data (that XImage binds to) */
  	bool is_owner;
! 	int pos_x, pos_y;
! 
  	P<BitPacking> bit_packing;
  	P<Dim> dim;
  	bool lock_size;
  	bool override_redirect;
- 
  #ifdef HAVE_X11_SHARED_MEMORY
  	XShmSegmentInfo *shm_info; /* to share memory with X11/Unix */
  #endif
! 
! 	Atom wmProtocolsAtom;
! 	Atom wmDeleteAtom;
! 
! 	FormatX11 () : use_stripes(false), 
! 	autodraw(1), window(0), ximage(0), name(0), image(Pt<uint8>()), is_owner(true),
  	dim(0), lock_size(false), override_redirect(false)
  #ifdef HAVE_X11_SHARED_MEMORY
--- 56,86 ----
  	Window root_window;
  	Colormap colormap; /* for 256-color mode */
  	short depth;
! 	int transfer;	   /* 0=plain 1=xshm 2=xvideo */
  	bool use_stripes;  /* use alternate conversion in 256-color mode */
  /* at the Window level */
  	Window window;       /* X11 window number */
  	Window parent;       /* X11 window number of the parent */
  	GC imagegc;          /* X11 graphics context (like java.awt.Graphics) */
  	XImage *ximage;      /* X11 image descriptor */
  	Pt<uint8> image;     /* the real data (that XImage binds to) */
  	bool is_owner;
! 	int32 pos[2];
  	P<BitPacking> bit_packing;
  	P<Dim> dim;
  	bool lock_size;
  	bool override_redirect;
  #ifdef HAVE_X11_SHARED_MEMORY
  	XShmSegmentInfo *shm_info; /* to share memory with X11/Unix */
  #endif
! #ifdef HAVE_X11_XVIDEO
!     int xv_format;
!     int xv_port;
!     XvImage *xvi;
!     unsigned char *data;
!     int last_encoding;
! #endif
! 	FormatX11 () : transfer(0), use_stripes(false), 
! 	window(0), ximage(0), image(Pt<uint8>()), is_owner(true),
  	dim(0), lock_size(false), override_redirect(false)
  #ifdef HAVE_X11_SHARED_MEMORY
***************
*** 86,92 ****
  #endif
  	{}
! 
  	void show_section(int x, int y, int sx, int sy);
! 	void set_wm_hints (int sx, int sy);
  	void dealloc_image ();
  	bool alloc_image (int sx, int sy);
--- 88,94 ----
  #endif
  	{}
! 	template <class T> void frame_by_type (T bogus);
  	void show_section(int x, int y, int sx, int sy);
! 	void set_wm_hints ();
  	void dealloc_image ();
  	bool alloc_image (int sx, int sy);
***************
*** 96,100 ****
  	void prepare_colormap();
  	Window FormatX11::search_window_tree (Window xid, Atom key, const char *value, int level=0);
- 
  	\decl void initialize (...);
  	\decl void frame ();
--- 98,101 ----
***************
*** 102,111 ****
  	\decl void call ();
  	\decl void _0_out_size (int sy, int sx);
- 	\decl void _0_draw ();
- 	\decl void _0_autodraw (int autodraw);
  	\decl void _0_setcursor (int shape);
  	\decl void _0_hidecursor ();
  	\decl void _0_set_geometry (int y, int x, int sy, int sx);
  	\decl void _0_fall_thru (int flag);
  	\grin 0 int
  };
--- 103,112 ----
  	\decl void call ();
  	\decl void _0_out_size (int sy, int sx);
  	\decl void _0_setcursor (int shape);
  	\decl void _0_hidecursor ();
  	\decl void _0_set_geometry (int y, int x, int sy, int sx);
  	\decl void _0_fall_thru (int flag);
+ 	\decl void _0_transfer (Symbol s);
+ 	\decl void _0_title (String s=Qnil);
  	\grin 0 int
  };
***************
*** 113,149 ****
  /* ---------------------------------------------------------------- */
  
  void FormatX11::show_section(int x, int y, int sx, int sy) {
! 	if (y>dim->get(0)||x>dim->get(1)) return;
! 	if (y+sy>dim->get(0)) sy=dim->get(0)-y;
! 	if (x+sx>dim->get(1)) sx=dim->get(1)-x;
  #ifdef HAVE_X11_SHARED_MEMORY
! 	if (use_shm) {
! 		XSync(display,False);
  		XShmPutImage(display,window,imagegc,ximage,x,y,x,y,sx,sy,False);
! 		/* should completion events be waited for? looks like a bug */
! 	} else
  #endif
! 		XPutImage(display,window,imagegc,ximage,x,y,x,y,sx,sy);
! 	XFlush(display);
  }
  
  /* window manager hints, defines the window as non-resizable */
! void FormatX11::set_wm_hints (int sx, int sy) {
  	if (!is_owner) return;
! 	XWMHints wmhints;
! 	XTextProperty window_name, icon_name;
! 	XSizeHints hints;
! 	// enable recommended, maximum and minimum size
! 	hints.flags=PSize|PMaxSize|PMinSize;
! 	// set those
! 	hints.min_width  = hints.max_width  = hints.width  = sx;
! 	hints.min_height = hints.max_height = hints.height = sy;
! 
! 	wmhints.input = True;
! 	wmhints.flags = InputHint;
! 	XStringListToTextProperty((char **)&name, 1, &window_name);
! 	XStringListToTextProperty((char **)&name, 1, &icon_name);
! 	XSetWMProperties(display, window,
! 		&window_name, &icon_name, NULL, 0, &hints, &wmhints, NULL);
  }
  
--- 114,163 ----
  /* ---------------------------------------------------------------- */
  
+ static const char *xfers[3] = {"plain","xshm","xvideo"};
+ 
  void FormatX11::show_section(int x, int y, int sx, int sy) {
! 	int zy=dim->get(0), zx=dim->get(1);
! 	if (y>zy||x>zx) return;
! 	if (y+sy>zy) sy=zy-y;
! 	if (x+sx>zx) sx=zx-x;
! 	switch (transfer) {
! 	case 0: XPutImage(display,window,imagegc,ximage,x,y,x,y,sx,sy);
! 		XFlush(display);
! 	break;
  #ifdef HAVE_X11_SHARED_MEMORY
! 	case 1:	XSync(display,False);
  		XShmPutImage(display,window,imagegc,ximage,x,y,x,y,sx,sy,False);
! 		XFlush(display);
! 		//XPutImage( display,window,imagegc,ximage,x,y,x,y,sx,sy);
! 		// should completion events be waited for? looks like a bug
! 		break;
  #endif
! #ifdef HAVE_X11_XVIDEO
! 	case 2:
! 	break;
! #endif
! 	default: RAISE("transfer mode '%s' not available", xfers[transfer]);
! 	}
  }
  
  /* window manager hints, defines the window as non-resizable */
! void FormatX11::set_wm_hints () {
! 	Ruby title = rb_ivar_get(rself,SI(@title));
  	if (!is_owner) return;
! 	XWMHints wmh;
! 	char buf[256],*bufp=buf;
! 	if (title==Qnil) {
! 		sprintf(buf,"GridFlow (%d,%d,%d)",dim->get(0),dim->get(1),dim->get(2));
! 	} else {
! 		sprintf(buf,"%.255s",rb_str_ptr(title));
! 	}
! 	XTextProperty wtitle; XStringListToTextProperty((char **)&bufp, 1, &wtitle);
! 	XSizeHints sh;
! 	sh.flags=PSize|PMaxSize|PMinSize;
! 	sh.min_width  = sh.max_width  = sh.width  = dim->get(1);
! 	sh.min_height = sh.max_height = sh.height = dim->get(0);
! 	wmh.input = True;
! 	wmh.flags = InputHint;
! 	XSetWMProperties(display,window,&wtitle,&wtitle,0,0,&sh,&wmh,0);
  }
  
***************
*** 203,218 ****
  		}break;
  		case ConfigureNotify:break; // as if we cared
- 		case ClientMessage:{
- 			// tnx to vektor&walken
- 			/*
- 			if (e.xclient.message_type==wmProtocolsAtom
- 			&& e.xclient.format==32
- 			&& (Atom)(e.xclient.data.l[0])==wmDeleteAtom) {
- 				gfpost("This window is being closed, so this handler will close too!");
- 				rb_funcall(rself,SI(close),0);
- 				return;
- 			}
- 			*/
- 		}break;
  		}
  	}
--- 217,220 ----
***************
*** 221,230 ****
  
  \def void frame () {
! 	XGetSubImage(display, window,
! 		0, 0, dim->get(1), dim->get(0),
  		(unsigned)-1, ZPixmap, ximage, 0, 0);
  	GridOutlet out(this,0,dim,NumberTypeE_find(rb_ivar_get(rself,SI(@cast))));
! 	int sy=dim->get(0), sx=dim->get(1);
! 	int bs=dim->prod(1);
  	STACK_ARRAY(uint8,b2,bs);
  	for(int y=0; y<sy; y++) {
--- 223,230 ----
  
  \def void frame () {
! 	XGetSubImage(display, window, 0, 0, dim->get(1), dim->get(0),
  		(unsigned)-1, ZPixmap, ximage, 0, 0);
  	GridOutlet out(this,0,dim,NumberTypeE_find(rb_ivar_get(rself,SI(@cast))));
! 	int sy=dim->get(0), sx=dim->get(1), bs=dim->prod(1);
  	STACK_ARRAY(uint8,b2,bs);
  	for(int y=0; y<sy; y++) {
***************
*** 239,310 ****
  static FormatX11 *current_x11;
  static int FormatX11_error_handler (Display *d, XErrorEvent *xee) {
! 	gfpost("X11 reports Error: display=0x%08x",(int)d);
! 	gfpost("serial=0x%08x error=0x%08x request=0x%08lx minor=0x%08x",
  		xee->serial, xee->error_code, xee->request_code, xee->minor_code);
! 	current_x11->use_shm = false;
! 	return 42; /* it seems that the return value is ignored. */
! }
! 
! void FormatX11::dealloc_image () {
! 	if (!ximage) return;
! 	if (use_shm) {
! 	#ifdef HAVE_X11_SHARED_MEMORY
! 		shmdt(ximage->data);
! 		XShmDetach(display,shm_info);
! 		if (shm_info) {delete shm_info; shm_info=0;}
! 		//ximage->data = new char[1]; // bogus
! 		//ximage->data = 0;
! 		//XDestroyImage(ximage);
! 		XFree(ximage);
! 		ximage = 0;
! 		image = Pt<uint8>();
! 	#endif	
! 	} else {
! 		//XDestroyImage(ximage);
! 		XFree(ximage);
! 		ximage = 0;
! 		image = Pt<uint8>();
  	}
  }
  
  bool FormatX11::alloc_image (int sx, int sy) {
! 	dim = new Dim(sy, sx, 3);
  	dealloc_image();
  	if (sx==0 || sy==0) return false;
  #ifdef HAVE_X11_SHARED_MEMORY
! 	if (use_shm) {
  		shm_info = new XShmSegmentInfo;
  		ximage = XShmCreateImage(display,visual,depth,ZPixmap,0,shm_info,sx,sy);
! 		if (!ximage) {
! 			gfpost("shm got disabled (1), retrying...");
! 			return alloc_image(sx,sy);}
! 		shm_info->shmid = shmget(IPC_PRIVATE,
! 			ximage->bytes_per_line*ximage->height, IPC_CREAT|0777);
! 		if(shm_info->shmid < 0)
! 			RAISE("ERROR: shmget failed: %s",strerror(errno));
! 		ximage->data = shm_info->shmaddr =
! 			(char *)shmat(shm_info->shmid,0,0);
! 		image = Pt<uint8>((uint8 *)ximage->data,
! 			ximage->bytes_per_line*sy);
  		shm_info->readOnly = False;
- 		current_x11 = this;
- 		//XSetErrorHandler(FormatX11_error_handler);
  		if (!XShmAttach(display, shm_info)) RAISE("ERROR: XShmAttach: big problem");
  		XSync(display,0); // make sure the server picks it up
! 		//XSetErrorHandler(0);
! 		/* yes, this can be done now. should cause auto-cleanup. */
  		shmctl(shm_info->shmid,IPC_RMID,0);
! 		if (!use_shm) {
! 			gfpost("shm got disabled (2), retrying...");
! 			return alloc_image(sx,sy);}
! 	} else
  #endif
! 	ximage = XCreateImage(display,visual,depth,ZPixmap,0,0,sx,sy,8,0);
! 	if (!ximage) RAISE("can't create image"); 
! 	image = ARRAY_NEW(uint8,ximage->bytes_per_line*sy);
! 	ximage->data = (int8 *)image;
  	int status = XInitImage(ximage);
  	if (status!=1) gfpost("XInitImage returned: %d", status);
  	return true;
  }
  
--- 239,356 ----
  static FormatX11 *current_x11;
  static int FormatX11_error_handler (Display *d, XErrorEvent *xee) {
! 	gfpost("XErrorEvent: type=0x%08x display=0x%08x xid=0x%08x",
! 		xee->type, xee->display, xee->resourceid);
! 	gfpost("... serial=0x%08x error=0x%08x request=0x%08lx minor=0x%08x",
  		xee->serial, xee->error_code, xee->request_code, xee->minor_code);
! 	if (current_x11->transfer==1) {
! 		gfpost("(note: turning shm off)");
! 		current_x11->transfer = 0;
  	}
+ 	return 42; /* it seems that the return value is ignored. */
  }
  
  bool FormatX11::alloc_image (int sx, int sy) {
! 	dim = new Dim(sy,sx,3);
  	dealloc_image();
  	if (sx==0 || sy==0) return false;
+ 	current_x11 = this;
+ 	switch (transfer) {
+ 	case 0: {
+ 		ximage = XCreateImage(display,visual,depth,ZPixmap,0,0,sx,sy,8,0);
+ 		int size = ximage->bytes_per_line*ximage->height;
+ 		if (!ximage) RAISE("can't create image"); 
+ 		image = ARRAY_NEW(uint8,size);
+ 		ximage->data = (int8 *)image;
+ 	} break;
  #ifdef HAVE_X11_SHARED_MEMORY
! 	case 1: {
  		shm_info = new XShmSegmentInfo;
  		ximage = XShmCreateImage(display,visual,depth,ZPixmap,0,shm_info,sx,sy);
!                 if (!ximage) {gfpost("shm got disabled, retrying..."); transfer=0;}
! 		XSync(display,0);
! 		if (transfer==0) return alloc_image(sx,sy);
! 		int size = ximage->bytes_per_line*ximage->height;
! 		gfpost("size = %d",size);
! 		shm_info->shmid = shmget(IPC_PRIVATE,size,IPC_CREAT|0777);
! 		if(shm_info->shmid < 0) RAISE("shmget() failed: %s",strerror(errno));
! 		ximage->data = shm_info->shmaddr = (char *)shmat(shm_info->shmid,0,0);
! 		if ((long)(shm_info->shmaddr) == -1) RAISE("shmat() failed: %s",strerror(errno));
! 		gfpost("shmaddr=%p",shm_info->shmaddr);
! 		image = Pt<uint8>((uint8 *)ximage->data,size);
  		shm_info->readOnly = False;
  		if (!XShmAttach(display, shm_info)) RAISE("ERROR: XShmAttach: big problem");
  		XSync(display,0); // make sure the server picks it up
! 		// yes, this can be done now. should cause auto-cleanup.
  		shmctl(shm_info->shmid,IPC_RMID,0);
! 		if (transfer==0) return alloc_image(sx,sy);
! 	} break;
  #endif
! #ifdef HAVE_X11_XVIDEO
! 	case 2: {
! 	unsigned int ver, rel, req, ev, err, i, j, adaptors, formats;
! 	XvAdaptorInfo *ai;
! 	if (Success != XvQueryExtension(display,&ver,&rel,&req,&ev,&err)) RAISE("XvQueryExtension problem");
! 	/* find + lock port */
! 	if (Success != XvQueryAdaptors(display,DefaultRootWindow(display),&adaptors,&ai)) RAISE("XvQueryAdaptors problem");
! 	for (i = 0; i < adaptors; i++) {
! 		if (ai[i].type&XvInputMask && ai[i].type&XvImageMask) {
! 			for (j=0; j<ai[i].num_ports; j++) {
! 				if (Success != XvGrabPort(display,ai[i].base_id+j,CurrentTime)) RAISE("XvGrabPort problem");
! 				xv_port = ai[i].base_id + j;
! 				goto breakout;
! 			}
! 		}
! 	}
! 	breakout:
! 	XFree(ai);
! 	if (!xv_port) RAISE("no xv_port");
! /*	unsigned int encn;
! 	XvEncodingInfo *enc;
! 	XvQueryEncodings(display,xv_port,&encn,&enc);
! 	for (i=0; i<encn; i++) gfpost("XvEncodingInfo: name='%s' encoding_id=0x%08x",enc[i].name,enc[i].encoding_id);*/
! 	gfpost("pdp_xvideo: grabbed port %d on adaptor %d",xv_port,i);
! 	size_t size = sx*sy*4;
! 	data = new uint8[size];
! 	for (i=0; i<size; i++) data[i]=0;
! 	xvi = XvCreateImage(display,xv_port,0x51525762,(char *)data,sx,sy);
! 	last_encoding=-1;
! 	if (!xvi) RAISE("XvCreateImage problem");
! 	} break;
! #endif
! 	default: RAISE("transfer mode '%s' not available", xfers[transfer]);
! 	}
  	int status = XInitImage(ximage);
  	if (status!=1) gfpost("XInitImage returned: %d", status);
  	return true;
+ retry:
+ 	gfpost("shm got disabled, retrying...");
+ 	return alloc_image(sx,sy);
+ }
+ 
+ void FormatX11::dealloc_image () {
+ 	if (!ximage) return;
+ 	switch (transfer) {
+ 	case 0: XFree(ximage); ximage=0; image=Pt<uint8>(); break;
+ #ifdef HAVE_X11_SHARED_MEMORY
+ 	case 1:
+ 		shmdt(ximage->data);
+ 		XShmDetach(display,shm_info);
+ 		if (shm_info) {delete shm_info; shm_info=0;}
+ 		XFree(ximage);
+ 		ximage = 0;
+ 		image = Pt<uint8>();
+ 	break;
+ #endif
+ #ifdef HAVE_X11_XVIDEO
+ 	case 2: {
+ 		if (data) delete[] data;
+ 		if (xvi) XFree(xvi);
+ 		xvi=0;
+ 		data=0;
+ 	}
+ 	break;
+ #endif
+ 	default: RAISE("transfer mode '%s' not available",xfers[transfer]);
+ 	}
  }
  
***************
*** 313,322 ****
  	if (sx<16) sx=16; if (sx>4096) RAISE("width too big");
  	alloc_image(sx,sy);
- 	if (name) delete name;
- 	name = new char[64];
- 	sprintf(name,"GridFlow (%d,%d,3)",sy,sx);
  	if (window) {
  		if (is_owner && !lock_size) {
! 			set_wm_hints(sx,sy);
  			XResizeWindow(display,window,sx,sy);
  		}
--- 359,365 ----
  	if (sx<16) sx=16; if (sx>4096) RAISE("width too big");
  	alloc_image(sx,sy);
  	if (window) {
  		if (is_owner && !lock_size) {
! 			set_wm_hints();
  			XResizeWindow(display,window,sx,sy);
  		}
***************
*** 326,346 ****
  		xswa.override_redirect = override_redirect; //#!@#$
  		window = XCreateWindow(display,
! 			parent, pos_x, pos_y, sx, sy, 0,
  			CopyFromParent, InputOutput, CopyFromParent,
  			CWOverrideRedirect|CWDontPropagate, &xswa);
  		if(!window) RAISE("can't create window");
! 		set_wm_hints(sx,sy);
! 		if (is_owner) {
! 			// fall_thru 0
! 			XSelectInput(display, window,
! 			  ExposureMask | StructureNotifyMask | PointerMotionMask |
! 			  ButtonPressMask | ButtonReleaseMask | ButtonMotionMask |
! 			  KeyPressMask | KeyReleaseMask);
! 			XMapRaised(display, window);
! 		} else {
! 			// fall_thru 1
! 			XSelectInput(display, window,
! 			  ExposureMask | StructureNotifyMask);
! 		}
  		imagegc = XCreateGC(display, window, 0, NULL);
  		if (visual->c_class == PseudoColor) prepare_colormap(); 
--- 369,379 ----
  		xswa.override_redirect = override_redirect; //#!@#$
  		window = XCreateWindow(display,
! 			parent, pos[1], pos[0], sx, sy, 0,
  			CopyFromParent, InputOutput, CopyFromParent,
  			CWOverrideRedirect|CWDontPropagate, &xswa);
  		if(!window) RAISE("can't create window");
! 		set_wm_hints();
! 		_0_fall_thru(0,0,is_owner);
! 		if (is_owner) XMapRaised(display, window);
  		imagegc = XCreateGC(display, window, 0, NULL);
  		if (visual->c_class == PseudoColor) prepare_colormap(); 
***************
*** 381,387 ****
  		}
  	}
- 	if (autodraw==2) show_section(0,oy,sx,y-oy);
  } GRID_FINISH {
! 	if (autodraw==1) show_section(0,0,in->dim->get(1),in->dim->get(0));
  } GRID_END
  
--- 414,419 ----
  		}
  	}
  } GRID_FINISH {
! 	show_section(0,0,in->dim->get(1),in->dim->get(0));
  } GRID_END
  
***************
*** 399,409 ****
  
  \def void _0_out_size (int sy, int sx) { resize_window(sx,sy); }
- \def void _0_draw () { show_section(0,0,dim->get(1),dim->get(0)); }
- 
- \def void _0_autodraw (int autodraw) {
- 	if (autodraw<0 || autodraw>2)
- 		RAISE("autodraw=%d is out of range",autodraw);
- 	this->autodraw = autodraw;
- }
  
  \def void _0_setcursor (int shape) {
--- 431,434 ----
***************
*** 449,468 ****
  
  void FormatX11::open_display(const char *disp_string) {
- 	int screen_num;
- 	Screen *screen;
- 
- 	// Open an X11 connection
  	display = XOpenDisplay(disp_string);
  	if(!display) RAISE("ERROR: opening X11 display: %s",strerror(errno));
- 
  	// btw don't expect too much from Xlib error handling.
  	// Xlib, you are so free of the ravages of intelligence...
  	XSetErrorHandler(FormatX11_error_handler);
! 
! 	screen   = DefaultScreenOfDisplay(display);
! 	screen_num = DefaultScreen(display);
  	visual   = DefaultVisual(display, screen_num);
- 	white    = XWhitePixel(display,screen_num);
- 	black    = XBlackPixel(display,screen_num);
  	root_window = DefaultRootWindow(display);
  	depth    = DefaultDepthOfScreen(screen);
--- 474,485 ----
  
  void FormatX11::open_display(const char *disp_string) {
  	display = XOpenDisplay(disp_string);
  	if(!display) RAISE("ERROR: opening X11 display: %s",strerror(errno));
  	// btw don't expect too much from Xlib error handling.
  	// Xlib, you are so free of the ravages of intelligence...
  	XSetErrorHandler(FormatX11_error_handler);
! 	Screen *screen = DefaultScreenOfDisplay(display);
! 	int screen_num = DefaultScreen(display);
  	visual   = DefaultVisual(display, screen_num);
  	root_window = DefaultRootWindow(display);
  	depth    = DefaultDepthOfScreen(screen);
***************
*** 470,488 ****
  
  	switch(visual->c_class) {
! 	case TrueColor: case DirectColor: /* without colormap */
! 	break;
! 	case PseudoColor: /* with colormap */
! 		if (depth!=8)
! 			RAISE("ERROR: with colormap, only supported depth is 8 (got %d)",
! 				depth);
! 	break;
! 	default: RAISE("ERROR: visual type not supported (got %d)",
! 		visual->c_class);
  	}
  
! #ifdef HAVE_X11_SHARED_MEMORY
! 	use_shm = !! XShmQueryExtension(display);
  #else
! 	use_shm = false;
  #endif
  }
--- 487,503 ----
  
  	switch(visual->c_class) {
! 	// without colormap
! 	case TrueColor: case DirectColor: break;
! 	// with colormap
! 	case PseudoColor: if (depth!=8) RAISE("ERROR: with colormap, only supported depth is 8 (got %d)", depth); break;
! 	default: RAISE("ERROR: visual type not supported (got %d)", visual->c_class);
  	}
  
! #if defined(HAVE_X11_XVIDEO)
! 	transfer = 2;
! #elif defined(HAVE_X11_SHARED_MEMORY)
! 	transfer = !! XShmQueryExtension(display);
  #else
! 	transfer = 0;
  #endif
  }
***************
*** 515,520 ****
  
  \def void _0_set_geometry (int y, int x, int sy, int sx) {
! 	pos_x = x;
! 	pos_y = y;
  	XMoveWindow(display,window,x,y);
  	resize_window(sx,sy);
--- 530,534 ----
  
  \def void _0_set_geometry (int y, int x, int sy, int sx) {
! 	pos[0]=y; pos[1]=x;
  	XMoveWindow(display,window,x,y);
  	resize_window(sx,sy);
***************
*** 523,546 ****
  
  \def void _0_fall_thru (int flag) {
! 	if (flag) {
! 		gfpost("falling through!");
! 		XSelectInput(display, window,
! 			ExposureMask | StructureNotifyMask);
! 	} else {
! 		gfpost("NOT falling through!");
! 		XSelectInput(display, window,
! 			ExposureMask | StructureNotifyMask |
! 			PointerMotionMask |
! 			ButtonPressMask | ButtonReleaseMask | ButtonMotionMask);
! 	}
  	XFlush(display);
  }
  
  \def void initialize (...) {
  	int sy=240, sx=320; // defaults
  	rb_call_super(argc,argv);
  	argv++, argc--;
  	VALUE domain = argc<1 ? SYM(here) : argv[0];
  	int i;
  	if (domain==SYM(here)) {
  		open_display(0);
--- 537,568 ----
  
  \def void _0_fall_thru (int flag) {
! 	int mask = ExposureMask | StructureNotifyMask;
! 	if (flag) mask |= ExposureMask|StructureNotifyMask|PointerMotionMask|
! 		ButtonPressMask|ButtonReleaseMask|ButtonMotionMask|
! 		KeyPressMask|KeyReleaseMask;
! 	XSelectInput(display, window, mask);
  	XFlush(display);
  }
  
+ \def void _0_transfer (Symbol s) {
+ 	if (s==SYM(plain))       transfer=0;
+ 	else if (s==SYM(xshm))   transfer=1;
+ 	else if (s==SYM(xvideo)) transfer=2;
+ 	else RAISE("unknown transfer mode (possible: plain xshm xvideo)");
+ }
+ 
+ \def void _0_title (String s=Qnil) {
+ 	rb_ivar_set(rself,SI(@title),s);
+ 	set_wm_hints();
+ }
+ 
  \def void initialize (...) {
  	int sy=240, sx=320; // defaults
  	rb_call_super(argc,argv);
+ 	rb_ivar_set(rself,SI(@title),Qnil);
  	argv++, argc--;
  	VALUE domain = argc<1 ? SYM(here) : argv[0];
  	int i;
+ 	char host[256];
  	if (domain==SYM(here)) {
  		open_display(0);
***************
*** 548,567 ****
  	} else if (domain==SYM(local)) {
  		if (argc<2) RAISE("open x11 local: not enough args");
! 		char host[256];
! 		int dispnum = NUM2INT(argv[1]);
! 		sprintf(host,":%d",dispnum);
  		open_display(host);
  		i=2;
  	} else if (domain==SYM(remote)) {
  		if (argc<3) RAISE("open x11 remote: not enough args");
! 		char host[256];
! 		strcpy(host,rb_sym_name(argv[1]));
! 		int dispnum = NUM2INT(argv[2]);
! 		sprintf(host+strlen(host),":%d",dispnum);
  		open_display(host);
  		i=3;
  	} else if (domain==SYM(display)) {
  		if (argc<2) RAISE("open x11 display: not enough args");
- 		char host[256];
  		strcpy(host,rb_sym_name(argv[1]));
  		for (int k=0; host[k]; k++) if (host[k]=='%') host[k]==':';
--- 570,583 ----
  	} else if (domain==SYM(local)) {
  		if (argc<2) RAISE("open x11 local: not enough args");
! 		sprintf(host,":%ld",NUM2LONG(argv[1]));
  		open_display(host);
  		i=2;
  	} else if (domain==SYM(remote)) {
  		if (argc<3) RAISE("open x11 remote: not enough args");
! 		sprintf(host,"%s:%ld",rb_sym_name(argv[1]),NUM2LONG(argv[2]));
  		open_display(host);
  		i=3;
  	} else if (domain==SYM(display)) {
  		if (argc<2) RAISE("open x11 display: not enough args");
  		strcpy(host,rb_sym_name(argv[1]));
  		for (int k=0; host[k]; k++) if (host[k]=='%') host[k]==':';
***************
*** 575,588 ****
  	for(;i<argc;i++) {
  		Ruby a=argv[i];
! 		if (a==SYM(override_redirect)) {
! 			override_redirect = true;
! 		} else if (a==SYM(use_stripes)){
! 			use_stripes = true;
! 		} else {
! 			break;
! 		}
  	}
  
! 	pos_x=pos_y=0;
  	parent = root_window;
  	if (i>=argc) {
--- 591,600 ----
  	for(;i<argc;i++) {
  		Ruby a=argv[i];
! 		if (a==SYM(override_redirect)) override_redirect = true;
! 		else if (a==SYM(use_stripes))  use_stripes = true;
! 		else RAISE("argument '%s' not recognized",rb_sym_name(argv[i]));
  	}
  
! 	pos[1]=pos[0]=0;
  	parent = root_window;
  	if (i>=argc) {
***************
*** 595,599 ****
  			Ruby title_s = rb_funcall(argv[i+1],SI(to_s),0);
  			char *title = strdup(rb_str_ptr(title_s));
! 			sy = sx = pos_y = pos_x = 0;
  			parent = search_window_tree(root_window,XInternAtom(display,"WM_NAME",0),title);
  			free(title);
--- 607,611 ----
  			Ruby title_s = rb_funcall(argv[i+1],SI(to_s),0);
  			char *title = strdup(rb_str_ptr(title_s));
! 			sy = sx = pos[0] = pos[1] = 0;
  			parent = search_window_tree(root_window,XInternAtom(display,"WM_NAME",0),title);
  			free(title);
***************
*** 618,622 ****
  			}
  			is_owner = false;
! 			sy = sx = pos_y = pos_x = 0;
  		}
  	}
--- 630,634 ----
  			}
  			is_owner = false;
! 			sy = sx = pos[0] = pos[1] = 0;
  		}
  	}
***************
*** 626,631 ****
  
  	if (is_owner) {
! 		wmProtocolsAtom = XInternAtom(display, "WM_PROTOCOLS", False);
! 		wmDeleteAtom    = XInternAtom(display, "WM_DELETE_WINDOW", False);
  		XSetWMProtocols(display,window,&wmDeleteAtom,1);
  	}
--- 638,642 ----
  
  	if (is_owner) {
! 		Atom wmDeleteAtom = XInternAtom(display, "WM_DELETE_WINDOW", False);
  		XSetWMProtocols(display,window,&wmDeleteAtom,1);
  	}
***************
*** 643,652 ****
  		bit_packing = new BitPacking(disp_is_le, bpp/8, 3, masks);
  	} break;
  	}
  	IEVAL(rself,"@clock = Clock.new self; @clock.delay 0");
  }
  
  \classinfo {
! 	IEVAL(rself,"install '#io:x11',1,1;@mode=6;@comment='X Window System Version 11.5'");
  }
  \end class FormatX11
--- 654,665 ----
  		bit_packing = new BitPacking(disp_is_le, bpp/8, 3, masks);
  	} break;
+ 	default: { RAISE("huh?"); }
  	}
  	IEVAL(rself,"@clock = Clock.new self; @clock.delay 0");
+ 	show_section(0,0,sx,sy);
  }
  
  \classinfo {
! 	IEVAL(rself,"install '#io:x11',1,1;@mode=6;@comment='X Window System Version 11.x'");
  }
  \end class FormatX11
***************
*** 654,655 ****
--- 667,669 ----
  	\startall
  }
+ 




Index: mpeg3.c
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/format/mpeg3.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** mpeg3.c	4 Oct 2005 02:02:15 -0000	1.1
--- mpeg3.c	15 Mar 2006 04:37:46 -0000	1.2
***************
*** 89,93 ****
  
  \classinfo {
! 	IEVAL(rself,"install '#in:mpeg',1,1;@flags=4;"
  	"@comment='Motion Picture Expert Group Format"
  	" (using HeroineWarrior\\'s)';suffixes_are'mpg,mpeg'");
--- 89,93 ----
  
  \classinfo {
! 	IEVAL(rself,"install '#io:mpeg',1,1;@flags=4;"
  	"@comment='Motion Picture Expert Group Format"
  	" (using HeroineWarrior\\'s)';suffixes_are'mpg,mpeg'");


Index: jpeg.c
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/format/jpeg.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** jpeg.c	4 Oct 2005 02:02:15 -0000	1.1
--- jpeg.c	15 Mar 2006 04:37:46 -0000	1.2
***************
*** 43,46 ****
--- 43,47 ----
  	FILE *f;
  	\decl Ruby frame ();
+ 	\decl void quality (short quality);
  	\decl void initialize (Symbol mode, Symbol source, String filename);
  	\grin 0 int
***************
*** 109,112 ****
--- 110,120 ----
  }
  
+ \def void quality (short quality) {
+ 	quality = min(max((int)quality,0),100);
+ 	// should the last arg ("baseline") be set to true ?
+ 	// and what is it for? is it for accuracy of the DC component?
+ 	jpeg_set_quality(&cjpeg,quality,false);
+ }
+ 
  \def void initialize (Symbol mode, Symbol source, String filename) {
  	rb_call_super(argc,argv);
***************
*** 122,126 ****
  \classinfo {
  	IEVAL(rself,
! 	"install '#in:jpeg',1,1;@mode=6;"
  	"include GridFlow::EventIO; suffixes_are'jpeg','jpg'");
  }
--- 130,134 ----
  \classinfo {
  	IEVAL(rself,
! 	"install '#io:jpeg',1,1;@mode=6;"
  	"include GridFlow::EventIO; suffixes_are'jpeg','jpg'");
  }




Index: quicktimehw.c
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/format/quicktimehw.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** quicktimehw.c	4 Oct 2005 02:02:15 -0000	1.1
--- quicktimehw.c	15 Mar 2006 04:37:46 -0000	1.2
***************
*** 3,7 ****
  
  	GridFlow
! 	Copyright (c) 2001,2002,2003 by Mathieu Bouchard
  
  	This program is free software; you can redistribute it and/or
--- 3,7 ----
  
  	GridFlow
! 	Copyright (c) 2001,2002,2003,2004,2005,2006 by Mathieu Bouchard
  
  	This program is free software; you can redistribute it and/or
***************
*** 22,37 ****
  */
  
  #include "../base/grid.h.fcs"
  #include <stdlib.h>
  #include <string.h>
  #include <errno.h>
- #include <quicktime/quicktime.h>
- #include <quicktime/colormodels.h>
- 
- #include <quicktime/lqt_version.h>
- #ifdef LQT_VERSION
- #include <quicktime/lqt.h>
- #include <quicktime/lqt_codecinfo.h>
- #endif
  
  \class FormatQuickTimeHW < Format
--- 22,30 ----
  */
  
+ #define QUICKTIMEHW_INCLUDE_HERE
  #include "../base/grid.h.fcs"
  #include <stdlib.h>
  #include <string.h>
  #include <errno.h>
  
  \class FormatQuickTimeHW < Format
***************
*** 219,222 ****
--- 212,217 ----
  );
  
+ //#define L fprintf(stderr,"%s:%d in %s\n",__FILE__,__LINE__,__PRETTY_FUNCTION__);
+ 
  #ifdef LQT_VERSION
  	lqt_registry_init();
***************
*** 226,229 ****
--- 221,228 ----
  	for (int i=0; i<n; i++) {
  		const lqt_codec_info_t *s = lqt_get_video_codec_info(i);
+ 		if (!s->name) {
+ 			fprintf(stderr,"[#in quicktime]: skipping codec with null name!\n");
+ 			continue;
+ 		}
  		Ruby name = rb_str_new2(s->name);
  		Ruby f = rb_ary_new2(s->num_fourccs);





More information about the Pd-cvs mailing list