diff --git a/Examples/GIFPlot/README b/Examples/GIFPlot/README index 06880fe61..7960a6f98 100644 --- a/Examples/GIFPlot/README +++ b/Examples/GIFPlot/README @@ -4,8 +4,8 @@ GIFPlot To illustrate various SWIG features, the following examples involve building an interface to a small, but somewhat useful graphics library for creating 2D and 3D images in the form of GIF files. The Perl, -Python, and Tcl directories contain various examples specific to those -languages. +Python, Tcl, and Ruby directories contain various examples specific to +those languages. This library was originally developed as part of the SPaSM molecular dynamics project at Los Alamos National Laboratory. However, due to @@ -36,8 +36,8 @@ On Windows, you can probably just do this: Running the Examples ==================== -Once the library has been built, go the Perl, Python, or Tcl directory to see -various SWIG examples. Each example should have a README file with a +Once the library has been built, go the Perl, Python, Tcl, or Ruby directory +to see various SWIG examples. Each example should have a README file with a description. The examples are compiled using the makefile located in the top level "Examples" diff --git a/Examples/GIFPlot/Ruby/full/Makefile b/Examples/GIFPlot/Ruby/full/Makefile new file mode 100644 index 000000000..bde3899a2 --- /dev/null +++ b/Examples/GIFPlot/Ruby/full/Makefile @@ -0,0 +1,23 @@ +TOP = ../../.. +SWIG = $(TOP)/../swig +SWIGOPT = -I../../Include +SRCS = +TARGET = gifplot +INTERFACE = gifplot.i +LIBS = -L../.. -lgifplot +INCLUDE = -I../../Include + +all:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + INCLUDE='$(INCLUDE)' LIBS='$(LIBS)' SWIGOPT='$(SWIGOPT)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' ruby + +static:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + INCLUDE='$(INCLUDE)' LIBS='$(LIBS)' SWIGOPT='$(SWIGOPT)' \ + TARGET='myruby' INTERFACE='$(INTERFACE)' ruby_static + +clean:: + rm -f *_wrap* *.o *~ *.so myruby .~* core *.gif + + diff --git a/Examples/GIFPlot/Ruby/full/README b/Examples/GIFPlot/Ruby/full/README new file mode 100644 index 000000000..22af6cb06 --- /dev/null +++ b/Examples/GIFPlot/Ruby/full/README @@ -0,0 +1,8 @@ +This example runs the entire gifplot.h header file through SWIG without +any changes. The script 'runme.rb' does something a little more +interesting. You'll have to go look at the header file to get a complete +listing of the functions. + + + + diff --git a/Examples/GIFPlot/Ruby/full/gifplot.i b/Examples/GIFPlot/Ruby/full/gifplot.i new file mode 100644 index 000000000..5a7f5008f --- /dev/null +++ b/Examples/GIFPlot/Ruby/full/gifplot.i @@ -0,0 +1,15 @@ +/* Oh what the heck, let's just grab the whole darn header file + and see what happens. */ + +%module gifplot +%{ + +/* Note: You still need this part because the %include directive + merely causes SWIG to interpret the contents of a file. It doesn't + include the right include headers for the resulting C code */ + +#include "gifplot.h" + +%} + +%include gifplot.h diff --git a/Examples/GIFPlot/Ruby/full/runme.rb b/Examples/GIFPlot/Ruby/full/runme.rb new file mode 100644 index 000000000..5c118b2fa --- /dev/null +++ b/Examples/GIFPlot/Ruby/full/runme.rb @@ -0,0 +1,66 @@ +# Plot a 3D function +require 'gifplot' +include Gifplot +include Math + +# Here is the function to plot +def func(x,y) + return 5*cos(2*sqrt(x*x+y*y))*exp(-0.3*sqrt(x*x+y*y)) +end + +# Here are some plotting parameters +XMIN = -5.0 +XMAX = 5.0 +YMIN = -5.0 +YMAX = 5.0 +ZMIN = -5.0 +ZMAX = 5.0 + +# Grid resolution +NXPOINTS = 60 +NYPOINTS = 60 + +cmap = new_ColorMap("cmap") +frame = new_FrameBuffer(500,500) +FrameBuffer_clear(frame,BLACK) + +P3 = new_Plot3D(frame,XMIN,YMIN,ZMIN,XMAX,YMAX,ZMAX) +Plot3D_lookat(P3,2*[XMAX-XMIN,YMAX-YMIN,ZMAX-ZMIN].max) +Plot3D_autoperspective(P3,40) +Plot3D_rotu(P3,60) +Plot3D_rotr(P3,30) +Plot3D_rotd(P3,10) + +def drawsolid() + Plot3D_clear(P3,BLACK) + Plot3D_start(P3) + dx = 1.0*(XMAX-XMIN)/NXPOINTS + dy = 1.0*(YMAX-YMIN)/NYPOINTS + cscale = 240.0/(ZMAX-ZMIN) + x = XMIN + for i in 0...NXPOINTS + y = YMIN + for j in 0...NYPOINTS + z1 = func(x,y) + z2 = func(x+dx,y) + z3 = func(x+dx,y+dy) + z4 = func(x,y+dy) + c1 = cscale*(z1-ZMIN) + c2 = cscale*(z2-ZMIN) + c3 = cscale*(z3-ZMIN) + c4 = cscale*(z4-ZMIN) + c = (c1+c2+c3+c4)/4 + c = 0 if (c < 0) + c = 239 if c > 239 + Plot3D_solidquad(P3,x,y,z1,x+dx,y,z2,x+dx,y+dy,z3,x,y+dy,z4,c+16) + y = y + dy + end + x = x + dx + end +end + +puts "Making a nice 3D plot..." +drawsolid() + +FrameBuffer_writeGIF(frame,cmap,"image.gif") +puts "Wrote image.gif" diff --git a/Examples/GIFPlot/Ruby/simple/Makefile b/Examples/GIFPlot/Ruby/simple/Makefile new file mode 100644 index 000000000..c5163b8f3 --- /dev/null +++ b/Examples/GIFPlot/Ruby/simple/Makefile @@ -0,0 +1,23 @@ +TOP = ../../.. +SWIG = $(TOP)/../swig +SWIGOPT = +SRCS = +TARGET = simple +INTERFACE = simple.i +LIBS = -L../.. -lgifplot +INCLUDE = -I../../Include + +all:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + INCLUDE='$(INCLUDE)' LIBS='$(LIBS)' SWIGOPT='$(SWIGOPT)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' ruby + +static:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + INCLUDE='$(INCLUDE)' LIBS='$(LIBS)' SWIGOPT='$(SWIGOPT)' \ + TARGET='myruby' INTERFACE='$(INTERFACE)' ruby_static + +clean:: + rm -f *_wrap* *.o *~ *.so myruby .~* core *.gif + + diff --git a/Examples/GIFPlot/Ruby/simple/README b/Examples/GIFPlot/Ruby/simple/README new file mode 100644 index 000000000..9b51038bf --- /dev/null +++ b/Examples/GIFPlot/Ruby/simple/README @@ -0,0 +1,5 @@ +This is a very minimalistic example in which just a few functions +and constants from library are wrapped and used to draw some simple +shapes. The script 'runme.rb' runs the example. + + diff --git a/Examples/GIFPlot/Ruby/simple/runme.rb b/Examples/GIFPlot/Ruby/simple/runme.rb new file mode 100644 index 000000000..e8bf5a40f --- /dev/null +++ b/Examples/GIFPlot/Ruby/simple/runme.rb @@ -0,0 +1,27 @@ +# Draw some simple shapes +puts "Drawing some basic shapes" +require 'simple' + +cmap = Simple.new_ColorMap() +f = Simple.new_FrameBuffer(400,400) + +# Clear the picture +Simple.FrameBuffer_clear(f,Simple::BLACK) + +# Make a red box +Simple.FrameBuffer_box(f,40,40,200,200,Simple::RED) + +# Make a blue circle +Simple.FrameBuffer_circle(f,200,200,40,Simple::BLUE) + +# Make green line +Simple.FrameBuffer_line(f,10,390,390,200, Simple::GREEN) + +# Write an image out to disk + +Simple.FrameBuffer_writeGIF(f,cmap,"image.gif") +puts "Wrote image.gif" + +Simple.delete_FrameBuffer(f) +Simple.delete_ColorMap(cmap) + diff --git a/Examples/GIFPlot/Ruby/simple/simple.i b/Examples/GIFPlot/Ruby/simple/simple.i new file mode 100644 index 000000000..457bc4c09 --- /dev/null +++ b/Examples/GIFPlot/Ruby/simple/simple.i @@ -0,0 +1,38 @@ +/* This example shows a very simple interface wrapping a few + primitive declarations */ + +%module simple +%{ +#include "gifplot.h" +%} + +typedef unsigned char Pixel; + +/* Here are a few useful functions */ + +ColorMap *new_ColorMap(char *filename = 0); +void delete_ColorMap(ColorMap *cmap); + +FrameBuffer *new_FrameBuffer(unsigned int width, unsigned int height); +void delete_FrameBuffer(FrameBuffer *frame); +void FrameBuffer_clear(FrameBuffer *frame, Pixel color); +void FrameBuffer_line(FrameBuffer *frame, int x1, int y1, int x2, int y2, Pixel color); +void FrameBuffer_box(FrameBuffer *frame, int x1, int y1, int x2, int y2, Pixel color); +void FrameBuffer_circle(FrameBuffer *frame, int x1, int y1, int radius, Pixel color); +int FrameBuffer_writeGIF(FrameBuffer *f, ColorMap *c, char *filename); + +/* And some useful constants */ + +#define BLACK 0 +#define WHITE 1 +#define RED 2 +#define GREEN 3 +#define BLUE 4 +#define YELLOW 5 +#define CYAN 6 +#define MAGENTA 7 + + + + + diff --git a/Examples/Makefile.in b/Examples/Makefile.in index af5b02691..0123dcc7f 100644 --- a/Examples/Makefile.in +++ b/Examples/Makefile.in @@ -337,6 +337,52 @@ mzscheme: $(SRCS) mzc --cc $(ISRCS) $(SRCS) mzc --ld $(TARGET)$(SO) $(OBJS) $(IOBJS) +################################################################## +##### RUBY ###### +################################################################## + +# Make sure these locate your Ruby installation +RUBY_INCLUDE= -DHAVE_CONFIG_H @RUBYINCLUDE@ + +# ---------------------------------------------------------------- +# Build a C dynamically loadable module +# ---------------------------------------------------------------- + +ruby: $(SRCS) + $(SWIG) -ruby $(SWIGOPT) $(INTERFACE) + $(CC) -c $(CCSHARED) $(CFLAGS) $(ISRCS) $(SRCS) $(INCLUDE) $(RUBY_INCLUDE) + $(LDSHARED) $(OBJS) $(IOBJS) $(LIBS) -o $(TARGET)$(SO) + +# ----------------------------------------------------------------- +# Build a C++ dynamically loadable module +# ----------------------------------------------------------------- + +ruby_cpp: $(SRCS) + $(SWIG) -c++ -ruby $(SWIGOPT) $(INTERFACE) + $(CXX) -c $(CCSHARED) $(CFLAGS) $(ISRCS) $(SRCS) $(INCLUDE) $(RUBY_INCLUDE) + $(CXXSHARED) $(OBJS) $(IOBJS) $(LIBS) $(CPP_DLLIBS) -o $(TARGET)$(SO) + +# ----------------------------------------------------------------- +# Build statically linked Ruby interpreter +# +# These should only be used in conjunction with the %include embed.i +# library file +# ----------------------------------------------------------------- + +RUBY_LIB = @RUBYLIB@ +RUBY_LIBOPTS = @RUBYLINK@ @LIBS@ $(SYSLIBS) + +ruby_static: $(SRCS) + $(SWIG) -ruby -lembed.i $(SWIGOPT) $(INTERFACE) + $(CC) $(CFLAGS) @LINKFORSHARED@ $(ISRCS) $(SRCS) $(INCLUDE) \ + $(RUBY_INCLUDE) $(LIBS) -L$(RUBY_LIB) $(RUBY_LIBOPTS) -o $(TARGET) + +ruby_static_cpp: $(SRCS) + $(SWIG) -c++ -ruby -lembed.i $(SWIGOPT) $(INTERFACE) + $(CXX) $(CFLAGS) $(ISRCS) $(SRCS) $(INCLUDE) \ + $(RUBY_INCLUDE) $(LIBS) -L$(RUBY_LIB) $(RUBY_LIBOPTS) -o $(TARGET) + + ################################################################## ##### SWIG ###### ################################################################## diff --git a/Examples/README b/Examples/README index a3fae68f0..98852617a 100644 --- a/Examples/README +++ b/Examples/README @@ -1,6 +1,6 @@ SWIG Examples -The "perl5", "python", "tcl", "guile", "java", and "mzscheme" +The "perl5", "python", "tcl", "guile", "java", "mzscheme", and "ruby" directories contain a very simple example. The "GIFPlot" contains a more complicated example that illustrates some of SWIG's more advanced capabilities. diff --git a/Examples/index.html b/Examples/index.html index c0e1c2507..8e2f43655 100644 --- a/Examples/index.html +++ b/Examples/index.html @@ -43,6 +43,7 @@ language:
+When SWIG encounters C preprocessor macros and C declarations that look like constants, +it creates Ruby constants with an identical value. Click here +to see a SWIG interface with some constant declarations in it. + +
++is ignored because SWIG has no idea what type of variable this would be. + ++#define EXTERN extern ++
+
++is capitalized as Example::Iconst because Ruby constants name must begin +with upper case character. + ++const int iconst = 37; ++
+The following examples illustrate the use of SWIG with Ruby. + +
++ ++% swig -ruby interface.i ++
++ ++% swig -ruby interface.i +% gcc -fpic -c interface_wrap.c -I/usr/local/lib/ruby/1.4/i686-linux +% gcc -shared interface_wrap.o $(OBJS) -o interface.so +% ruby +require 'interface' +Interface.blah(...) +... ++
+
+
+require 'mkmf'
+create_makefile('interface')
+
+
++++% ruby extconf.rb +% make ++