[PD-cvs] externals/gridflow/extra jmax_format.rb, NONE, 1.1 puredata_format.rb, NONE, 1.1 server_1_grid.rb, NONE, 1.1 server_1_ppm.rb, NONE, 1.1 server_2.rb, NONE, 1.1 smpte.rb, NONE, 1.1
Mathieu Bouchard
matju at users.sourceforge.net
Tue Oct 4 04:02:17 CEST 2005
- Previous message: [PD-cvs] externals/gridflow/format aalib.c, NONE, 1.1 dc1394.c, NONE, 1.1 jpeg.c, NONE, 1.1 main.rb, NONE, 1.1 mpeg3.c, NONE, 1.1 png.c, NONE, 1.1 quicktimeapple.c, NONE, 1.1 quicktimehw.c, NONE, 1.1 sdl.c, NONE, 1.1 videodev.c, NONE, 1.1 x11.c, NONE, 1.1
- Next message: [PD-cvs] externals/gridflow/pd_abstractions #apply_colormap_channelwise.pd, NONE, 1.1 #camera.pd, NONE, 1.1 #camera_control.pd, NONE, 1.1 #centre_of_gravity.pd, NONE, 1.1 #centroid.pd, NONE, 1.1 #checkers.pd, NONE, 1.1 #clip.pd, NONE, 1.1 #color.pd, NONE, 1.1 #contrast.pd, NONE, 1.1 #fade.pd, NONE, 1.1 #fade_lin.pd, NONE, 1.1 #greyscale_to_rgb.pd, NONE, 1.1 #hueshift.pd, NONE, 1.1 #motion_detection.pd, NONE, 1.1 #mouse.pd, NONE, 1.1 #posterize.pd, NONE, 1.1 #ravel.pd, NONE, 1.1 #remap_image.pd, NONE, 1.1 #rgb_to_greyscale.pd, NONE, 1.1 #rgb_to_yuv.pd, NONE, 1.1 #solarize.pd, NONE, 1.1 #spread.pd, NONE, 1.1 #text_to_image.pd, NONE, 1.1 #yuv_to_rgb.pd, NONE, 1.1 @complex_sq.pd, NONE, 1.1 count.pd, NONE, 1.1 pingpong.pd, NONE, 1.1
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /cvsroot/pure-data/externals/gridflow/extra
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21117/extra
Added Files:
jmax_format.rb puredata_format.rb server_1_grid.rb
server_1_ppm.rb server_2.rb smpte.rb
Log Message:
starting to commit gridflow 0.8.0 ...
if you know how to use "cvs import" please mail me and i'll use it for 0.8.1
--- NEW FILE: server_1_grid.rb ---
# $Id: server_1_grid.rb,v 1.1 2005/10/04 02:02:15 matju Exp $
require "socket"
require "smpte" # in this folder
picture = "\x7fGRID \000\003"
picture << [240,320,3].pack("N*")
make_smpte(picture) {|*rgb| rgb.pack "N*" }
# File.open("blah.grid","w") {|f| f.write picture }
serv = TCPServer.new 4242
loop {
puts "waiting for connection (port 4242)"
sock = serv.accept
puts "incoming connection"
begin
loop {
sock.write picture
puts "wrote one picture"
}
rescue Errno::EPIPE # Broken Pipe
puts "connection closed (by client)"
# it's ok, go back to waiting.
end
}
--- NEW FILE: server_2.rb ---
# a server program to connect 2 or more clients together.
# by Mathieu Bouchard
require "fcntl"
require "socket"
class IO
def nonblock=flag
bit = Fcntl::O_NONBLOCK
fcntl(Fcntl::F_SETFL, (fcntl(Fcntl::F_GETFL) & ~bit) |
if flag then bit else 0 end)
end
# does not work with any ruby version, due to a bug. see below.
def read_at_most n
s=""
k=1<<(Math.log(n)/Math.log(2)).to_i
while k>0
unless k+s.length>n
puts "trying #{k}"
(s << read(k)) rescue Errno::EWOULDBLOCK
end
k>>=1
end
s
end
# this one works but is slow.
def bugfree_read_at_most n
s=""
(s << (read 1) while s.length<n) rescue Errno::EWOULDBLOCK
s
end
end
serv = TCPServer.new 4242
socks = [serv]
loop {
puts "waiting for connection (port 4242)"
begin
loop {
puts "waiting"
ready,blah,crap = IO.select socks, [], socks, 1
(ready||[]).each {|s|
if s==serv then
sock = serv.accept
sock.nonblock=true
socks << sock
puts "incoming connection (total: #{socks.length-1})"
else
other = socks.find_all{|x|not TCPServer===x} - [s]
stuff = s.bugfree_read_at_most 1024
p stuff
(s.close; socks.delete s) if not stuff or stuff.length==0
other.each {|x|
p x
x.write stuff
}
end
}
}
rescue Errno::EPIPE # Broken Pipe
puts "connection closed (by client)"
# it's ok, go back to waiting.
end
}
--- NEW FILE: jmax_format.rb ---
=begin
$Id: jmax_format.rb,v 1.1 2005/10/04 02:02:15 matju Exp $
GridFlow
Copyright (c) 2001,2002,2003 by Mathieu Bouchard
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.
See file ../COPYING for further informations on licensing terms.
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
=end
class JMaxFileHandler
Size = [4,1,2,4]
Packer = ["N","c","n","N"]
OpTable = [
[0, :return],
[1, :push, :int],
[2, :push, :float],
[3, :push, :symbol],
[5, :set, :int],
[6, :set, :float],
[7, :set, :symbol],
[9, :pop_args, :int],
[10, :push_obj, :int],
[11, :mv_obj, :int],
[12, :pop_objs, :int],
[13, :make_obj, :int],
[14, :put_prop, :symbol],
[16, :obj_mess, :int, :symbol, :int],
[18, :push_obj_table, :int],
[19, :pop_obj_table],
[20, :connect],
[21, :make_top_obj, :int],
]
OpTableById = {}
OpTableByName = {}
OpTable.each {|entry|
id,name,arg = entry
OpTableById[id] = entry
OpTableByName[name] = entry
}
end
class JObject
attr_reader :properties
attr_accessor :parent_patcher
attr_reader :init_messages
attr_reader :connections
def self.[](*args) new(*args) end
def initialize(*args)
@args = args
@properties = {}
@init_messages = []
end
def send_in(inlet,*args)
@init_messages << [inlet,*args]
end
def connect(inlet,target,outlet)
end
def subobjects
@subobjects={} if not defined? @subobjects
@subobjects
end
end
class JMaxFileReader < JMaxFileHandler
def initialize(f,factory=JObject)
@f = f
@symbols = []
@estack = []
@ostack = []
@tstack = []
@factory = factory
end
def parse
magic, code_size, n_symbols = @f.read(12).unpack("a4NN")
case magic
when "bMax"; #ok
when "bMa2"; raise "bMa2 format (jMax 4) is not supported yet"
else raise "not a jMax file"
end
@code = @f.read code_size
@symbols = @f.read.split(/\0/).map {|x| x.intern }
@index = 0
while @index < @code.size
read_opcode
end
raise "@estack.size!=0" if @estack.size!=0
raise "@ostack.size!=1" if @ostack.size!=1
raise "@tstack.size!=0" if @tstack.size!=0
@ostack[0]
end
def read_opcode
#puts "#{@index} of #{@code.size}"
op = @code[@index]; @index+=1
op1,op2 = op&0x3f,op>>6
entry = OpTableById[op1]
if not entry
puts "skipping unknown opcode #{op1},#{op2}"
return
end
args = []
(entry.length-2).times {|i|
args << (case entry[2+i]
when :int
n=Size[op2]; v=@code[@index,n].unpack(Packer[op2])[0]
x = if v[8*n-1]!=0 then ~(~v&((1<<(8*n-1))-1)) else v end
#STDERR.puts "WARNING: #{v} -> #{x}" if x<0
x
when :float
n=4; @code[@index,4].unpack("g")[0]
when :symbol
n=Size[op2]; @symbols[@code[@index,n].unpack(Packer[op2])[0]]
when nil
end)
@index+=n
}
#text = sprintf "%05d: %2d,%1d: %s", @index, op1, op2, entry[1]
#text << "(" << args.map{|x|x.inspect}.join(",") << ")"
#puts text
send entry[1], *args
end
def push x; @estack << x end
def set x
if @estack.size>0 then @estack[-1]=x else @estack << x end
end
def put_prop x; @ostack[-1].properties[x] = @estack[-1] end
def make_obj x
patcher = @ostack[-1] if @ostack.size>0
baby = @factory[*(@estack[-x,x].reverse)]
@ostack << baby
@ostack[-1].parent_patcher = patcher
patcher.subobjects[baby]=true if patcher
end
alias :make_top_obj :make_obj
def pop_args x; @estack[-x,x]=[] end
def push_obj_table x; @tstack<<[] end
def mv_obj x; @tstack[-1][x]=@ostack[-1] end
def pop_objs x; @ostack[-x,x]=[] end
def obj_mess i,s,n
o = @ostack[-1]
m = @estack[-n,n].reverse
if i<0 then o.send s,*m else o.send_in i,s,*m end
end
def push_obj x; @ostack<<@tstack[-1][x] end
def connect; @ostack[-1].connect @estack[-1], at ostack[-2], at estack[-2] end
def pop_obj_table; @tstack.pop end
def return; end
end
if $0 == __FILE__
jff = JMaxFileReader.new File.open("samples/fire.jmax")
jff.parse
end
--- NEW FILE: smpte.rb ---
# Copyright 2001 by Mathieu Bouchard
# $Id: smpte.rb,v 1.1 2005/10/04 02:02:15 matju Exp $
# The standard SMPTE color test pattern.
# AS SEEN ON TV !!! (but this is a cheap plastic imitation)
def make_smpte(picture="")
row_1 = ""
row_2 = ""
row_3 = ""
row_3_c = [[0,63,105],[255,255,255],[64,0,119]]
(0...320).each {|x|
n_barre_1 = 7 - x*7/320
n_barre_2 = if n_barre_1&1==0 then 0 else 8 - n_barre_1 end
row_1 << yield (*([1,2,0].map{|c| 255 * ((n_barre_1 >> c)&1) }))
row_2 << yield (*([1,2,0].map{|c| 255 * ((n_barre_2 >> c)&1) }))
row_3 << yield (*(row_3_c[x/57] || [0,0,0]))
}
160.times { picture << row_1 }
20 .times { picture << row_2 }
60 .times { picture << row_3 }
picture
end
--- NEW FILE: server_1_ppm.rb ---
# $Id: server_1_ppm.rb,v 1.1 2005/10/04 02:02:15 matju Exp $
require "socket"
picture = File.open("../images/teapot.ppm") {|x| x.read }
serv = TCPServer.new 4242
loop {
puts "waiting for connection (port 4242)"
sock = serv.accept
begin
loop {
sock.write picture
puts "wrote one picture"
}
rescue Errno::EPIPE # Broken Pipe
puts "connection closed (by client)"
# it's ok, go back to waiting.
end
}
--- NEW FILE: puredata_format.rb ---
=begin
$Id: puredata_format.rb,v 1.1 2005/10/04 02:02:15 matju Exp $
GridFlow
Copyright (c) 2001,2002,2003 by Mathieu Bouchard
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.
See file ../COPYING for further informations on licensing terms.
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
=end
class PureDataFileWriter
def initialize filename
@f = File.open filename, "w"
end
def close; @f.close end
def write_patcher o
pr = o.properties
@f.puts "#N canvas #{pr[:wx]} #{pr[:wy]} #{pr[:ww]} #{pr[:wh]} 10;"
ol = o.subobjects.keys
x=0
ol.find_all {|a| a.classname=="inlet"}.sort {|a,b| a.argv[0] <=> b.argv[0] }.each {|a|
if x>a.properties[:x]
a.properties[:x]=x+16
STDERR.puts "warning: moving inlet #{a.argv[0]} to the right"
end
x=a.properties[:x]
}
x=0
ol.find_all {|a| a.classname=="outlet"}.sort {|a,b| a.argv[0] <=> b.argv[0] }.each {|a|
if x>a.properties[:x]
a.properties[:x]=x+16
STDERR.puts "warning: moving outlet #{a.argv[0]} to the right"
end
x=a.properties[:x]
}
ol.each {|so| write_object so }
ol.each_with_index {|so,i|
next if not so.instance_eval{defined? @outlets}
so.outlets.each_with_index {|conns,outlet|
next if not conns
conns.each {|target,inlet|
@f.puts "#X connect #{i} #{outlet} #{ol.index target} #{inlet};"
}
}
}
end
def list_to_s l
l.map {|x|
if Array===x then "( " + list_to_s(x) + " )" else escape(x.to_s) end
}.join " "
end
# what am i supposed to do?
def escape x; x.gsub(/[;,]/) {|x| " \\#{x}" }.gsub(/\n/) {"\\\n"} end
def escape2 x; x.gsub(/[,]/) {|x| " \\#{x} " }.gsub(/[;\$\"]/) {|x| "\\#{x}" }.gsub(/\n/) {"\\\n"} end
def write_object o
pr = o.properties
#classname = o.class.instance_eval{@foreign_name}
classname = o.classname
if classname=="jpatcher"
#@f.print "#N canvas 0 0 "
write_patcher o
end
case classname
when "display"; classname="print"
when "list"; classname="listmake"
end
t = case classname
when "jcomment"; "text"
when "messbox"; "msg"
when "jpatcher"; "restore"
when "intbox"; "floatatom"
else "obj"
end
@f.print "#X #{t} #{pr[:x]} #{pr[:y]} "
case classname
when "button"
@f.print "bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1"
when "jcomment"
@f.print escape2(pr[:comment].to_s)
when "messbox"
av=o.argv[0]
i=0
dollar="$".intern
while i<av.length
if av[i]==dollar then av[i,2]=("\\$"+av[i+1].to_s).intern else i+=1 end
end
@f.print(list_to_s(av))
when "slider"
#doradio = pr[:maxValue]-pr[:minValue]<=10
doradio = false
#p doradio
name = case pr[:orientation]
when 1; if doradio then "hradio" else "hsl" end
when 2,nil; if doradio then "vradio" else "vsl" end
else raise "bogus slider orientation?" end
@f.print "#{name} "+
"#{pr[:w]} #{pr[:h]} #{pr[:minValue]} #{pr[:maxValue]} 0 0 "+
"empty empty empty -2 -6 0 8 -262144 -1 -1 0 1"
when "intbox"
@f.print "5 0 0 0 - - -;"
when "inlet"; @f.print "inlet"
when "outlet"; @f.print "outlet"
when "jpatcher"
@f.print("pd ",list_to_s(o.argv))
else
@f.print(classname," ",list_to_s(o.argv))
end
@f.puts ";"
end
end
- Previous message: [PD-cvs] externals/gridflow/format aalib.c, NONE, 1.1 dc1394.c, NONE, 1.1 jpeg.c, NONE, 1.1 main.rb, NONE, 1.1 mpeg3.c, NONE, 1.1 png.c, NONE, 1.1 quicktimeapple.c, NONE, 1.1 quicktimehw.c, NONE, 1.1 sdl.c, NONE, 1.1 videodev.c, NONE, 1.1 x11.c, NONE, 1.1
- Next message: [PD-cvs] externals/gridflow/pd_abstractions #apply_colormap_channelwise.pd, NONE, 1.1 #camera.pd, NONE, 1.1 #camera_control.pd, NONE, 1.1 #centre_of_gravity.pd, NONE, 1.1 #centroid.pd, NONE, 1.1 #checkers.pd, NONE, 1.1 #clip.pd, NONE, 1.1 #color.pd, NONE, 1.1 #contrast.pd, NONE, 1.1 #fade.pd, NONE, 1.1 #fade_lin.pd, NONE, 1.1 #greyscale_to_rgb.pd, NONE, 1.1 #hueshift.pd, NONE, 1.1 #motion_detection.pd, NONE, 1.1 #mouse.pd, NONE, 1.1 #posterize.pd, NONE, 1.1 #ravel.pd, NONE, 1.1 #remap_image.pd, NONE, 1.1 #rgb_to_greyscale.pd, NONE, 1.1 #rgb_to_yuv.pd, NONE, 1.1 #solarize.pd, NONE, 1.1 #spread.pd, NONE, 1.1 #text_to_image.pd, NONE, 1.1 #yuv_to_rgb.pd, NONE, 1.1 @complex_sq.pd, NONE, 1.1 count.pd, NONE, 1.1 pingpong.pd, NONE, 1.1
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Pd-cvs
mailing list