[Pkg-ruby-extras-maintainers] r195 - in packages: . libcairo-ruby libcairo-ruby/trunk libcairo-ruby/trunk/debian libcairo-ruby/trunk/packages libcairo-ruby/trunk/packages/cairo libcairo-ruby/trunk/packages/cairo/ext libcairo-ruby/trunk/packages/cairo/lib libcairo-ruby/trunk/samples

Thierry Reding beatle-guest at costa.debian.org
Mon Jan 2 10:04:55 UTC 2006


Author: beatle-guest
Date: 2006-01-02 10:04:52 +0000 (Mon, 02 Jan 2006)
New Revision: 195

Added:
   packages/libcairo-ruby/
   packages/libcairo-ruby/tags/
   packages/libcairo-ruby/trunk/
   packages/libcairo-ruby/trunk/.cvsignore
   packages/libcairo-ruby/trunk/AUTHORS
   packages/libcairo-ruby/trunk/COPYING
   packages/libcairo-ruby/trunk/ChangeLog
   packages/libcairo-ruby/trunk/GPL
   packages/libcairo-ruby/trunk/NEWS
   packages/libcairo-ruby/trunk/README
   packages/libcairo-ruby/trunk/debian/
   packages/libcairo-ruby/trunk/debian/changelog
   packages/libcairo-ruby/trunk/debian/compat
   packages/libcairo-ruby/trunk/debian/control
   packages/libcairo-ruby/trunk/debian/copyright
   packages/libcairo-ruby/trunk/debian/rules
   packages/libcairo-ruby/trunk/packages/
   packages/libcairo-ruby/trunk/packages/cairo/
   packages/libcairo-ruby/trunk/packages/cairo/.cvsignore
   packages/libcairo-ruby/trunk/packages/cairo/ext/
   packages/libcairo-ruby/trunk/packages/cairo/ext/.cvsignore
   packages/libcairo-ruby/trunk/packages/cairo/ext/MANIFEST
   packages/libcairo-ruby/trunk/packages/cairo/ext/cairo.def
   packages/libcairo-ruby/trunk/packages/cairo/ext/extconf.rb
   packages/libcairo-ruby/trunk/packages/cairo/ext/pkg-config.rb
   packages/libcairo-ruby/trunk/packages/cairo/ext/post-install.rb
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo.h
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_constants.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_context.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_exception.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_extents.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_face.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_options.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_glyph.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_matrix.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_path.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_pattern.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_private.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_private.h
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_scaled_font.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_surface.c
   packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_text_extents.c
   packages/libcairo-ruby/trunk/packages/cairo/lib/
   packages/libcairo-ruby/trunk/packages/cairo/lib/cairo.rb
   packages/libcairo-ruby/trunk/samples/
   packages/libcairo-ruby/trunk/samples/.cvsignore
   packages/libcairo-ruby/trunk/samples/pdf.rb
   packages/libcairo-ruby/trunk/samples/pdf2.rb
   packages/libcairo-ruby/trunk/samples/png.rb
   packages/libcairo-ruby/trunk/samples/ps.rb
   packages/libcairo-ruby/trunk/samples/ps2.rb
   packages/libcairo-ruby/trunk/setup.rb
Log:
[svn-inject] Installing original source of libcairo-ruby

Added: packages/libcairo-ruby/trunk/.cvsignore
===================================================================
--- packages/libcairo-ruby/trunk/.cvsignore	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/.cvsignore	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,3 @@
+{arch}
+InstalledFiles
+config.save

Added: packages/libcairo-ruby/trunk/AUTHORS
===================================================================
--- packages/libcairo-ruby/trunk/AUTHORS	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/AUTHORS	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,4 @@
+Evan Marin   <martine at danga.com>
+Øyvind Kolås <oeyvindk at hig.no>
+MenTaLguY    <mental at rydia.net>
+Kouhei Sutou <kou at cozmixng.org>

Added: packages/libcairo-ruby/trunk/COPYING
===================================================================
--- packages/libcairo-ruby/trunk/COPYING	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/COPYING	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,59 @@
+Rcairo is copyrighted free software by the persons listed in AUTHORS 
+distributed under the same conditions as ruby; which follow:
+
+Ruby is copyrighted free software by Yukihiro Matsumoto <matz at netlab.jp>.
+You can redistribute it and/or modify it under either the terms of the GPL
+(see the file GPL), or the conditions below:
+
+  1. You may make and give away verbatim copies of the source form of the
+     software without restriction, provided that you duplicate all of the
+     original copyright notices and associated disclaimers.
+
+  2. You may modify your copy of the software in any way, provided that
+     you do at least ONE of the following:
+
+       a) place your modifications in the Public Domain or otherwise
+          make them Freely Available, such as by posting said
+	  modifications to Usenet or an equivalent medium, or by allowing
+	  the author to include your modifications in the software.
+
+       b) use the modified software only within your corporation or
+          organization.
+
+       c) give non-standard binaries non-standard names, with
+          instructions on where to get the original software distribution.
+
+       d) make other distribution arrangements with the author.
+
+  3. You may distribute the software in object code or binary form,
+     provided that you do at least ONE of the following:
+
+       a) distribute the binaries and library files of the software,
+	  together with instructions (in the manual page or equivalent)
+	  on where to get the original distribution.
+
+       b) accompany the distribution with the machine-readable source of
+	  the software.
+
+       c) give non-standard binaries non-standard names, with
+          instructions on where to get the original software distribution.
+
+       d) make other distribution arrangements with the author.
+
+  4. You may modify and include the part of the software into any other
+     software (possibly commercial).  But some files in the distribution
+     are not written by the author, so that they are not under these terms.
+
+     For the list of those files and their copying conditions, see the
+     file LEGAL.
+
+  5. The scripts and library files supplied as input to or produced as 
+     output from the software do not automatically fall under the
+     copyright of the software, but belong to whomever generated them, 
+     and may be sold commercially, and may be aggregated with this
+     software.
+
+  6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+     IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+     PURPOSE.

Added: packages/libcairo-ruby/trunk/ChangeLog
===================================================================
--- packages/libcairo-ruby/trunk/ChangeLog	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/ChangeLog	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,442 @@
+2005-10-16  Kouhei Sutou  <kou at cozmixng.org>
+
+	* NEWS: Added release 1.0.0.
+
+2005-10-15  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/ext/rb_cairo_context.c: Use StringValuePtr
+	instead of STR2CSTR.
+
+	* packages/cairo/ext/rb_cairo_surface.c: Supported PS/PDF surface.
+	* samples/ps.rb, samples/ps2.rb: Added PS surface sample.
+	* samples/pdf.rb, samples/pdf2.rb: Added PDF surface sample.
+
+2005-10-13  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/ext/rb_cairo_surface.c: Fixed a SEGV bug caused
+	by Ruby's GC.
+	(cr_image_surface_create_from_png_generic): Fixed a memory leak
+	bug.
+
+	* packages/cairo/ext/rb_cairo_pattern.c: Added
+	Cairo::GradientPattern#add_color_stop_rgb and
+	Cairo::GradientPattern#add_color_stop for convenience.
+
+2005-10-12  Kouhei Sutou  <kou at cozmixng.org>
+
+	* samples/png.rb: Use Cairo::Context#set_source_rgb instead of
+	Cairo::Context#set_source.
+
+	* packages/cairo/ext/rb_cairo_context.c (cr_set_source_rgb):
+	Re-implemented for backward compatibility.
+
+	* samples/png.rb: Use Cairo::Context#set_source_rgba instead of
+	Cairo::Context#set_source.
+
+	* packages/cairo/ext/rb_cairo_surface.c
+	(cr_image_surface_create_from_png_generic): Set class of the
+	surface.
+
+	* packages/cairo/ext/rb_cairo_context.c (cr_set_source_generic):
+	Fixed wrong variable name.
+
+2005-10-11  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/ext/rb_cairo_context.c: Provided
+	Cairo::Context#set_soruce_rgba.
+	(cr_arc_negative, cr_arc): cx -> xc and cy -> yc.
+
+	* packages/cairo/ext: Extracted Ruby object -> enum type codes.
+
+	* packages/cairo/ext/rb_cairo_pattern.c
+	(cr_gradient_pattern_add_color_stop_rgba): Renamed from
+	cr_gradient_pattern_add_color_stop.
+
+2005-10-10  Øyvind Kolås  <pippin at gimp.org>
+
+	* packages/cairo/ext/rb_cairo_pattern.c:
+	(cr_gradient_pattern_add_color_stop): Make the code work when not
+	passing the color as an array as well.
+
+2005-10-11  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/ext/rb_cairo.c: Added cairo version info.
+
+	* packages/cairo/lib/cairo.rb: Added bindings version info as
+	  1.0.0-beta.
+
+	* samples/canvas: Removed.
+	
+	* packages/cairo/ext/: Added CVS keywords.
+
+	* packages/cairo/ext/rb_cairo_context.c: Renamed 'xform'.
+	* packages/cairo/ext/rb_cairo_font_face.c: ditto.
+	* packages/cairo/ext/rb_cairo_glyph.c: ditto.
+	* packages/cairo/ext/rb_cairo_matrix.c: ditto.
+
+	* packages/cairo/ext/rb_cairo_private.c: Changed prefix to
+	  'rb_cairo__' from 'cr__'.
+	* packages/cairo/ext/rb_cairo_matrix.c: ditto.
+	* packages/cairo/ext/rb_cairo_context.c: ditto.
+	* packages/cairo/ext/rb_cairo_private.h: ditto.
+
+	* packages/cairo/ext/rb_cairo_glyph.c:
+	  - Use Cairo::Glyph#initialize instead of Cairo::Glyph.new.
+	  - Added Cairo::Glyph#to_s.
+
+	* packages/cairo/ext/rb_cairo_font_extents.c:
+	  - Removed Cairo::FontExtents.new.
+	  - Added Cairo::FontExtents#to_s.
+
+	* packages/cairo/ext/rb_cairo_text_extents.c:
+	  - Removed Cairo::TextExtents.new.
+	  - Added Cairo::TextExtents#to_s.
+
+2005-10-10  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/ext/rb_cairo_constants.c: Supported all constants.
+
+	* packages/cairo/ext/rb_cairo_matrix.c: Added a utility method.
+
+	* packages/cairo/lib/cairo.rb: Remove deprecated API.
+	
+	* packages/cairo/ext/rb_cairo_matrix.c: Tidied cairo_matrix_t.
+	* packages/cairo/lib/cairo.rb: ditto.
+
+2005-10-09  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/ext/rb_cairo_context.c,
+	  packages/cairo/ext/rb_cairo_matrix.c: Moved duplicated
+	  functions to ...
+	* packages/cairo/ext/rb_cairo_private.h: ... here.
+	* packages/cairo/ext/rb_cairo_private.c: ditto.
+
+	* packages/cairo/ext/rb_cairo_scaled_font.c: Implemented
+	  cairo_scaled_font_t.
+	* packages/cairo/ext/cairo.def: ditto.
+	* packages/cairo/ext/rb_cairo.c: ditto.
+	* packages/cairo/ext/rb_cairo.h: ditto.
+
+	* packages/cairo/lib/cairo.rb: Removed deprecated wrapper API.
+
+	* packages/cairo/ext/rb_cairo_surface.c:
+	  - Implemented File I/O API by Ruby.
+	  - SurfaceXXX -> XXXSurface.
+
+	* packages/cairo/ext/rb_cairo_exception.c: Tidied exceptions.
+	* packages/cairo/ext/cairo.def: ditto.
+	* packages/cairo/ext/rb_cairo.h: ditto.
+	* packages/cairo/ext/rb_cairo_context.c: ditto.
+	* packages/cairo/ext/rb_cairo_font_options.c: ditto.
+	* packages/cairo/ext/rb_cairo_matrix.c: ditto.
+	* packages/cairo/ext/rb_cairo_pattern.c: ditto.
+	* packages/cairo/ext/rb_cairo_surface.c: ditto.
+
+	* packages/cairo/ext/rb_cairo_pattern.c: Implemented
+	  cairo_pattern_t.
+	* packages/cairo/ext/rb_cairo.c: ditto.
+	* packages/cairo/ext/rb_cairo.h: ditto.
+	* packages/cairo/ext/cairo.def: ditto.
+	* packages/cairo/lib/cairo.rb: ditto.
+	* packages/cairo/ext/rb_cairo_context.c: Followed the avobe changes.
+
+	* packages/cairo/ext/rb_cairo_surface.c
+	  (cr_surface_write_to_png): Don't use rb_need_block() for ruby <=
+	  1.8.2.
+
+2005-10-08  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/ext/rb_cairo_context.c: Supported all API for
+	  cairo_t.
+	* samples/png.rb: Followed the avobe changes.
+
+	* packages/cairo/ext/rb_cairo_path.c: Implemented cairo_path_t.
+	* packages/cairo/ext/rb_cairo.c: ditto.
+	* packages/cairo/ext/rb_cairo.h: ditto.
+	* packages/cairo/ext/cairo.def: ditto.
+
+	* packages/cairo/ext/rb_cairo_font_options.c: Fixed a typo.
+
+	* setup.rb: Added workaround for an error on Win32 platform.
+	  Patch from Masao Mutoh <mutoh at highway.ne.jp>. Thanks!
+
+	* packages/cairo/ext/rb_cairo_font_options.c: Implemented
+	  cairo_font_options_t.
+	* packages/cairo/ext/rb_cairo_surface.c: ditto.
+	* packages/cairo/ext/rb_cairo.c: ditto.
+	* packages/cairo/ext/rb_cairo.h: ditto.
+	* packages/cairo/ext/cairo.def: ditto.
+	* packages/cairo/lib/cairo.rb: ditto.
+
+2005-10-07  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/ext: Added c-mode style configuration header for
+	  Emacs.
+
+	* samples/png.rb: Use Cairo::SurfaceImage instead of
+	  Cairo::Surface.
+
+	* packages/cairo/ext/rb_cairo_surface.c: Implemented
+	  cairo_surface_t.
+
+	* packages/cairo/ext/rb_cairo_exception.c: Sorted "case" in the
+	  order of declaration cairo_status_t in cairo.h.
+
+2005-10-06  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/ext/extconf.rb: Fixed Win32 platform problem.
+	  Patch from Masao Mutoh <mutoh at highway.ne.jp>. Thanks!
+
+2005-10-04  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/ext/rb_cairo.h: Support Win32 platform.
+
+	* packages/cairo/ext/extconf.rb: ditto.
+
+	* packages/cairo/ext/cairo.def: Added.
+
+	* packages/cairo/ext/pkg-config.rb: Added. This file is from
+	  Ruby/GLib.
+
+2005-10-01  Kouhei Sutou  <kou at cozmixng.org>
+
+	* setup.rb: update to 3.4.0.
+
+2005-09-30  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/lib/cairo.rb: change indentation style to
+	  style of ruby-mode.el.
+
+	* README: update dependencies.
+
+	* packages/gtkcairo, packages/svgcairo: remove.
+
+	* setup.rb: update to 3.3.1.
+
+2005-09-29  Kouhei Sutou  <kou at cozmixng.org>
+
+	* packages/cairo/ext/extconf.rb: check modversion.
+	* packages/svgcairo/ext/extconf.rb: ditto.
+
+2005-09-13  Øyvind Kolås  <pippin at gimp.org>
+
+	Patch from Kouhei Sutou
+
+	* packages/cairo/ext:
+	  - add (or rename) internal (static) functions to 'cr_XXX' prefix.
+	  - XXX_v -> rb_XXX
+	  - get_XXX -> XXX
+	  - remove needless RUBY_METHOD_FUNC cast.
+	  - call rb_obj_call_init() in new method.
+
+	* packages/cairo/ext/rb_cairo_font_face.c
+	  (rb_cairo_font_extents, rb_cairo_font_glyph_extents):
+	  move to ...
+
+	* packages/cairo/ext/rb_cairo_context.c:
+	  - ... here.
+	  - add some status checks.
+
+	* packages/cairo/ext/rb_cairo_context.c,
+	  packages/cairo/ext/rb_cairo.h:
+	  - rb_cairo_{from,to}_ruby_object ->
+	    rb_cairo_context_{from,to}_ruby_object
+
+	* packages/cairo/lib/cairo.rb: auto-generate XXX=.
+	  (Cairo::Context#save: move to the C-side.
+
+2005-09-10  Øyvind Kolås  <pippin at gimp.org>
+	
+	* AUTHORS: added Kouhei Sutou
+
+2005-09-10  Øyvind Kolås  <pippin at gimp.org>
+
+	Patch from Kouhei Sutou <kou at cozmixng.org>.
+
+	Hiding free functions, cleanup of ruby <-> C conversion functions.
+	
+  	- rename ruby <-> C convert functions name.
+	ruby -> C: rb_cairo_XXX_from_ruby_object().
+    	C -> ruby: rb_cairo_XXX_to_ruby_object().
+	
+	- provide ruby <-> C convert macros.
+	   ruby -> C: RVAL2CRXXX()
+	   C -> ruby: CRXXX2RVAL()
+	
+  	- _SELF use RVAL2CRXXX()
+  	- rb_cairo_XXX_from_ruby_object() uses rb_obj_is_kind_of()
+	  instead of 'CLASS_OF() !=3D rb_cCairo_XXX'.
+  	- add 'static' or remove free functions.
+
+2005-09-09  Øyvind Kolås  <pippin at freedesktop.org>
+
+	Missed a couple of files when applying the previous patch.
+
+	* packages/cairo/ext/rb_cairo_font_extents.h: removed.
+	* packages/cairo/ext/post-install.rb: added.
+
+2005-09-09  Øyvind Kolås  <pippin at freedesktop.org>
+
+	Header cleanup patch from Kouhei Sutou <kou at cozmixng.org>.
+
+	* packages/cairo/ext/rb_cairo_*.h: removed. The
+   	  contents of packages/cairo/ext/rb_cairo_*.h are moved to
+   	  packages/cairo/ext/rb_cairo.h.
+	* packages/cairo/ext/rb_cairo_*.c: include rb_cairo.h instead of
+          rb_cairo_*.h, Init_*() declarations are moved ...
+   	* packages/cairo/ext/rb_cairo.c: ... here.
+
+2005-09-08  Øyvind Kolås  <pippin at freedesktop.org>
+
+	Integrated patch from Kouhei Sutou <kou at cozmixng.org>.
+
+	* packages/cairo/ext/rb_cairo_exception.h:
+	* packages/cairo/ext/rb_cairo_exception.c:
+		(rb_cairo_raise_exception),
+		(Init_cairo_exception): Added new error types, made exception
+		retrieve the status string itself.
+	* packages/cairo/ext/rb_cairo_context.c:
+		(check_context_status): Simplified exception raising.
+	* packages/cairo/ext/rb_cairo_matrix.c:
+		(rb_cairo_matrix_copy): create a new matrix when copying.
+		(rb_cairo_matrix_invert): do status checking.
+		(Init_cairo_matrix): register invert! method.
+
+2005-06-23  Øyvind Kolås  <pippin at freedesktop.org>
+
+	API shakeup, watch out for falling parts.
+
+	* packages/cairo/ext/*.c: large changes, and regressions.
+	* packages/cairo/ext/rb_cairo_font.[ch]: removed
+	* packages/cairo/ext/rb_cairo_font_face.[ch]: added
+	* packages/cairo/lib/cairo.rb:
+	* samples/*.rb: removed
+	* samples/png.rb: initial test case for new API.
+	* README: fixed spelling error.
+	* AUTHORS: added Ilmari Heikkinen.
+
+2005-03-21  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/cairo/ext/rb_cairo_context.c: Rename methods to eliminate
+	abbreviations (following changes in cairo.h):
+        cairo_concat_matrix             -> cairo_transform
+        cairo_transform_point           -> cairo_user_to_device
+        cairo_transform_distance        -> cairo_user_to_device_distance
+        cairo_inverse_transform_point   -> cairo_device_to_user
+        cairo_inverse_transform_distance-> cairo_device_to_user_distance
+        cairo_init_clip                 -> cairo_reset_clip
+
+
+2005-03-20  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* README: reworked, borrowing ideas and style from pycairo README.
+	* COPYING,
+	* GPL,
+	* AUTHORS: added.
+
+
+2005-03-17  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/cairo/ext/rb_cairo_exception.c: added WriteError and
+	SurfaceFinishedError.
+	* packages/cairo/ext/rb_cairo_surface.c:
+	added finish method.
+	fixed typo in define, that mistook define for PDF as PS.
+	* packages/cairo/ext/rb_cairo_*:
+	search and replace to use rb_cairo_exception_raise instead
+	of cairo_raise_exception
+	* samples/pdf.rb: removed
+	* samples/pdf-a4_grid.rb: added
+
+
+2005-03-15  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/cairo/ext/rb_cairo_context.c:
+	* packages/cairo/lib/cairo.rb: Following API shakeup in cairo,
+	s/cairo_current_foo/cairo_get_foo/ .
+
+
+2005-02-15  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/cairo/ext/rb_cairo.c: added initialization of pattern.
+	* packages/cairo/ext/rb_cairo_constants.c: added filter and extend
+	enums.
+	* packages/cairo/ext/rb_cairo_context.c: added pattern setting and
+	getting, rewrote current_matrix to use rb_cairo_matrix_wrap.
+	* packages/cairo/ext/rb_cairo_matrix.c: convenience function to
+	wrap a cairo_matrix_t.
+	* packages/cairo/ext/rb_cairo_pattern.c: added implementation for
+	surface and linear/radial gradients.
+	* packages/cairo/lib/cairo.rb: syntactic sugar for initializing
+	gradient patterns with blocks.
+	* samples/gradients.rb: sample showing the syntax of gradients.
+
+
+2005-02-10  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/cairo/lib/cairo.rb: added optional 'handler' parameters to
+	Context::current_path and Context#current_path_flat.
+	patch from <mental at rydia.net>
+
+2005-02-10  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/cairo/lib/cairo.rb: made save_internal private,
+	patch from <mental at rydia.net>
+
+2005-02-10  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/svgcairo/ext/rb_svgcairo.c: added error handling.
+	usage of a port for passing FILE stream to the parser.
+	* packages/svgcairo/ext/extconf.rb: added -W to the compile flags.
+
+2005-02-10  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/svgcairo/ext: added initial binding for libsvg-cairo,
+	without error checking, and good integration with the ruby file
+	handling.
+
+005-02-09  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/cairo/lib/cairo.rb: Fixed naming of Transform class to be
+	Matrix.
+
+2005-02-09  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/cairo/lib/cairo.rb: Added the ability for save to
+	take a block.
+
+2005-02-07  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* splitted into seperate files for classes
+	* made use of _SELF macro for more direct access
+	* unified under a rb_ namespace
+	* added font handling and extents
+
+2005-02-06  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* imported mental guys ruby binding to my local tree
+	* added ps and pdf surfaces
+	* reindented according to GNU coding style
+	* made stroke, fill, in_stroke, in_fill, fill_extents and
+	  stroke_extents accept blocks that define the path, in spirit
+	  of the previous binding.
+	* added show_text, text_path, select_font, scale_font and
+	  transform_font
+	* made to work with gtkcairo
+
+
+2005-02-06  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/cairo/cairo.c: add new headers
+	* packages/cairo/gen-Cairo.c: remove unneeded hack to force
+	unit size on newly set font.
+
+2004-11-19  Øyvind Kolås  <pippin at freedesktop.org>
+
+	* packages/canvas/lib/canvas.rb Labal.width: access extents by atom
+	instead of string.
+
+2004-11-19  Øyvind Kolås  <pipipn at freedesktop.org>
+
+	* packages/cairo/ext/*.[ch]: reformatted code.
+	* packages/gtkcairo/ext/*.[ch]: reformatted code.

Added: packages/libcairo-ruby/trunk/GPL
===================================================================
--- packages/libcairo-ruby/trunk/GPL	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/GPL	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.

Added: packages/libcairo-ruby/trunk/NEWS
===================================================================
--- packages/libcairo-ruby/trunk/NEWS	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/NEWS	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,7 @@
+Release 1.0.0 (2005-10-16 Kouhei Sutou <kou at cozmixng.org>)
+==========================================================
+
+Features
+--------
+  * All cairo 1.0.0 API are implemented.
+  * PS/PDF surfaces are supported.

Added: packages/libcairo-ruby/trunk/README
===================================================================
--- packages/libcairo-ruby/trunk/README	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/README	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,36 @@
+rcairo
+======
+
+ruby bindings for cairo // cairo extension for ruby
+
+http://cairographics.org/
+
+
+Dependencies
+------------
+
+ruby                   >= 1.8
+cairo                  >= 1.0.0
+
+Compiling
+---------
+
+ruby setup.rb config    # to check for dependencies and create Makefiles
+ruby setup.rb setup     # to compile
+
+# the samples in the samples folder should be able to run before
+# installation.
+
+ruby setup.rb install   # to install the cairo extension.
+
+
+Mailing list
+------------
+
+If you have trouble with cairo or rcairo, or you have some ideas for how
+it could be improved, please feel free to send a message to the cairo
+mailinglist at cairo at cairographics.org , which is archived at
+
+  http://cairographics.org/cgi-bin/mailman/listinfo/cairo
+
+

Added: packages/libcairo-ruby/trunk/debian/changelog
===================================================================
--- packages/libcairo-ruby/trunk/debian/changelog	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/debian/changelog	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,5 @@
+libcairo-ruby (1.0.0-1) unstable; urgency=low
+
+  * Initial release. (Closes: #342466)
+
+ -- Thierry Reding <thierry at doppeltgemoppelt.de>  Sun,  1 Jan 2006 15:26:56 +0100

Added: packages/libcairo-ruby/trunk/debian/compat
===================================================================
--- packages/libcairo-ruby/trunk/debian/compat	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/debian/compat	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1 @@
+5

Added: packages/libcairo-ruby/trunk/debian/control
===================================================================
--- packages/libcairo-ruby/trunk/debian/control	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/debian/control	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,15 @@
+Source: libcairo-ruby
+Section: libs
+Priority: extra
+Maintainer: Thierry Reding <thierry at doppeltgemoppelt.de>
+Standards-Version: 3.6.2
+Build-Depends: debhelper (>> 5), ruby, ruby1.8, ruby1.8-dev, libcairo2-dev
+
+Package: libcairo-ruby
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: Cairo bindings for the Ruby language
+ Cairo is a multi-platform library providing anti-aliased vector-based
+ rendering for multiple target backends. This package contains libraries for
+ using Cairo with the Ruby programming language. It is most likely useful in
+ conjunction with Ruby bindings for other libraries such as GTK+.

Added: packages/libcairo-ruby/trunk/debian/copyright
===================================================================
--- packages/libcairo-ruby/trunk/debian/copyright	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/debian/copyright	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,76 @@
+
+This package originally Debianised by Thierry Reding <thierry at doppeltgemoppelt.de>,
+on November 20th, 2005.
+
+Originally obtained from <http://cairographics.org/rcairo>.
+
+Copyright:
+
+    Rcairo is copyrighted free software by Evan Marin, Øyvind Kolås,
+    MenTaLguY and Kouhei Sutou, distributed under the same conditions as
+    ruby; which follow:
+
+-----------------------------------------------------------------------------
+
+Ruby is copyrighted free software by Yukihiro Matsumoto <matz at netlab.jp>.
+You can redistribute it and/or modify it under either the terms of the GPL
+(see the file GPL), or the conditions below:
+
+  1. You may make and give away verbatim copies of the source form of the
+     software without restriction, provided that you duplicate all of the
+     original copyright notices and associated disclaimers.
+
+  2. You may modify your copy of the software in any way, provided that
+     you do at least ONE of the following:
+
+       a) place your modifications in the Public Domain or otherwise
+          make them Freely Available, such as by posting said
+	  modifications to Usenet or an equivalent medium, or by allowing
+	  the author to include your modifications in the software.
+
+       b) use the modified software only within your corporation or
+          organization.
+
+       c) give non-standard binaries non-standard names, with
+          instructions on where to get the original software distribution.
+
+       d) make other distribution arrangements with the author.
+
+  3. You may distribute the software in object code or binary form,
+     provided that you do at least ONE of the following:
+
+       a) distribute the binaries and library files of the software,
+	  together with instructions (in the manual page or equivalent)
+	  on where to get the original distribution.
+
+       b) accompany the distribution with the machine-readable source of
+	  the software.
+
+       c) give non-standard binaries non-standard names, with
+          instructions on where to get the original software distribution.
+
+       d) make other distribution arrangements with the author.
+
+  4. You may modify and include the part of the software into any other
+     software (possibly commercial).  But some files in the distribution
+     are not written by the author, so that they are not under these terms.
+
+     For the list of those files and their copying conditions, see the
+     file LEGAL.
+
+  5. The scripts and library files supplied as input to or produced as 
+     output from the software do not automatically fall under the
+     copyright of the software, but belong to whomever generated them, 
+     and may be sold commercially, and may be aggregated with this
+     software.
+
+  6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+     IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+     PURPOSE.
+
+-----------------------------------------------------------------------------
+
+On Debian systems, the full text of the GNU General Public License can be
+found at /usr/share/common-licenses/GPL.
+

Added: packages/libcairo-ruby/trunk/debian/rules
===================================================================
--- packages/libcairo-ruby/trunk/debian/rules	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/debian/rules	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,63 @@
+#!/usr/bin/make -f
+# Debian rules file for libcairo-ruby.
+# Thierry Reding <thierry at doppeltgemoppelt.de>; 2005.
+#
+# Adapted from Dafydd Harries' rules file for ruby-gnome2.
+#
+
+ruby = ruby1.8
+
+config      = $(shell $(ruby) -rrbconfig -e 'puts Config::CONFIG["$(1)"]')
+rubylibdir := $(call config,rubylibdir)
+archdir    := $(call config,archdir)
+
+configure-stamp:
+	dh_testdir
+	$(ruby) setup.rb config --installdirs=std
+	touch $@
+
+configure: configure-stamp
+
+build-stamp: configure
+	dh_testdir
+	$(ruby) setup.rb setup
+	touch $@
+
+build: build-stamp
+
+install: build
+	dh_testdir
+	dh_testroot
+	$(ruby) setup.rb install --prefix=$(CURDIR)/debian/libcairo-ruby
+	dh_installdocs NEWS AUTHORS README
+	dh_installchangelogs ChangeLog
+
+binary-arch: install
+	dh_testdir
+	dh_testroot
+	dh_installexamples samples/*
+	find debian/libcairo-ruby/usr/share/doc/libcairo-ruby -name '*.rb' \
+		-exec chmod 644 '{}' ';'
+	chmod 644 debian/libcairo-ruby$(archdir)/rb_cairo.h
+	dh_strip
+	dh_fixperms
+	dh_shlibdeps
+	dh_gencontrol
+	dh_compress
+	dh_md5sums
+	dh_builddeb
+
+binary-indep:
+
+binary: binary-arch binary-indep
+
+clean:
+	dh_testdir
+	rm -f *-stamp
+	$(ruby) setup.rb distclean
+	rm -f debian/files
+	rm -rf debian/libcairo-ruby
+	rm -f debian/libcairo-ruby.substvars
+
+.PHONY: configure build install binary-arch binary-indep binary clean
+


Property changes on: packages/libcairo-ruby/trunk/debian/rules
___________________________________________________________________
Name: svn:executable
   + 

Added: packages/libcairo-ruby/trunk/packages/cairo/.cvsignore
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/.cvsignore	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/.cvsignore	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1 @@
+InstalledFiles

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/.cvsignore
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/.cvsignore	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/.cvsignore	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,3 @@
+Makefile
+gen-*.c
+.arch-ids

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/MANIFEST
===================================================================

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/cairo.def
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/cairo.def	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/cairo.def	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,57 @@
+EXPORTS
+    Init_cairo
+    rb_mCairo                 DATA
+    rb_cCairo_Context         DATA
+    rb_cCairo_Path            DATA
+    rb_cCairo_Matrix          DATA
+    rb_cCairo_Pattern         DATA
+    rb_cCairo_SolidPattern    DATA
+    rb_cCairo_SurfacePattern  DATA
+    rb_cCairo_GradientPattern DATA
+    rb_cCairo_LinearPattern   DATA
+    rb_cCairo_RadialPattern   DATA
+    rb_cCairo_FontFace        DATA
+    rb_cCairo_FontExtents     DATA
+    rb_cCairo_FontOptions     DATA
+    rb_cCairo_ScaledFont      DATA
+    rb_cCairo_TextExtents     DATA
+    rb_cCairo_Glyph           DATA
+    rb_cCairo_Surface         DATA
+    rb_cairo_context_from_ruby_object
+    rb_cairo_context_to_ruby_object
+    rb_cairo_path_from_ruby_object
+    rb_cairo_path_to_ruby_object
+    rb_cairo_matrix_from_ruby_object
+    rb_cairo_matrix_to_ruby_object
+    rb_cairo_pattern_from_ruby_object
+    rb_cairo_pattern_to_ruby_object
+    rb_cairo_font_face_from_ruby_object
+    rb_cairo_font_face_to_ruby_object
+    rb_cairo_font_extents_from_ruby_object
+    rb_cairo_font_extents_to_ruby_object
+    rb_cairo_font_options_to_ruby_object
+    rb_cairo_font_options_from_ruby_object
+    rb_cairo_scaled_font_to_ruby_object
+    rb_cairo_scaled_font_from_ruby_object
+    rb_cairo_text_extents_from_ruby_object
+    rb_cairo_text_extents_to_ruby_object
+    rb_cairo_glyph_from_ruby_object
+    rb_cairo_glyph_to_ruby_object
+    rb_cairo_surface_from_ruby_object
+    rb_cairo_surface_to_ruby_object
+    rb_cairo_operator_from_ruby_object
+    rb_cairo_antialias_from_ruby_object
+    rb_cairo_fill_rule_from_ruby_object
+    rb_cairo_line_cap_from_ruby_object
+    rb_cairo_line_join_from_ruby_object
+    rb_cairo_font_slant_from_ruby_object
+    rb_cairo_font_weight_from_ruby_object
+    rb_cairo_subpixel_order_from_ruby_object
+    rb_cairo_hint_style_from_ruby_object
+    rb_cairo_hint_metrics_from_ruby_object
+    rb_cairo_path_data_type_from_ruby_object
+    rb_cairo_content_from_ruby_object
+    rb_cairo_format_from_ruby_object
+    rb_cairo_extend_from_ruby_object
+    rb_cairo_filter_from_ruby_object
+    rb_cairo_check_status

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/extconf.rb
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/extconf.rb	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/extconf.rb	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,72 @@
+#!/usr/bin/env ruby
+# vim: filetype=ruby:expandtab:shiftwidth=2:tabstop=8:softtabstop=2 :
+
+require 'mkmf'
+require 'pkg-config'
+require 'fileutils'
+
+# from mkmf-gnome2.rb
+STDOUT.print("checking for GCC... ")
+STDOUT.flush
+if macro_defined?("__GNUC__", "")
+  STDOUT.print "yes\n"
+  $CFLAGS += ' -Wall' 
+  $cc_is_gcc = true
+else
+  STDOUT.print "no\n"
+  $cc_is_gcc = false
+end
+
+def check_win32()
+  STDOUT.print("checking for Win32 OS... ")
+  STDOUT.flush
+  if /cygwin|mingw|mswin32/ =~ RUBY_PLATFORM
+    $defs << "-DRUBY_CAIRO_PLATFORM_WIN32"
+    STDOUT.print "yes\n"
+    if $cc_is_gcc
+      if /^2\./ =~ `#{Config::CONFIG['CC']} -dumpversion`.chomp
+        $CFLAGS += ' -fnative-struct'
+      else
+        $CFLAGS += ' -mms-bitfields'
+      end
+    end
+  else
+    STDOUT.print "no\n"
+  end
+end
+
+def set_output_lib(target_name)
+  if /cygwin|mingw/ =~ RUBY_PLATFORM
+    filename = "libruby-#{target_name}.a"
+    if RUBY_VERSION > "1.8.0"
+      $DLDFLAGS << ",--out-implib=#{filename}" if filename
+    elsif RUBY_VERSION > "1.8"
+      $DLDFLAGS.gsub!(/ -Wl,--out-implib=[^ ]+/, '')
+      $DLDFLAGS << " -Wl,--out-implib=#{filename}" if filename
+    else
+      $DLDFLAGS.gsub!(/ --output-lib\s+[^ ]+/, '')
+      $DLDFLAGS << " --output-lib #{filename}" if filename
+    end
+  elsif /mswin32/ =~ RUBY_PLATFORM
+      filename = "libruby-#{target_name}.lib"
+      $DLDFLAGS.gsub!(/ --output-lib\s+[^ ]+/, '')
+      $DLDFLAGS.gsub!(/ \/IMPLIB:[^ ]+/, '')
+      $DLDFLAGS << " /IMPLIB:#{filename}" if filename    
+  end
+end
+
+def setup_win32(target_name)
+  check_win32
+  set_output_lib(target_name)
+end
+
+
+pkg = "cairo"
+modname = "cairo"
+major, minor, micro = 1, 0, 0
+
+PKGConfig.have_package(pkg, major, minor, micro) or exit 1
+
+setup_win32(modname)
+$defs << "-DRUBY_CAIRO_COMPILATION"
+create_makefile(modname)


Property changes on: packages/libcairo-ruby/trunk/packages/cairo/ext/extconf.rb
___________________________________________________________________
Name: svn:executable
   + 

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/pkg-config.rb
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/pkg-config.rb	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/pkg-config.rb	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,125 @@
+#
+# pkg-config.rb
+#
+# Wrapper of pkg-config tool.
+#
+# Copyright(C) 2003-2005 Ruby-GNOME2 Project.
+#
+# This program is licenced under the same
+# license of Ruby-GNOME2.
+#
+
+require 'mkmf'
+require 'shellwords'
+
+module PKGConfig
+  @@cmd = with_config('pkg-config', ENV["PKG_CONFIG"] ||  'pkg-config')
+  if /mswin32/ =~ RUBY_PLATFORM and /^cl\b/ =~ Config::CONFIG['CC']
+    @@cmd += ' --msvc-syntax'
+  end
+
+  @@list = {}
+  `#{@@cmd} --list-all`.chomp.split(/\n/).each{|v| 
+    pkg, name, desc = /(\S+?)\s+(.*?)\s-\s(.*)/.match(v).to_a[1..3]
+    @@list[pkg] = [name, desc]
+  }
+
+  module_function
+  def exist?(pkg)
+    system("#{@@cmd} --exists #{pkg}")
+  end
+
+  def libs(pkg)
+    `#{@@cmd} --libs #{pkg}`.chomp
+  end
+
+  def libs_only_L(pkg)
+    `#{@@cmd} --libs-only-L #{pkg}`.chomp
+  end
+
+  def libs_only_l(pkg)
+    `#{@@cmd} --libs-only-l #{pkg}`.chomp
+  end
+
+  def cflags(pkg)
+    `#{@@cmd} --cflags #{pkg}`.chomp
+  end
+
+  def cflags_only_I(pkg)
+    `#{@@cmd} --cflags-only-I #{pkg}`.chomp
+  end
+
+  def cflags_only_other(pkg)
+    `#{@@cmd} --cflags-only-other #{pkg}`.chomp
+  end
+
+  def variable(pkg, var)
+    `#{@@cmd} --variable=#{var} #{pkg}`.chomp
+  end
+
+  def modversion(pkg)
+    `#{@@cmd} --modversion #{pkg}`.chomp
+  end
+
+  def version
+    `#{@@cmd} --version`.chomp
+  end
+
+  def list_all
+    # Returns [pkg, name, description]
+    @@list.keys.collect{|key| [key] + @@list[key]}.sort
+  end
+
+  def name(pkg)
+    @@list[pkg][0]
+  end
+
+  def description(pkg)
+    @@list[pkg][1]
+  end
+
+  def provides(pkg)
+    `#{@@cmd} --print-provides #{pkg}`.chomp
+  end
+
+  def requires(pkg)
+    `#{@@cmd} --print-requires #{pkg}`.chomp.gsub("\n", ", ") 
+  end
+
+  def check_version?(pkg, major = 0, minor = 0, micro = 0)
+    return false unless exist?(pkg)
+    ver = modversion(pkg).split(".").collect{|item| item.to_i}
+    (0..2).each {|i| ver[i] = 0 unless ver[i]}
+
+    (ver[0] > major ||
+     (ver[0] == major && ver[1] > minor) ||
+     (ver[0] == major && ver[1] == minor &&
+      ver[2] >= micro))
+  end
+
+  def have_package(pkg, major = 0, minor = 0, micro = 0)
+    if major > 0
+      STDOUT.print("checking for #{pkg} version (>= #{major}.#{minor}.#{micro})... ")
+    else
+      STDOUT.print("checking for #{pkg}... ")
+    end
+    STDOUT.flush
+    if check_version?(pkg, major, minor, micro)
+      STDOUT.print "yes\n"
+      libraries = libs_only_l(pkg)
+      dldflags = libs(pkg)
+      dldflags = (Shellwords.shellwords(dldflags) - Shellwords.shellwords(libraries)).map{|s| /\s/ =~ s ? "\"#{s}\"" : s }.join(' ')
+      $libs   += ' ' + libraries
+      if /mswin32/ =~ RUBY_PLATFORM
+	$DLDFLAGS += ' ' + dldflags
+      else
+	$LDFLAGS += ' ' + dldflags
+      end
+      $CFLAGS += ' ' + cflags(pkg)
+      true
+    else
+      STDOUT.print "no\n"
+      false
+    end
+  end
+end

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/post-install.rb
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/post-install.rb	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/post-install.rb	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1 @@
+install_files(["rb_cairo.h"], config('so-dir'), 0555)

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,75 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/10 16:07:16 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+ */
+
+
+#include "rb_cairo.h"
+
+VALUE rb_mCairo;
+
+extern void Init_cairo_context (void);
+extern void Init_cairo_path (void);
+extern void Init_cairo_matrix (void);
+extern void Init_cairo_surface (void);
+extern void Init_cairo_constants (void);
+extern void Init_cairo_exception (void);
+extern void Init_cairo_font (void);
+extern void Init_cairo_font_extents (void);
+extern void Init_cairo_font_options (void);
+extern void Init_cairo_scaled_font (void);
+extern void Init_cairo_text_extents (void);
+extern void Init_cairo_pattern (void);
+extern void Init_cairo_glyph (void);
+
+
+void
+Init_cairo ()
+{
+  int major, minor, micro;
+  
+  rb_mCairo = rb_define_module ("Cairo");
+
+  rb_define_const (rb_mCairo, "BUILD_VERSION",
+                   rb_ary_new3 (3,
+                                INT2FIX (CAIRO_VERSION_MAJOR),
+                                INT2FIX (CAIRO_VERSION_MINOR),
+                                INT2FIX (CAIRO_VERSION_MICRO)));
+
+  major = cairo_version () / 10000;
+  minor = (cairo_version () % 1000) / 10;
+  micro = cairo_version () % 10;
+
+  rb_define_const (rb_mCairo, "VERSION",
+                   rb_ary_new3 (3,
+                                INT2FIX (major),
+                                INT2FIX (minor),
+                                INT2FIX (micro)));
+  
+  rb_define_const (rb_mCairo, "MAJOR_VERSION", INT2FIX (major));
+  rb_define_const (rb_mCairo, "MINOR_VERSION", INT2FIX (minor));
+  rb_define_const (rb_mCairo, "MICRO_VERSION", INT2FIX (micro));
+  
+  Init_cairo_context ();
+  Init_cairo_path ();
+  Init_cairo_matrix ();
+  Init_cairo_surface ();
+  Init_cairo_constants ();
+  Init_cairo_exception ();
+  Init_cairo_font ();
+  Init_cairo_font_extents ();
+  Init_cairo_font_options ();
+  Init_cairo_scaled_font ();
+  Init_cairo_text_extents ();
+  Init_cairo_pattern ();
+  Init_cairo_glyph ();
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo.h
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo.h	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo.h	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,153 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/11 13:23:49 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+ */
+
+
+#ifndef RB_CAIRO_H
+#define RB_CAIRO_H
+
+#include <cairo.h>
+
+#include "ruby.h"
+
+#if defined(RUBY_CAIRO_PLATFORM_WIN32) && !defined(RUBY_CAIRO_STATIC_COMPILATION)
+#  ifdef RUBY_CAIRO_COMPILATION
+#    define RUBY_CAIRO_VAR __declspec(dllexport)
+#  else
+#    define RUBY_CAIRO_VAR extern __declspec(dllimport)
+#  endif
+#else
+#  define RUBY_CAIRO_VAR extern
+#endif
+
+RUBY_CAIRO_VAR VALUE rb_mCairo;
+RUBY_CAIRO_VAR VALUE rb_cCairo_Context;
+RUBY_CAIRO_VAR VALUE rb_cCairo_Path;
+RUBY_CAIRO_VAR VALUE rb_cCairo_Matrix;
+RUBY_CAIRO_VAR VALUE rb_cCairo_Pattern;
+RUBY_CAIRO_VAR VALUE rb_cCairo_SolidPattern;
+RUBY_CAIRO_VAR VALUE rb_cCairo_SurfacePattern;
+RUBY_CAIRO_VAR VALUE rb_cCairo_GradientPattern;
+RUBY_CAIRO_VAR VALUE rb_cCairo_LinearPattern;
+RUBY_CAIRO_VAR VALUE rb_cCairo_RadialPattern;
+RUBY_CAIRO_VAR VALUE rb_cCairo_FontFace;
+RUBY_CAIRO_VAR VALUE rb_cCairo_FontExtents;
+RUBY_CAIRO_VAR VALUE rb_cCairo_FontOptions;
+RUBY_CAIRO_VAR VALUE rb_cCairo_ScaledFont;
+RUBY_CAIRO_VAR VALUE rb_cCairo_TextExtents;
+RUBY_CAIRO_VAR VALUE rb_cCairo_Glyph;
+RUBY_CAIRO_VAR VALUE rb_cCairo_Surface;
+
+#define RVAL2CRCONTEXT(obj)     (rb_cairo_context_from_ruby_object(obj))
+#define CRCONTEXT2RVAL(cr)      (rb_cairo_context_to_ruby_object(cr))
+
+#define RVAL2CRPATH(obj)        (rb_cairo_path_from_ruby_object(obj))
+#define CRPATH2RVAL(path)       (rb_cairo_path_to_ruby_object(path))
+
+#define RVAL2CRMATRIX(obj)      (rb_cairo_matrix_from_ruby_object(obj))
+#define CRMATRIX2RVAL(matrix)   (rb_cairo_matrix_to_ruby_object(matrix))
+
+#define RVAL2CRPATTERN(obj)     (rb_cairo_pattern_from_ruby_object(obj))
+#define CRPATTERN2RVAL(pattern, klass) (rb_cairo_pattern_to_ruby_object(pattern, klass))
+
+#define RVAL2CRFONTFACE(obj)    (rb_cairo_font_face_from_ruby_object(obj))
+#define CRFONTFACE2RVAL(face)   (rb_cairo_font_face_to_ruby_object(face))
+
+#define RVAL2CRFONTEXTENTS(obj) (rb_cairo_font_extents_from_ruby_object(obj))
+#define CRFONTEXTENTS2RVAL(ext) (rb_cairo_font_extents_to_ruby_object(ext))
+
+#define RVAL2CRFONTOPTIONS(obj) (rb_cairo_font_options_from_ruby_object(obj))
+#define CRFONTOPTIONS2RVAL(ext) (rb_cairo_font_options_to_ruby_object(ext))
+
+#define RVAL2CRSCALEDFONT(obj) (rb_cairo_scaled_font_from_ruby_object(obj))
+#define CRSCALEDFONT2RVAL(ext) (rb_cairo_scaled_font_to_ruby_object(ext))
+
+#define RVAL2CRTEXTEXTENTS(obj) (rb_cairo_text_extents_from_ruby_object(obj))
+#define CRTEXTEXTENTS2RVAL(ext) (rb_cairo_text_extents_to_ruby_object(ext))
+
+#define RVAL2CRGLYPH(obj)       (rb_cairo_glyph_from_ruby_object(obj))
+#define CRGLYPH2RVAL(glyph)     (rb_cairo_glyph_to_ruby_object(glyph))
+
+#define RVAL2CRSURFACE(obj)     (rb_cairo_surface_from_ruby_object(obj))
+#define CRSURFACE2RVAL(surface) (rb_cairo_surface_to_ruby_object(surface))
+
+cairo_t              *rb_cairo_context_from_ruby_object      (VALUE obj);
+VALUE                 rb_cairo_context_to_ruby_object        (cairo_t *cr);
+
+cairo_path_t         *rb_cairo_path_from_ruby_object         (VALUE obj);
+VALUE                 rb_cairo_path_to_ruby_object           (cairo_path_t *path);
+
+cairo_matrix_t       *rb_cairo_matrix_from_ruby_object       (VALUE obj);
+VALUE                 rb_cairo_matrix_to_ruby_object         (cairo_matrix_t *matrix);
+
+cairo_pattern_t      *rb_cairo_pattern_from_ruby_object      (VALUE obj);
+VALUE                 rb_cairo_pattern_to_ruby_object        (cairo_pattern_t *pat, VALUE klass);
+
+cairo_font_face_t    *rb_cairo_font_face_from_ruby_object    (VALUE obj);
+VALUE                 rb_cairo_font_face_to_ruby_object      (cairo_font_face_t *face);
+
+cairo_font_extents_t *rb_cairo_font_extents_from_ruby_object (VALUE obj);
+VALUE                 rb_cairo_font_extents_to_ruby_object   (cairo_font_extents_t *extents);
+
+cairo_font_options_t *rb_cairo_font_options_from_ruby_object (VALUE obj);
+VALUE                 rb_cairo_font_options_to_ruby_object   (cairo_font_options_t *options);
+
+cairo_scaled_font_t  *rb_cairo_scaled_font_from_ruby_object  (VALUE obj);
+VALUE                 rb_cairo_scaled_font_to_ruby_object    (cairo_scaled_font_t *options);
+
+cairo_text_extents_t *rb_cairo_text_extents_from_ruby_object (VALUE obj);
+VALUE                 rb_cairo_text_extents_to_ruby_object   (cairo_text_extents_t *extents);
+
+cairo_glyph_t        *rb_cairo_glyph_from_ruby_object        (VALUE obj);
+VALUE                 rb_cairo_glyph_to_ruby_object          (cairo_glyph_t *glyph);
+
+cairo_surface_t      *rb_cairo_surface_from_ruby_object      (VALUE obj);
+VALUE                 rb_cairo_surface_to_ruby_object        (cairo_surface_t *surface);
+
+
+#define RVAL2CROPERATOR(obj)      (rb_cairo_operator_from_ruby_object(obj))
+#define RVAL2CRANTIALIAS(obj)     (rb_cairo_antialias_from_ruby_object(obj))
+#define RVAL2CRFILLRULE(obj)      (rb_cairo_fill_rule_from_ruby_object(obj))
+#define RVAL2CRLINECAP(obj)       (rb_cairo_line_cap_from_ruby_object(obj))
+#define RVAL2CRLINEJOIN(obj)      (rb_cairo_line_join_from_ruby_object(obj))
+#define RVAL2CRFONTSLANT(obj)     (rb_cairo_font_slant_from_ruby_object(obj))
+#define RVAL2CRFONTWEIGHT(obj)    (rb_cairo_font_weight_from_ruby_object(obj))
+#define RVAL2CRSUBPIXELORDER(obj) (rb_cairo_subpixel_order_from_ruby_object(obj))
+#define RVAL2CRHINTSTYLE(obj)     (rb_cairo_hint_style_from_ruby_object(obj))
+#define RVAL2CRHINTMETRICS(obj)   (rb_cairo_hint_metrics_from_ruby_object(obj))
+#define RVAL2CRPATHDATATYPE(obj)  (rb_cairo_path_data_type_from_ruby_object(obj))
+#define RVAL2CRCONTENT(obj)       (rb_cairo_content_from_ruby_object(obj))
+#define RVAL2CRFORMAT(obj)        (rb_cairo_format_from_ruby_object(obj))
+#define RVAL2CREXTEND(obj)        (rb_cairo_extend_from_ruby_object(obj))
+#define RVAL2CRFILTER(obj)        (rb_cairo_filter_from_ruby_object(obj))
+
+cairo_operator_t       rb_cairo_operator_from_ruby_object       (VALUE obj);
+cairo_antialias_t      rb_cairo_antialias_from_ruby_object      (VALUE obj);
+cairo_fill_rule_t      rb_cairo_fill_rule_from_ruby_object      (VALUE obj);
+cairo_line_cap_t       rb_cairo_line_cap_from_ruby_object       (VALUE obj);
+cairo_line_join_t      rb_cairo_line_join_from_ruby_object      (VALUE obj);
+cairo_font_slant_t     rb_cairo_font_slant_from_ruby_object     (VALUE obj);
+cairo_font_weight_t    rb_cairo_font_weight_from_ruby_object    (VALUE obj);
+cairo_subpixel_order_t rb_cairo_subpixel_order_from_ruby_object (VALUE obj);
+cairo_hint_style_t     rb_cairo_hint_style_from_ruby_object     (VALUE obj);
+cairo_hint_metrics_t   rb_cairo_hint_metrics_from_ruby_object   (VALUE obj);
+cairo_path_data_type_t rb_cairo_path_data_type_from_ruby_object (VALUE obj);
+cairo_content_t        rb_cairo_content_from_ruby_object        (VALUE obj);
+cairo_format_t         rb_cairo_format_from_ruby_object         (VALUE obj);
+cairo_extend_t         rb_cairo_extend_from_ruby_object         (VALUE obj);
+cairo_filter_t         rb_cairo_filter_from_ruby_object         (VALUE obj);
+
+
+void rb_cairo_check_status (cairo_status_t status);
+
+#endif

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_constants.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_constants.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_constants.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,276 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/11 13:23:49 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+*/
+
+
+#include "rb_cairo.h"
+
+#define CAIRO_OPERATOR_MIN CAIRO_OPERATOR_CLEAR
+#define CAIRO_OPERATOR_MAX CAIRO_OPERATOR_SATURATE
+
+#define CAIRO_ANTIALIAS_MIN CAIRO_ANTIALIAS_DEFAULT
+#define CAIRO_ANTIALIAS_MAX CAIRO_ANTIALIAS_SUBPIXEL
+
+#define CAIRO_FILL_RULE_MIN CAIRO_FILL_RULE_WINDING
+#define CAIRO_FILL_RULE_MAX CAIRO_FILL_RULE_EVEN_ODD
+
+#define CAIRO_LINE_CAP_MIN CAIRO_LINE_CAP_BUTT
+#define CAIRO_LINE_CAP_MAX CAIRO_LINE_CAP_SQUARE
+
+#define CAIRO_LINE_JOIN_MIN CAIRO_LINE_JOIN_MITER
+#define CAIRO_LINE_JOIN_MAX CAIRO_LINE_JOIN_BEVEL
+
+#define CAIRO_FONT_SLANT_MIN CAIRO_FONT_SLANT_NORMAL
+#define CAIRO_FONT_SLANT_MAX CAIRO_FONT_SLANT_OBLIQUE
+
+#define CAIRO_FONT_WEIGHT_MIN CAIRO_FONT_WEIGHT_NORMAL
+#define CAIRO_FONT_WEIGHT_MAX CAIRO_FONT_WEIGHT_BOLD
+
+#define CAIRO_SUBPIXEL_ORDER_MIN CAIRO_SUBPIXEL_ORDER_DEFAULT
+#define CAIRO_SUBPIXEL_ORDER_MAX CAIRO_SUBPIXEL_ORDER_VBGR
+
+#define CAIRO_HINT_STYLE_MIN CAIRO_HINT_STYLE_DEFAULT
+#define CAIRO_HINT_STYLE_MAX CAIRO_HINT_STYLE_FULL
+
+#define CAIRO_HINT_METRICS_MIN CAIRO_HINT_METRICS_DEFAULT
+#define CAIRO_HINT_METRICS_MAX CAIRO_HINT_METRICS_OFF
+
+#define CAIRO_PATH_MIN CAIRO_PATH_MOVE_TO
+#define CAIRO_PATH_MAX CAIRO_PATH_CLOSE_PATH
+
+#define CAIRO_CONTENT_MIN CAIRO_CONTENT_COLOR
+#define CAIRO_CONTENT_MAX CAIRO_CONTENT_COLOR_ALPHA
+
+#define CAIRO_FORMAT_MIN CAIRO_FORMAT_ARGB32
+#define CAIRO_FORMAT_MAX CAIRO_FORMAT_A1
+
+#define CAIRO_EXTEND_MIN CAIRO_EXTEND_NONE
+#define CAIRO_EXTEND_MAX CAIRO_EXTEND_REFLECT
+
+#define CAIRO_FILTER_MIN CAIRO_FILTER_FAST
+#define CAIRO_FILTER_MAX CAIRO_FILTER_GAUSSIAN
+
+#define DEFINE_RVAL2ENUM(name, const_name)                  \
+cairo_ ## name ## _t                                        \
+rb_cairo_ ## name ## _from_ruby_object (VALUE rb_ ## name)  \
+{                                                           \
+  cairo_ ## name ## _t name;                                \
+  name = FIX2INT (rb_ ## name);                             \
+  if (name < CAIRO_ ## const_name ## _MIN ||                \
+      name > CAIRO_ ## const_name ## _MAX)                  \
+    {                                                       \
+      rb_raise (rb_eArgError,                               \
+                "invalid %s: %d (expect %d <= %s <= %d)",   \
+                #name, name,                                \
+                CAIRO_ ## const_name ## _MIN,               \
+                #name,                                      \
+                CAIRO_ ## const_name ## _MAX);              \
+    }                                                       \
+  return name;                                              \
+}
+
+DEFINE_RVAL2ENUM(operator, OPERATOR)
+DEFINE_RVAL2ENUM(antialias, ANTIALIAS)
+DEFINE_RVAL2ENUM(fill_rule, FILL_RULE)
+DEFINE_RVAL2ENUM(line_cap, LINE_CAP)
+DEFINE_RVAL2ENUM(line_join, LINE_JOIN)
+DEFINE_RVAL2ENUM(font_slant, FONT_SLANT)
+DEFINE_RVAL2ENUM(font_weight, FONT_WEIGHT)
+DEFINE_RVAL2ENUM(subpixel_order, SUBPIXEL_ORDER)
+DEFINE_RVAL2ENUM(hint_style, HINT_STYLE)
+DEFINE_RVAL2ENUM(hint_metrics, HINT_METRICS)
+DEFINE_RVAL2ENUM(path_data_type, PATH)
+DEFINE_RVAL2ENUM(content, CONTENT)
+DEFINE_RVAL2ENUM(format, FORMAT)
+DEFINE_RVAL2ENUM(extend, EXTEND)
+DEFINE_RVAL2ENUM(filter, FILTER)
+
+
+void
+Init_cairo_constants (void)
+{
+  /* cairo_operator_t */
+  rb_define_const (rb_mCairo,    "OPERATOR_CLEAR",
+                   INT2FIX (CAIRO_OPERATOR_CLEAR));
+
+  rb_define_const (rb_mCairo,    "OPERATOR_SOURCE",
+                   INT2FIX (CAIRO_OPERATOR_SOURCE));
+  rb_define_const (rb_mCairo,    "OPERATOR_OVER",
+                   INT2FIX (CAIRO_OPERATOR_OVER));
+  rb_define_const (rb_mCairo,    "OPERATOR_IN",
+                   INT2FIX (CAIRO_OPERATOR_IN));
+  rb_define_const (rb_mCairo,    "OPERATOR_OUT",
+                   INT2FIX (CAIRO_OPERATOR_OUT));
+  rb_define_const (rb_mCairo,    "OPERATOR_ATOP",
+                   INT2FIX (CAIRO_OPERATOR_ATOP));
+  
+  rb_define_const (rb_mCairo,    "OPERATOR_DEST",
+                   INT2FIX (CAIRO_OPERATOR_DEST));
+  rb_define_const (rb_mCairo,    "OPERATOR_DEST_OVER",
+                   INT2FIX (CAIRO_OPERATOR_DEST_OVER));
+  rb_define_const (rb_mCairo,    "OPERATOR_DEST_IN",
+                   INT2FIX (CAIRO_OPERATOR_DEST_IN));
+  rb_define_const (rb_mCairo,    "OPERATOR_DEST_OUT",
+                   INT2FIX (CAIRO_OPERATOR_DEST_OUT));
+  rb_define_const (rb_mCairo,    "OPERATOR_DEST_ATOP",
+                   INT2FIX (CAIRO_OPERATOR_DEST_ATOP));
+
+  rb_define_const (rb_mCairo,    "OPERATOR_XOR",
+                   INT2FIX (CAIRO_OPERATOR_XOR));
+  rb_define_const (rb_mCairo,    "OPERATOR_ADD",
+                   INT2FIX (CAIRO_OPERATOR_ADD));
+  rb_define_const (rb_mCairo,    "OPERATOR_SATURATE",
+                   INT2FIX (CAIRO_OPERATOR_SATURATE));
+
+  
+  /* cairo_antialias_t */
+  rb_define_const (rb_mCairo,    "ANTIALIAS_DEFAULT",
+                   INT2FIX (CAIRO_ANTIALIAS_DEFAULT));
+  rb_define_const (rb_mCairo,    "ANTIALIAS_NONO",
+                   INT2FIX (CAIRO_ANTIALIAS_NONE));
+  rb_define_const (rb_mCairo,    "ANTIALIAS_GRAY",
+                   INT2FIX (CAIRO_ANTIALIAS_GRAY));
+  rb_define_const (rb_mCairo,    "ANTIALIAS_SUBPIXEL",
+                   INT2FIX (CAIRO_ANTIALIAS_SUBPIXEL));
+
+
+  /* cairo_fill_rule_t */
+  rb_define_const (rb_mCairo,    "FILL_RULE_WINDING",
+                   INT2FIX (CAIRO_FILL_RULE_WINDING));
+  rb_define_const (rb_mCairo,    "FILL_RULE_EVEN_ODD",
+                   INT2FIX (CAIRO_FILL_RULE_EVEN_ODD));
+
+                   
+  /* cairo_line_cap_t */
+  rb_define_const (rb_mCairo,    "LINE_CAP_BUTT",
+                   INT2FIX (CAIRO_LINE_CAP_BUTT));
+  rb_define_const (rb_mCairo,    "LINE_CAP_ROUND",
+                   INT2FIX (CAIRO_LINE_CAP_ROUND));
+  rb_define_const (rb_mCairo,    "LINE_CAP_SQUARE",
+                   INT2FIX (CAIRO_LINE_CAP_SQUARE));
+
+
+  /* cairo_line_join_t */
+  rb_define_const (rb_mCairo,    "LINE_JOIN_MITER",
+                   INT2FIX (CAIRO_LINE_JOIN_MITER));
+  rb_define_const (rb_mCairo,    "LINE_JOIN_ROUND",
+                   INT2FIX (CAIRO_LINE_JOIN_ROUND));
+  rb_define_const (rb_mCairo,    "LINE_JOIN_BEVEL",
+                   INT2FIX (CAIRO_LINE_JOIN_BEVEL));
+
+
+  /* cairo_font_slant_t */
+  rb_define_const (rb_mCairo,    "FONT_SLANT_NORMAL",
+                   INT2FIX (CAIRO_FONT_SLANT_NORMAL));
+  rb_define_const (rb_mCairo,    "FONT_SLANT_ITALIC",
+                   INT2FIX (CAIRO_FONT_SLANT_ITALIC));
+  rb_define_const (rb_mCairo,    "FONT_SLANT_OBLIQUE",
+                   INT2FIX (CAIRO_FONT_SLANT_OBLIQUE));
+
+
+  /* cairo_font_weight_t */
+  rb_define_const (rb_mCairo,    "FONT_WEIGHT_NORMAL",
+                   INT2FIX (CAIRO_FONT_WEIGHT_NORMAL));
+  rb_define_const (rb_mCairo,    "FONT_WEIGHT_BOLD",
+                   INT2FIX (CAIRO_FONT_WEIGHT_BOLD));
+  
+
+  /* cairo_subpixel_order_t */
+  rb_define_const (rb_mCairo,    "SUBPIXEL_ORDER_DEFAULT",
+                   INT2FIX (CAIRO_SUBPIXEL_ORDER_DEFAULT));
+  rb_define_const (rb_mCairo,    "SUBPIXEL_ORDER_RGB",
+                   INT2FIX (CAIRO_SUBPIXEL_ORDER_RGB));
+  rb_define_const (rb_mCairo,    "SUBPIXEL_ORDER_BGR",
+                   INT2FIX (CAIRO_SUBPIXEL_ORDER_BGR));
+  rb_define_const (rb_mCairo,    "SUBPIXEL_ORDER_VRGB",
+                   INT2FIX (CAIRO_SUBPIXEL_ORDER_VRGB));
+  rb_define_const (rb_mCairo,    "SUBPIXEL_ORDER_VBGR",
+                   INT2FIX (CAIRO_SUBPIXEL_ORDER_VBGR));
+  
+
+  /* cairo_hint_style_t */
+  rb_define_const (rb_mCairo,    "HINT_STYLE_DEFAULT",
+                   INT2FIX (CAIRO_HINT_STYLE_DEFAULT));
+  rb_define_const (rb_mCairo,    "HINT_STYLE_NONE",
+                   INT2FIX (CAIRO_HINT_STYLE_NONE));
+  rb_define_const (rb_mCairo,    "HINT_STYLE_SLIGHT",
+                   INT2FIX (CAIRO_HINT_STYLE_SLIGHT));
+  rb_define_const (rb_mCairo,    "HINT_STYLE_MEDIUM",
+                   INT2FIX (CAIRO_HINT_STYLE_MEDIUM));
+  rb_define_const (rb_mCairo,    "HINT_STYLE_FULL",
+                   INT2FIX (CAIRO_HINT_STYLE_FULL));
+
+
+  /* cairo_hint_metrics_t */
+  rb_define_const (rb_mCairo,    "HINT_METRICS_DEFAULT",
+                   INT2FIX (CAIRO_HINT_METRICS_DEFAULT));
+  rb_define_const (rb_mCairo,    "HINT_METRICS_ON",
+                   INT2FIX (CAIRO_HINT_METRICS_ON));
+  rb_define_const (rb_mCairo,    "HINT_METRICS_OFF",
+                   INT2FIX (CAIRO_HINT_METRICS_OFF));
+
+
+  /* cairo_path_data_type_t */
+  rb_define_const (rb_mCairo,    "PATH_MOVE_TO",
+                   INT2FIX (CAIRO_PATH_MOVE_TO));
+  rb_define_const (rb_mCairo,    "PATH_LINE_TO",
+                   INT2FIX (CAIRO_PATH_LINE_TO));
+  rb_define_const (rb_mCairo,    "PATH_CURVE_TO",
+                   INT2FIX (CAIRO_PATH_CURVE_TO));
+  rb_define_const (rb_mCairo,    "PATH_CLOSE_PATH",
+                   INT2FIX (CAIRO_PATH_CLOSE_PATH));
+
+
+  /* cairo_content_t */
+  rb_define_const (rb_mCairo,    "CONTENT_COLOR",
+                   INT2FIX (CAIRO_CONTENT_COLOR));
+  rb_define_const (rb_mCairo,    "CONTENT_ALPHA",
+                   INT2FIX (CAIRO_CONTENT_ALPHA));
+  rb_define_const (rb_mCairo,    "CONTENT_COLOR_ALPHA",
+                   INT2FIX (CAIRO_CONTENT_COLOR_ALPHA));
+
+
+  /* cairo_format_t */
+  rb_define_const (rb_mCairo,    "FORMAT_ARGB32",
+                   INT2FIX (CAIRO_FORMAT_ARGB32));
+  rb_define_const (rb_mCairo,    "FORMAT_RGB24",
+                   INT2FIX (CAIRO_FORMAT_RGB24));
+  rb_define_const (rb_mCairo,    "FORMAT_A8",
+                   INT2FIX (CAIRO_FORMAT_A8));
+  rb_define_const (rb_mCairo,    "FORMAT_A1",
+                   INT2FIX (CAIRO_FORMAT_A1));
+
+
+  /* cairo_extend_t */
+  rb_define_const (rb_mCairo,    "EXTEND_NONE",
+                   INT2FIX (CAIRO_EXTEND_NONE));
+  rb_define_const (rb_mCairo,    "EXTEND_REPEAT",
+                   INT2FIX (CAIRO_EXTEND_REPEAT));
+  rb_define_const (rb_mCairo,    "EXTEND_REFLECT",
+                   INT2FIX (CAIRO_EXTEND_REFLECT));
+
+  
+  /* cairo_filter_t */
+  rb_define_const (rb_mCairo,    "FILTER_FAST",
+                   INT2FIX (CAIRO_FILTER_FAST));
+  rb_define_const (rb_mCairo,    "FILTER_GOOD",
+                   INT2FIX (CAIRO_FILTER_GOOD));
+  rb_define_const (rb_mCairo,    "FILTER_BEST",
+                   INT2FIX (CAIRO_FILTER_BEST));
+  rb_define_const (rb_mCairo,    "FILTER_NEAREST",
+                   INT2FIX (CAIRO_FILTER_NEAREST));
+  rb_define_const (rb_mCairo,    "FILTER_BILINEAR",
+                   INT2FIX (CAIRO_FILTER_BILINEAR));
+  rb_define_const (rb_mCairo,    "FILTER_GAUSSIAN",
+                   INT2FIX (CAIRO_FILTER_GAUSSIAN));
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_context.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_context.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_context.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,1142 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/15 14:33:46 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+*/
+
+#include "rb_cairo.h"
+#include "rb_cairo_private.h"
+
+VALUE rb_cCairo_Context;
+
+static ID cr_id_source_class;
+
+#define _SELF  (RVAL2CRCONTEXT(self))
+
+static inline void
+cr_check_status (cairo_t *context)
+{
+  rb_cairo_check_status (cairo_status (context));
+}
+
+/* Functions for manipulating state objects */
+cairo_t *
+rb_cairo_context_from_ruby_object (VALUE obj)
+{
+  cairo_t *context;
+  if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_Context)))
+    {
+      rb_raise (rb_eTypeError, "not a cairo graphics context");
+    }
+  Data_Get_Struct (obj, cairo_t, context);
+  return context;
+}
+
+static void
+cr_context_free (void *ptr)
+{
+  if (ptr)
+    {
+      cairo_destroy ((cairo_t *) ptr);
+    }
+}
+
+VALUE
+rb_cairo_context_to_ruby_object (cairo_t *cr)
+{
+  if (cr)
+    {
+      cairo_reference (cr);
+      return Data_Wrap_Struct (rb_cCairo_Context, NULL, cr_context_free, cr);
+    }
+  else
+    {
+      return Qnil;
+    }
+}
+
+static VALUE
+cr_allocate (VALUE klass)
+{
+  return Data_Wrap_Struct (klass, NULL, cr_context_free, NULL);
+}
+
+static VALUE
+cr_initialize (VALUE self, VALUE target)
+{
+  cairo_t *cr;
+
+  cr = cairo_create (RVAL2CRSURFACE (target));
+  cr_check_status (cr);
+  DATA_PTR(self) = cr;
+  return Qnil;
+}
+
+static VALUE
+cr_restore (VALUE self)
+{
+  cairo_restore (_SELF);
+  cr_check_status (_SELF);
+  return Qnil;
+}
+
+static VALUE
+cr_save (VALUE self)
+{
+  VALUE result = Qnil;
+  cairo_save (_SELF);
+  cr_check_status (_SELF);
+  if (rb_block_given_p ())
+    {
+      result = rb_ensure (rb_yield, self, cr_restore, self);
+    }
+  return result;
+}
+
+/* Modify state */
+static VALUE
+cr_set_operator (VALUE self, VALUE operator)
+{
+  cairo_set_operator (_SELF, RVAL2CROPERATOR (operator));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_set_source_rgb (int argc, VALUE *argv, VALUE self)
+{
+  VALUE red, green, blue;
+  int n;
+
+  n = rb_scan_args (argc, argv, "12", &red, &green, &blue);
+
+  if (n == 1 && RTEST (rb_obj_is_kind_of (red, rb_cArray)))
+    {
+      VALUE ary = red;
+      n = RARRAY (ary)->len;
+      red = rb_ary_entry (ary, 0);
+      green = rb_ary_entry (ary, 1);
+      blue = rb_ary_entry (ary, 2);
+    }
+
+  if (n == 3)
+    {
+      cairo_set_source_rgb (_SELF,
+                            NUM2DBL (red),
+                            NUM2DBL (green),
+                            NUM2DBL (blue));
+    }
+  else
+    {
+      VALUE inspected_arg = rb_inspect (rb_ary_new4 (argc, argv));
+      rb_raise (rb_eArgError,
+                "invalid RGB: %s (expect "
+                "(red, green, blue) or ([red, green, blue]))",
+                StringValuePtr (inspected_arg));
+    }
+  cr_check_status (_SELF);
+  rb_ivar_set (self, cr_id_source_class, rb_cCairo_SolidPattern);
+  return self;
+}
+
+static VALUE
+cr_set_source_rgba (int argc, VALUE *argv, VALUE self)
+{
+  VALUE red, green, blue, alpha;
+  int n;
+
+  n = rb_scan_args (argc, argv, "13", &red, &green, &blue, &alpha);
+
+  if (n == 1 && RTEST (rb_obj_is_kind_of (red, rb_cArray)))
+    {
+      VALUE ary = red;
+      n = RARRAY (ary)->len;
+      red = rb_ary_entry (ary, 0);
+      green = rb_ary_entry (ary, 1);
+      blue = rb_ary_entry (ary, 2);
+      alpha = rb_ary_entry (ary, 3);
+    }
+
+  if (n == 3)
+    {
+      cairo_set_source_rgb (_SELF,
+                            NUM2DBL (red),
+                            NUM2DBL (green),
+                            NUM2DBL (blue));
+    }
+  else if (n == 4)
+    {
+      cairo_set_source_rgba (_SELF,
+                             NUM2DBL (red),
+                             NUM2DBL (green),
+                             NUM2DBL (blue),
+                             NUM2DBL (alpha));
+    }
+  else
+    {
+      VALUE inspected_arg = rb_inspect (rb_ary_new4 (argc, argv));
+      rb_raise (rb_eArgError,
+                "invalid RGB%s: %s (expect "
+                "(red, green, blue), (red, green, blue, alpha), "
+                "([red, green, blue]) or ([red, green, blue, alpha]))",
+                n == 4 ? "A" : "",
+                StringValuePtr (inspected_arg));
+    }
+  cr_check_status (_SELF);
+  rb_ivar_set (self, cr_id_source_class, rb_cCairo_SolidPattern);
+  return self;
+}
+
+static VALUE
+cr_set_source_surface (VALUE self, VALUE surface, VALUE width, VALUE height)
+{
+  cairo_set_source_surface (_SELF,
+                            RVAL2CRSURFACE (surface),
+                            NUM2INT (width),
+                            NUM2INT (height));
+  cr_check_status (_SELF);
+  rb_ivar_set (self, cr_id_source_class, rb_cCairo_SurfacePattern);
+  return self;
+}
+
+static VALUE
+cr_set_source (VALUE self, VALUE pattern)
+{
+  cairo_set_source (_SELF, RVAL2CRPATTERN (pattern));
+  cr_check_status (_SELF);
+  rb_ivar_set (self, cr_id_source_class, rb_obj_class (pattern));
+  return self;
+}
+
+static VALUE
+cr_set_source_generic (int argc, VALUE *argv, VALUE self)
+{
+  VALUE arg1, arg2, arg3, arg4;
+  int n;
+
+  n = rb_scan_args (argc, argv, "13", &arg1, &arg2, &arg3, &arg4);
+
+  if (n == 1 && RTEST (rb_obj_is_kind_of (arg1, rb_cArray)))
+    {
+      return cr_set_source_rgba (argc, argv, self);
+    }
+  else if (n == 1)
+    {
+      return cr_set_source (self, arg1);
+    }
+  else if (n == 3 && rb_obj_is_kind_of (arg1, rb_cCairo_Surface))
+    {
+      return cr_set_source_surface (self, arg1, arg2, arg3);
+    }
+  else if (n == 3 || n == 4)
+    {
+      return cr_set_source_rgba (argc, argv, self);
+    }
+  else
+    {
+      rb_raise (rb_eArgError,
+                "invalid argument (expect "
+                "(red, green, blue), (red, green, blue, alpha), "
+                "([red, green, blue]), ([red, green, blue, alpha]), "
+                "(pattern) or (surface, x, y))");
+    }
+}
+
+static VALUE
+cr_set_tolerance (VALUE self, VALUE tolerance)
+{
+  cairo_set_tolerance (_SELF, NUM2DBL (tolerance));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_set_antialias(VALUE self, VALUE antialias)
+{
+  cairo_set_antialias(_SELF, RVAL2CRANTIALIAS (antialias));
+  cr_check_status(_SELF);
+  return self;
+}
+
+static VALUE
+cr_set_fill_rule (VALUE self, VALUE rule)
+{
+  cairo_set_fill_rule (_SELF, RVAL2CRFILLRULE (rule));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_set_line_width (VALUE self, VALUE width)
+{
+  cairo_set_line_width (_SELF, NUM2DBL (width));
+  return self;
+}
+
+static VALUE
+cr_set_line_cap (VALUE self, VALUE cap)
+{
+  cairo_set_line_cap (_SELF, RVAL2CRLINECAP (cap));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_set_line_join (VALUE self, VALUE join)
+{
+  cairo_set_line_join (_SELF, RVAL2CRLINEJOIN (join));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_set_dash (VALUE self, VALUE dash_array, VALUE offset)
+{
+  if (!NIL_P (dash_array))
+    {
+      Check_Type (dash_array, T_ARRAY);
+    }
+
+  if (NIL_P (dash_array) || RARRAY (dash_array)->len == 0)
+    {
+      cairo_set_dash (_SELF, NULL, 0, NUM2DBL (offset));
+    }
+  else
+    {
+      int i, length;
+      double *values;
+      length = RARRAY (dash_array)->len;
+      values = ALLOCA_N (double, length);
+      if (!values)
+        {
+          rb_cairo_check_status (CAIRO_STATUS_NO_MEMORY);
+        }
+      for (i = 0; i < length; i++)
+        {
+          values[i] = NUM2DBL (RARRAY (dash_array)->ptr[i]);
+        }
+      cairo_set_dash (_SELF, values, length, NUM2DBL (offset));
+    }
+  
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_set_miter_limit (VALUE self, VALUE limit)
+{
+  cairo_set_miter_limit (_SELF, NUM2DBL (limit));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_translate (VALUE self, VALUE tx, VALUE ty)
+{
+  cairo_translate (_SELF, NUM2DBL (tx), NUM2DBL (ty));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_scale (VALUE self, VALUE sx, VALUE sy)
+{
+  cairo_scale (_SELF, NUM2DBL (sx), NUM2DBL (sy));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_rotate (VALUE self, VALUE radians)
+{
+  cairo_rotate (_SELF, NUM2DBL (radians));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_transform (VALUE self, VALUE matrix)
+{
+  cairo_transform (_SELF, RVAL2CRMATRIX (matrix));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_set_matrix (VALUE self, VALUE matrix)
+{
+  cairo_set_matrix (_SELF, RVAL2CRMATRIX (matrix));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_identity_matrix (VALUE self)
+{
+  cairo_identity_matrix (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_user_to_device (VALUE self, VALUE x, VALUE y)
+{
+  double pair[2];
+  pair[0] = NUM2DBL (x);
+  pair[1] = NUM2DBL (y);
+  cairo_user_to_device (_SELF, pair, pair + 1);
+  cr_check_status (_SELF);
+  return rb_cairo__float_array (pair, 2);
+}
+
+static VALUE
+cr_user_to_device_distance (VALUE self, VALUE dx, VALUE dy)
+{
+  double pair[2];
+  pair[0] = NUM2DBL (dx);
+  pair[1] = NUM2DBL (dy);
+  cairo_user_to_device_distance (_SELF, pair, pair + 1);
+  cr_check_status (_SELF);
+  return rb_cairo__float_array (pair, 2);
+}
+
+static VALUE
+cr_device_to_user (VALUE self, VALUE x, VALUE y)
+{
+  double pair[2];
+  pair[0] = NUM2DBL (x);
+  pair[1] = NUM2DBL (y);
+  cairo_device_to_user (_SELF, pair, pair + 1);
+  cr_check_status (_SELF);
+  return rb_cairo__float_array (pair, 2);
+}
+
+static VALUE
+cr_device_to_user_distance (VALUE self, VALUE dx, VALUE dy)
+{
+  double pair[2];
+  pair[0] = NUM2DBL (dx);
+  pair[1] = NUM2DBL (dy);
+  cairo_device_to_user_distance (_SELF, pair, pair + 1);
+  cr_check_status (_SELF);
+  return rb_cairo__float_array (pair, 2);
+}
+
+
+/* Path creation functions */
+static VALUE
+cr_new_path (VALUE self)
+{
+  cairo_new_path (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_move_to (VALUE self, VALUE x, VALUE y)
+{
+  cairo_move_to (_SELF, NUM2DBL (x), NUM2DBL (y));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_line_to (VALUE self, VALUE x, VALUE y)
+{
+  cairo_line_to (_SELF, NUM2DBL (x), NUM2DBL (y));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_curve_to (VALUE self, VALUE x1, VALUE y1,
+             VALUE x2, VALUE y2, VALUE x3, VALUE y3)
+{
+  cairo_curve_to (_SELF, NUM2DBL (x1), NUM2DBL (y1),
+                  NUM2DBL (x2), NUM2DBL (y2), NUM2DBL (x3), NUM2DBL (y3));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_arc (VALUE self, VALUE xc, VALUE yc, VALUE radius,
+        VALUE angle1, VALUE angle2)
+{
+  cairo_arc (_SELF, NUM2DBL (xc), NUM2DBL (yc), NUM2DBL (radius),
+             NUM2DBL (angle1), NUM2DBL (angle2));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_arc_negative (VALUE self, VALUE xc, VALUE yc, VALUE radius,
+                 VALUE angle1, VALUE angle2)
+{
+  cairo_arc_negative (_SELF, NUM2DBL (xc), NUM2DBL (yc), NUM2DBL (radius),
+                      NUM2DBL (angle1), NUM2DBL (angle2));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_rel_move_to (VALUE self, VALUE x, VALUE y)
+{
+  cairo_rel_move_to (_SELF, NUM2DBL (x), NUM2DBL (y));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_rel_line_to (VALUE self, VALUE x, VALUE y)
+{
+  cairo_rel_line_to (_SELF, NUM2DBL (x), NUM2DBL (y));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_rel_curve_to (VALUE self, VALUE x1, VALUE y1,
+                 VALUE x2, VALUE y2, VALUE x3, VALUE y3)
+{
+  cairo_rel_curve_to (_SELF, NUM2DBL (x1), NUM2DBL (y1),
+                      NUM2DBL (x2), NUM2DBL (y2), NUM2DBL (x3), NUM2DBL (y3));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_rectangle (VALUE self, VALUE x, VALUE y, VALUE width, VALUE height)
+{
+  cairo_rectangle (_SELF, NUM2DBL (x), NUM2DBL (y),
+                   NUM2DBL (width), NUM2DBL (height));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_close_path (VALUE self)
+{
+  cairo_close_path (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+/* Painting functions */
+static VALUE
+cr_paint (VALUE self)
+{
+  cairo_paint (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_paint_with_alpha (VALUE self, VALUE alpha)
+{
+  cairo_paint_with_alpha (_SELF, NUM2DBL (alpha));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_paint_generic(int argc, VALUE *argv, VALUE self)
+{
+  VALUE alpha;
+  int n;
+
+  n = rb_scan_args (argc, argv, "01", &alpha);
+
+  if (n == 0 || (n == 1 && NIL_P(alpha)))
+    {
+      return cr_paint (self);
+    }
+  if (n == 1)
+    {
+      return cr_paint_with_alpha (self, alpha);
+    }
+  else
+    {
+      rb_raise (rb_eArgError,
+                "invalid argument (expect () or (alpha))");
+    }
+}
+
+static VALUE
+cr_mask(VALUE self, VALUE pattern)
+{
+  cairo_mask (_SELF, RVAL2CRPATTERN (pattern));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_mask_surface (VALUE self, VALUE surface, VALUE x, VALUE y)
+{
+  cairo_mask_surface (_SELF, RVAL2CRSURFACE (surface),
+                      NUM2DBL (x), NUM2DBL (y));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_mask_generic (int argc, VALUE *argv, VALUE self)
+{
+  VALUE arg1, arg2, arg3;
+  int n;
+
+  n = rb_scan_args (argc, argv, "12", &arg1, &arg2, &arg3);
+
+  if (n == 1)
+    {
+      return cr_mask (self, arg1);
+    }
+  else if (n == 3)
+    {
+      return cr_mask_surface (self, arg1, arg2, arg3);
+    }
+  else
+    {
+      rb_raise (rb_eArgError,
+                "invalid argument (expect (pattern) or (surface, x, y))");
+    }
+}
+
+static VALUE
+cr_stroke (VALUE self)
+{
+  if (rb_block_given_p ())
+    {
+      cr_new_path (self);
+      rb_yield (self);
+    }
+  cairo_stroke (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_stroke_preserve (VALUE self)
+{
+  if (rb_block_given_p ())
+    {
+      cr_new_path (self);
+      rb_yield (self);
+    }
+  cairo_stroke_preserve (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_fill (VALUE self)
+{
+  if (rb_block_given_p ())
+    {
+      cr_new_path (self);
+      rb_yield (self);
+    }
+  cairo_fill (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+
+static VALUE
+cr_fill_preserve (VALUE self)
+{
+  if (rb_block_given_p ())
+    {
+      cr_new_path (self);
+      rb_yield (self);
+    }
+  cairo_fill_preserve (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_copy_page (VALUE self)
+{
+  cairo_copy_page (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_show_page (VALUE self)
+{
+  cairo_show_page (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+/* Insideness testing */
+static VALUE
+cr_in_stroke (VALUE self, VALUE x, VALUE y)
+{
+  if (rb_block_given_p ())
+    {
+      cr_new_path (self);
+      rb_yield (self);
+    }
+  return cairo_in_stroke (_SELF, NUM2DBL (x), NUM2DBL (y)) ? Qtrue : Qfalse;
+}
+
+static VALUE
+cr_in_fill (VALUE self, VALUE x, VALUE y)
+{
+  if (rb_block_given_p ())
+    {
+      cr_new_path (self);
+      rb_yield (self);
+    }
+  return cairo_in_fill (_SELF, NUM2DBL (x), NUM2DBL (y)) ? Qtrue : Qfalse;
+}
+
+/* Rectangular extents */
+static VALUE
+cr_stroke_extents (VALUE self)
+{
+  double extents[4];
+  if (rb_block_given_p ())
+    {
+      cr_new_path (self);
+      rb_yield (self);
+    }
+  cairo_stroke_extents (_SELF, extents, extents + 1, extents + 2, extents + 3);
+  return rb_cairo__float_array (extents, 4);
+}
+
+static VALUE
+cr_fill_extents (VALUE self)
+{
+  double extents[4];
+  if (rb_block_given_p ())
+    {
+      cr_new_path (self);
+      rb_yield (self);
+    }
+  cairo_fill_extents (_SELF, extents, extents + 1, extents + 2, extents + 3);
+  return rb_cairo__float_array (extents, 4);
+}
+
+/* Clipping */
+static VALUE
+cr_reset_clip (VALUE self)
+{
+  cairo_reset_clip (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_clip (VALUE self)
+{
+  cairo_clip (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_clip_preserve (VALUE self)
+{
+  cairo_clip_preserve (_SELF);
+  cr_check_status (_SELF);
+  return self;
+}
+
+/* Font/Text functions */
+static   VALUE
+cr_select_font_face (VALUE self, VALUE family, VALUE slant, VALUE weight)
+{
+  cairo_select_font_face (_SELF, StringValuePtr (family),
+                          RVAL2CRFONTSLANT (slant), RVAL2CRFONTWEIGHT (weight));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static   VALUE
+cr_set_font_size (VALUE self, VALUE scale)
+{
+  cairo_set_font_size (_SELF, NUM2DBL (scale));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_set_font_matrix (VALUE self, VALUE matrix)
+{
+  cairo_set_font_matrix (_SELF, RVAL2CRMATRIX (matrix));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_get_font_matrix (VALUE self)
+{
+  cairo_matrix_t matrix;
+  cairo_get_font_matrix (_SELF, &matrix);
+  cr_check_status (_SELF);
+  return CRMATRIX2RVAL (&matrix);
+}
+
+static VALUE
+cr_set_font_options (VALUE self, VALUE options)
+{
+  cairo_set_font_options (_SELF, RVAL2CRFONTOPTIONS (options));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_get_font_options (VALUE self)
+{
+  cairo_font_options_t *options = NULL;
+  cairo_get_font_options (_SELF, options);
+  cr_check_status (_SELF);
+  return CRFONTOPTIONS2RVAL (options);
+}
+
+static VALUE
+cr_show_text (VALUE self, VALUE utf8)
+{
+  cairo_show_text (_SELF, StringValuePtr (utf8));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_show_glyphs (VALUE self, VALUE rb_glyphs)
+{
+  int count;
+  cairo_glyph_t *glyphs;
+
+  if (!rb_obj_is_kind_of (rb_glyphs, rb_cArray))
+     rb_raise (rb_eTypeError, "expected array");
+    
+  rb_cairo__glyphs_to_array (rb_glyphs, &glyphs, &count);
+  cairo_show_glyphs (_SELF, glyphs, count);
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_get_font_face (VALUE self)
+{
+  cairo_font_face_t *face;
+  
+  face = cairo_get_font_face (_SELF);
+  cr_check_status (_SELF);
+  return CRFONTFACE2RVAL (face);
+}
+
+static VALUE
+cr_font_extents (VALUE self)
+{
+  cairo_font_extents_t extents;
+  cairo_font_extents (_SELF, &extents);
+  cr_check_status (_SELF);
+  return CRFONTEXTENTS2RVAL (&extents);
+}
+
+static VALUE
+cr_set_font_face (VALUE self, VALUE face)
+{
+  cairo_set_font_face (_SELF, RVAL2CRFONTFACE (face));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_text_extents (VALUE self, VALUE utf8)
+{
+  cairo_text_extents_t extents;
+  cairo_text_extents (_SELF, StringValuePtr (utf8), &extents);
+  cr_check_status (_SELF);
+  return CRTEXTEXTENTS2RVAL (&extents);
+}
+
+static VALUE
+cr_glyph_extents (VALUE self, VALUE rb_glyphs)
+{
+  cairo_text_extents_t extents;
+  cairo_glyph_t *glyphs;
+  int length;
+
+  rb_cairo__glyphs_to_array (rb_glyphs, &glyphs, &length);
+  cairo_glyph_extents (_SELF, glyphs, length, &extents);
+  cr_check_status (_SELF);
+  return CRTEXTEXTENTS2RVAL (&extents);
+}
+
+static VALUE
+cr_text_path (VALUE self, VALUE utf8)
+{
+  cairo_text_path (_SELF, StringValuePtr (utf8));
+  cr_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_glyph_path (VALUE self, VALUE rb_glyphs)
+{
+  int count;
+  cairo_glyph_t *glyphs;
+
+  rb_cairo__glyphs_to_array (rb_glyphs, &glyphs, &count);
+  cairo_glyph_path (_SELF, glyphs, count);
+  cr_check_status (_SELF);
+  
+  return self;
+}
+
+/* Query functions */
+static VALUE
+cr_get_operator (VALUE self)
+{
+  return INT2FIX (cairo_get_operator (_SELF));
+}
+
+static VALUE
+cr_get_source (VALUE self)
+{
+  cairo_pattern_t *source;
+  source = cairo_get_source (_SELF);
+
+  if (source)
+    {
+      rb_cairo_check_status (cairo_pattern_status (source));
+      return CRPATTERN2RVAL (source, rb_ivar_get (self, cr_id_source_class));
+    }
+  else
+    return Qnil;
+}
+
+static VALUE
+cr_get_tolerance (VALUE self)
+{
+  return rb_float_new (cairo_get_tolerance (_SELF));
+}
+
+static VALUE
+cr_get_antialias(VALUE self)
+{
+  return INT2NUM (cairo_get_antialias(_SELF));
+}
+
+static VALUE
+cr_get_current_point (VALUE self)
+{
+  double point[2];
+  cairo_get_current_point (_SELF, point, point + 1);
+  return rb_cairo__float_array (point, 2);
+}
+
+static VALUE
+cr_get_fill_rule (VALUE self)
+{
+  return INT2FIX (cairo_get_fill_rule (_SELF));
+}
+
+static VALUE
+cr_get_line_width (VALUE self)
+{
+  return rb_float_new (cairo_get_line_width (_SELF));
+}
+
+static VALUE
+cr_get_line_cap (VALUE self)
+{
+  return INT2FIX (cairo_get_line_cap (_SELF));
+}
+
+static VALUE
+cr_get_line_join (VALUE self)
+{
+  return INT2FIX (cairo_get_line_join (_SELF));
+}
+
+static VALUE
+cr_get_miter_limit (VALUE self)
+{
+  return rb_float_new (cairo_get_miter_limit (_SELF));
+}
+
+static VALUE
+cr_get_matrix (VALUE self)
+{
+  cairo_matrix_t matrix;
+  cairo_get_matrix (_SELF, &matrix);
+  cr_check_status (_SELF);
+  return CRMATRIX2RVAL (&matrix);
+}
+
+static VALUE
+cr_get_target (VALUE self)
+{
+  cairo_surface_t *surface;
+
+  surface = cairo_get_target (_SELF);
+  rb_cairo_check_status (cairo_surface_status (surface));
+  return CRSURFACE2RVAL (surface);
+}
+
+/* Paths */
+static VALUE
+cr_copy_path (VALUE self)
+{
+  VALUE path = CRPATH2RVAL (cairo_copy_path (_SELF));
+  cr_check_status (_SELF);
+  return path;
+}
+
+static VALUE
+cr_copy_path_flat (VALUE self)
+{
+  VALUE path = CRPATH2RVAL (cairo_copy_path_flat (_SELF));
+  cr_check_status (_SELF);
+  return path;
+}
+
+static VALUE
+cr_copy_append_path (VALUE self, VALUE path)
+{
+  cairo_append_path (_SELF, RVAL2CRPATH (path));
+  cr_check_status (_SELF);
+  return self;
+}
+
+void
+Init_cairo_context (void)
+{
+  cr_id_source_class = rb_intern ("source_class");
+  
+  rb_cCairo_Context =
+    rb_define_class_under (rb_mCairo, "Context", rb_cObject);
+
+  rb_define_alloc_func (rb_cCairo_Context, cr_allocate);
+  
+  /* Functions for manipulating state objects */
+  rb_define_method (rb_cCairo_Context, "initialize", cr_initialize, 1);
+
+  rb_define_method (rb_cCairo_Context, "save", cr_save, 0);
+  rb_define_method (rb_cCairo_Context, "restore", cr_restore, 0);
+
+  /* Modify state */
+  rb_define_method (rb_cCairo_Context, "set_operator", cr_set_operator, 1);
+  rb_define_method (rb_cCairo_Context, "set_source", cr_set_source_generic, -1);
+  rb_define_method (rb_cCairo_Context, "set_source_rgb",
+                    cr_set_source_rgb, -1);
+  rb_define_method (rb_cCairo_Context, "set_source_rgba",
+                    cr_set_source_rgba, -1);
+  rb_define_method (rb_cCairo_Context, "set_tolerance", cr_set_tolerance, 1);
+  rb_define_method (rb_cCairo_Context, "set_antialias", cr_set_antialias, 1);
+  rb_define_method (rb_cCairo_Context, "set_fill_rule", cr_set_fill_rule, 1);
+  rb_define_method (rb_cCairo_Context, "set_line_width", cr_set_line_width, 1);
+  rb_define_method (rb_cCairo_Context, "set_line_cap", cr_set_line_cap, 1);
+  rb_define_method (rb_cCairo_Context, "set_line_join", cr_set_line_join, 1);
+  rb_define_method (rb_cCairo_Context, "set_dash", cr_set_dash, 2);
+  rb_define_method (rb_cCairo_Context, "set_miter_limit",
+                    cr_set_miter_limit, 1);
+  
+  rb_define_method (rb_cCairo_Context, "translate", cr_translate, 2);
+  rb_define_method (rb_cCairo_Context, "scale", cr_scale, 2);
+  rb_define_method (rb_cCairo_Context, "rotate", cr_rotate, 1);
+  rb_define_method (rb_cCairo_Context, "transform", cr_transform, 1);
+  
+  rb_define_method (rb_cCairo_Context, "set_matrix", cr_set_matrix, 1);
+  rb_define_method (rb_cCairo_Context, "identity_matrix",
+                    cr_identity_matrix, 1);
+  rb_define_method (rb_cCairo_Context, "user_to_device", cr_user_to_device, 2);
+  rb_define_method (rb_cCairo_Context, "user_to_device_distance",
+                    cr_user_to_device_distance, 2);
+  rb_define_method (rb_cCairo_Context, "device_to_user", cr_device_to_user, 2);
+  rb_define_method (rb_cCairo_Context, "device_to_user_distance",
+                    cr_device_to_user_distance, 2);
+
+  /* Path creation functions */
+  rb_define_method (rb_cCairo_Context, "new_path", cr_new_path, 0);
+  rb_define_method (rb_cCairo_Context, "move_to", cr_move_to, 2);
+  rb_define_method (rb_cCairo_Context, "line_to", cr_line_to, 2);
+  rb_define_method (rb_cCairo_Context, "curve_to", cr_curve_to, 6);
+  rb_define_method (rb_cCairo_Context, "arc", cr_arc, 5);
+  rb_define_method (rb_cCairo_Context, "arc_negative", cr_arc_negative, 5);
+  rb_define_method (rb_cCairo_Context, "rel_move_to", cr_rel_move_to, 2);
+  rb_define_method (rb_cCairo_Context, "rel_line_to", cr_rel_line_to, 2);
+  rb_define_method (rb_cCairo_Context, "rel_curve_to", cr_rel_curve_to, 6);
+  rb_define_method (rb_cCairo_Context, "rectangle", cr_rectangle, 4);
+  rb_define_method (rb_cCairo_Context, "close_path", cr_close_path, 0);
+
+  /* Painting functions */
+  rb_define_method (rb_cCairo_Context, "paint", cr_paint_generic, -1);
+  rb_define_method (rb_cCairo_Context, "mask", cr_mask_generic, -1);
+  rb_define_method (rb_cCairo_Context, "stroke", cr_stroke, 0);
+  rb_define_method (rb_cCairo_Context, "stroke_preserve",
+                    cr_stroke_preserve, 0);
+  rb_define_method (rb_cCairo_Context, "fill", cr_fill, 0);
+  rb_define_method (rb_cCairo_Context, "fill_preserve", cr_fill_preserve, 0);
+  rb_define_method (rb_cCairo_Context, "copy_page", cr_copy_page, 0);
+  rb_define_method (rb_cCairo_Context, "show_page", cr_show_page, 0);
+
+  /* Insideness testing */
+  rb_define_method (rb_cCairo_Context, "in_stroke?", cr_in_stroke, 2);
+  rb_define_method (rb_cCairo_Context, "in_fill?", cr_in_fill, 2);
+  
+  /* Rectangular extents */
+  rb_define_method (rb_cCairo_Context, "stroke_extents", cr_stroke_extents, 0);
+  rb_define_method (rb_cCairo_Context, "fill_extents", cr_fill_extents, 0);
+  
+  /* Clipping */
+  rb_define_method (rb_cCairo_Context, "reset_clip", cr_reset_clip, 0);
+  rb_define_method (rb_cCairo_Context, "clip", cr_clip, 0);
+  rb_define_method (rb_cCairo_Context, "clip_preserve", cr_clip_preserve, 0);
+
+  /* Font/Text functions */
+  rb_define_method (rb_cCairo_Context, "select_font_face",
+                    cr_select_font_face, 3);
+  rb_define_method (rb_cCairo_Context, "set_font_size", cr_set_font_size, 1);
+  rb_define_method (rb_cCairo_Context, "set_font_matrix",
+                    cr_set_font_matrix, 1);
+  rb_define_method (rb_cCairo_Context, "font_matrix", cr_get_font_matrix, 0);
+  rb_define_method (rb_cCairo_Context, "set_font_options",
+                    cr_set_font_options, 1);
+  rb_define_method (rb_cCairo_Context, "font_options", cr_get_font_options, 0);
+  rb_define_method (rb_cCairo_Context, "show_text", cr_show_text, 1);
+  rb_define_method (rb_cCairo_Context, "show_glyphs", cr_show_glyphs, 1);
+  rb_define_method (rb_cCairo_Context, "font_face", cr_get_font_face, 0);
+  rb_define_method (rb_cCairo_Context, "font_extents",
+                    cr_font_extents, 0);
+  rb_define_method (rb_cCairo_Context, "set_font_face", cr_set_font_face, 1);
+  rb_define_method (rb_cCairo_Context, "text_extents", cr_text_extents, 1);
+  rb_define_method (rb_cCairo_Context, "glyph_extents", cr_glyph_extents, 1);
+  rb_define_method (rb_cCairo_Context, "text_path", cr_text_path, 1);
+  rb_define_method (rb_cCairo_Context, "glyph_path", cr_glyph_path, 1);
+
+  /* Query functions */
+  rb_define_method (rb_cCairo_Context, "operator", cr_get_operator, 0);
+  rb_define_method (rb_cCairo_Context, "source", cr_get_source, 0);
+  rb_define_method (rb_cCairo_Context, "tolerance", cr_get_tolerance, 0);
+  rb_define_method (rb_cCairo_Context, "antialias", cr_get_antialias, 0);
+  rb_define_method (rb_cCairo_Context, "current_point",
+                    cr_get_current_point, 0);
+  rb_define_method (rb_cCairo_Context, "fill_rule", cr_get_fill_rule, 0);
+  rb_define_method (rb_cCairo_Context, "line_width", cr_get_line_width, 0);
+  rb_define_method (rb_cCairo_Context, "line_cap", cr_get_line_cap, 0);
+  rb_define_method (rb_cCairo_Context, "line_join", cr_get_line_join, 0);
+  rb_define_method (rb_cCairo_Context, "miter_limit", cr_get_miter_limit, 0);
+  rb_define_method (rb_cCairo_Context, "matrix", cr_get_matrix, 0);
+  rb_define_method (rb_cCairo_Context, "target", cr_get_target, 0);
+  
+  /* Paths */
+  rb_define_method (rb_cCairo_Context, "copy_path", cr_copy_path, 0);
+  rb_define_method (rb_cCairo_Context, "copy_path_flat", cr_copy_path_flat, 0);
+  rb_define_method (rb_cCairo_Context, "append_path", cr_copy_append_path, 1);
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_exception.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_exception.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_exception.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,165 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/10 15:40:26 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+*/
+
+#include "rb_cairo.h"
+
+static VALUE rb_eCairo_InvalidRestoreError;
+static VALUE rb_eCairo_InvalidPopGroupError;
+static VALUE rb_eCairo_NoCurrentPointError;
+static VALUE rb_eCairo_InvalidMatrixError;
+static VALUE rb_eCairo_InvalidStatusError;
+static VALUE rb_eCairo_NullPointerError;
+static VALUE rb_eCairo_InvalidStringError;
+static VALUE rb_eCairo_InvalidPathDataError;
+static VALUE rb_eCairo_ReadError;
+static VALUE rb_eCairo_WriteError;
+static VALUE rb_eCairo_SurfaceFinishedError;
+static VALUE rb_eCairo_SurfaceTypeMismatchError;
+static VALUE rb_eCairo_PatternTypeMismatchError;
+static VALUE rb_eCairo_InvalidContentError;
+static VALUE rb_eCairo_InvalidFormatError;
+static VALUE rb_eCairo_InvalidVisualError;
+static VALUE rb_eCairo_FileNotFoundError;
+static VALUE rb_eCairo_InvalidDashError;
+
+void
+rb_cairo_check_status (cairo_status_t status)
+{
+  const char *string = cairo_status_to_string (status);
+  
+  switch (status)
+    {
+    case CAIRO_STATUS_SUCCESS:
+      break;
+    case CAIRO_STATUS_NO_MEMORY:
+      rb_raise (rb_eNoMemError, string);
+      break;
+    case CAIRO_STATUS_INVALID_RESTORE:
+      rb_raise (rb_eCairo_InvalidRestoreError, string);
+      break;
+    case CAIRO_STATUS_INVALID_POP_GROUP:
+      rb_raise (rb_eCairo_InvalidPopGroupError, string);
+      break;
+    case CAIRO_STATUS_NO_CURRENT_POINT:
+      rb_raise (rb_eCairo_NoCurrentPointError, string);
+      break;
+    case CAIRO_STATUS_INVALID_MATRIX:
+      rb_raise (rb_eCairo_InvalidMatrixError, string);
+      break;
+    case CAIRO_STATUS_INVALID_STATUS:
+      rb_raise (rb_eCairo_InvalidStatusError, string);
+      break;
+    case CAIRO_STATUS_NULL_POINTER:
+      rb_raise (rb_eCairo_NullPointerError, string);
+      break;
+    case CAIRO_STATUS_INVALID_STRING:
+      rb_raise (rb_eCairo_InvalidStringError, string);
+      break;
+    case CAIRO_STATUS_INVALID_PATH_DATA:
+      rb_raise (rb_eCairo_InvalidPathDataError, string);
+      break;
+    case CAIRO_STATUS_READ_ERROR:
+      rb_raise (rb_eCairo_ReadError, string);
+      break;
+    case CAIRO_STATUS_WRITE_ERROR:
+      rb_raise (rb_eCairo_WriteError, string);
+      break;
+    case CAIRO_STATUS_SURFACE_FINISHED:
+      rb_raise (rb_eCairo_SurfaceFinishedError, string);
+      break;
+    case CAIRO_STATUS_SURFACE_TYPE_MISMATCH:
+      rb_raise (rb_eCairo_SurfaceTypeMismatchError, string);
+      break;
+    case CAIRO_STATUS_PATTERN_TYPE_MISMATCH:
+      rb_raise (rb_eCairo_PatternTypeMismatchError, string);
+      break;
+    case CAIRO_STATUS_INVALID_CONTENT:
+      rb_raise (rb_eCairo_InvalidContentError, string);
+      break;
+    case CAIRO_STATUS_INVALID_FORMAT:
+      rb_raise (rb_eCairo_InvalidFormatError, string);
+      break;
+    case CAIRO_STATUS_INVALID_VISUAL:
+      rb_raise (rb_eCairo_InvalidVisualError, string);
+      break;
+    case CAIRO_STATUS_FILE_NOT_FOUND:
+      rb_raise (rb_eCairo_FileNotFoundError, string);
+      break;
+    case CAIRO_STATUS_INVALID_DASH:
+      rb_raise (rb_eCairo_InvalidDashError, string);
+      break;
+    }
+}
+
+void
+Init_cairo_exception ()
+{
+  VALUE rb_eCairo_Error;
+  rb_eCairo_Error =
+    rb_define_class_under (rb_mCairo, "Error", rb_eStandardError);
+  rb_eCairo_InvalidRestoreError =
+    rb_define_class_under (rb_mCairo, "InvalidRestoreError",
+                           rb_eCairo_Error);
+  rb_eCairo_InvalidPopGroupError =
+    rb_define_class_under (rb_mCairo, "InvalidPopGroupError",
+                           rb_eCairo_Error);
+  rb_eCairo_NoCurrentPointError =
+    rb_define_class_under (rb_mCairo, "NoCurrentPointError",
+                           rb_eCairo_Error);
+  rb_eCairo_InvalidMatrixError =
+    rb_define_class_under (rb_mCairo, "InvalidMatrixError",
+                           rb_eArgError);
+  rb_eCairo_InvalidStatusError =
+    rb_define_class_under (rb_mCairo, "InvalidStatusError",
+                           rb_eArgError);
+  rb_eCairo_NullPointerError =
+    rb_define_class_under (rb_mCairo, "NullPointerError",
+                           rb_eTypeError);
+  rb_eCairo_InvalidStringError =
+    rb_define_class_under (rb_mCairo, "InvalidStringError",
+                           rb_eArgError);
+  rb_eCairo_InvalidPathDataError =
+    rb_define_class_under (rb_mCairo, "InvalidPathDataError",
+                           rb_eArgError);
+  rb_eCairo_ReadError =
+    rb_define_class_under (rb_mCairo, "ReadError",
+                           rb_eIOError);
+  rb_eCairo_WriteError =
+    rb_define_class_under (rb_mCairo, "WriteError",
+                           rb_eIOError);
+  rb_eCairo_SurfaceFinishedError =
+    rb_define_class_under (rb_mCairo, "SurfaceFinishedError",
+                           rb_eCairo_Error);
+  rb_eCairo_SurfaceTypeMismatchError =
+    rb_define_class_under (rb_mCairo, "SurfaceTypeMismatchError",
+                           rb_eTypeError);
+  rb_eCairo_PatternTypeMismatchError =
+    rb_define_class_under (rb_mCairo, "PatternTypeMismatchError",
+                           rb_eTypeError);
+  rb_eCairo_InvalidContentError =
+    rb_define_class_under (rb_mCairo, "InvalidContentError",
+                           rb_eArgError);
+  rb_eCairo_InvalidFormatError =
+    rb_define_class_under (rb_mCairo, "InvalidFormatError",
+                           rb_eArgError);
+  rb_eCairo_InvalidVisualError =
+    rb_define_class_under (rb_mCairo, "InvalidVisualError",
+                           rb_eArgError);
+  rb_eCairo_FileNotFoundError =
+    rb_define_class_under (rb_mCairo, "FileNotFound",
+                           rb_eCairo_Error);
+  rb_eCairo_InvalidDashError =
+    rb_define_class_under (rb_mCairo, "InvalidDashError",
+                           rb_eArgError);
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_extents.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_extents.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_extents.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,124 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/10 15:40:26 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+ */
+
+#include "rb_cairo.h"
+
+VALUE rb_cCairo_FontExtents;
+
+#define _SELF(self)  (RVAL2CRFONTEXTENTS(self))
+
+cairo_font_extents_t *
+rb_cairo_font_extents_from_ruby_object (VALUE obj)
+{
+  cairo_font_extents_t *extents;
+  if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_FontExtents)))
+    {
+      rb_raise (rb_eTypeError, "not a cairo font extents");
+    }
+  Data_Get_Struct (obj, cairo_font_extents_t, extents);
+  return extents;
+}
+
+VALUE
+rb_cairo_font_extents_to_ruby_object (cairo_font_extents_t *extents)
+{
+  if (extents)
+    {
+      cairo_font_extents_t *new_extents = ALLOC (cairo_font_extents_t);
+      *new_extents = *extents;
+      return Data_Wrap_Struct (rb_cCairo_FontExtents, NULL, -1, new_extents);
+    }
+  else
+    {
+      return Qnil;
+    }
+}
+
+static    VALUE
+cr_font_extents_ascent (VALUE self)
+{
+  return rb_float_new (_SELF(self)->ascent);
+}
+
+static    VALUE
+cr_font_extents_descent (VALUE self)
+{
+  return rb_float_new (_SELF(self)->descent);
+}
+
+static    VALUE
+cr_font_extents_height (VALUE self)
+{
+  return rb_float_new (_SELF(self)->height);
+}
+
+static    VALUE
+cr_font_extents_max_x_advance (VALUE self)
+{
+  return rb_float_new (_SELF(self)->max_x_advance);
+}
+
+static    VALUE
+cr_font_extents_max_y_advance (VALUE self)
+{
+  return rb_float_new (_SELF(self)->max_y_advance);
+}
+
+static VALUE
+cr_font_extents_to_s (VALUE self)
+{
+  VALUE ret;
+
+  ret = rb_str_new2 ("#<");
+  rb_str_cat2 (ret, rb_class2name (CLASS_OF (self)));
+  rb_str_cat2 (ret, ": ");
+  rb_str_cat2 (ret, "ascent=");
+  rb_str_concat (ret, rb_inspect (cr_font_extents_ascent (self)));
+  rb_str_cat2 (ret, ", ");
+  rb_str_cat2 (ret, "descent=");
+  rb_str_concat (ret, rb_inspect (cr_font_extents_descent (self)));
+  rb_str_cat2 (ret, ", ");
+  rb_str_cat2 (ret, "height=");
+  rb_str_concat (ret, rb_inspect (cr_font_extents_height (self)));
+  rb_str_cat2 (ret, ", ");
+  rb_str_cat2 (ret, "max_x_advance=");
+  rb_str_concat (ret, rb_inspect (cr_font_extents_max_x_advance (self)));
+  rb_str_cat2 (ret, ", ");
+  rb_str_cat2 (ret, "max_y_advance=");
+  rb_str_concat (ret, rb_inspect (cr_font_extents_max_y_advance (self)));
+  rb_str_cat2 (ret, ">");
+                 
+  return ret;
+}
+
+
+void
+Init_cairo_font_extents (void)
+{
+  rb_cCairo_FontExtents =
+    rb_define_class_under (rb_mCairo, "FontExtents", rb_cObject);
+
+  rb_define_method (rb_cCairo_FontExtents, "ascent",
+                    cr_font_extents_ascent, 0);
+  rb_define_method (rb_cCairo_FontExtents, "descent",
+                    cr_font_extents_descent, 0);
+  rb_define_method (rb_cCairo_FontExtents, "height",
+                    cr_font_extents_height, 0);
+  rb_define_method (rb_cCairo_FontExtents, "max_x_advance",
+                    cr_font_extents_max_x_advance, 0);
+  rb_define_method (rb_cCairo_FontExtents, "max_y_advance",
+                    cr_font_extents_max_y_advance, 0);
+
+  rb_define_method (rb_cCairo_FontExtents, "to_s", cr_font_extents_to_s, 0);
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_face.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_face.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_face.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,55 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/10 15:40:26 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+*/
+
+
+#include "rb_cairo.h"
+
+VALUE rb_cCairo_FontFace;
+
+#define _SELF  (RVAL2CRFONTFACE(self))
+
+cairo_font_face_t *
+rb_cairo_font_face_from_ruby_object (VALUE obj)
+{
+  cairo_font_face_t *face;
+  if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_FontFace)))
+    {
+      rb_raise (rb_eTypeError, "not a cairo font face");
+    }
+  Data_Get_Struct (obj, cairo_font_face_t, face);
+  return face;
+}
+
+VALUE
+rb_cairo_font_face_to_ruby_object (cairo_font_face_t *face)
+{
+  if (face)
+    {
+      cairo_font_face_reference (face);
+      return Data_Wrap_Struct (rb_cCairo_FontFace, NULL,
+                               cairo_font_face_destroy, face);
+    }
+  else
+    {
+      return Qnil;
+    }
+}
+
+
+void
+Init_cairo_font (void)
+{
+  rb_cCairo_FontFace =
+    rb_define_class_under (rb_mCairo, "FontFace", rb_cObject);
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_options.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_options.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_font_options.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,193 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/11 13:23:49 $
+ *
+ * Copyright 2005 Kouhei Sutou <kou at cozmixng.org>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+ */
+
+#include "rb_cairo.h"
+
+#define _SELF(self) (RVAL2CRFONTOPTIONS(self))
+
+VALUE rb_cCairo_FontOptions;
+
+static inline void
+cr_options_check_status (cairo_font_options_t *options)
+{
+  rb_cairo_check_status (cairo_font_options_status (options));
+}
+
+cairo_font_options_t *
+rb_cairo_font_options_from_ruby_object (VALUE obj)
+{
+  cairo_font_options_t *options;
+  if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_FontOptions)))
+    {
+      rb_raise (rb_eTypeError, "not a cairo font options");
+    }
+  Data_Get_Struct (obj, cairo_font_options_t, options);
+  return options;
+}
+
+static void
+cr_options_free (void *ptr)
+{
+  if (ptr)
+    {
+      cairo_font_options_destroy ((cairo_font_options_t *) ptr);
+    }
+}
+
+VALUE
+rb_cairo_font_options_to_ruby_object (cairo_font_options_t *options)
+{
+  if (options)
+    {
+      return Data_Wrap_Struct (rb_cCairo_FontOptions, NULL,
+                               cr_options_free, options);
+    }
+  else
+    {
+      return Qnil;
+    }
+}
+
+static VALUE
+cr_options_allocate (VALUE klass)
+{
+  return Data_Wrap_Struct (klass, NULL, cr_options_free, NULL);
+}
+
+static VALUE
+cr_options_create (VALUE self)
+{
+  cairo_font_options_t *options;
+
+  options = cairo_font_options_create ();
+  cr_options_check_status (options);
+  DATA_PTR (self) = options;
+  return Qnil;
+}
+
+static VALUE
+cr_options_copy (VALUE self)
+{
+  cairo_font_options_t *options;
+
+  options = cairo_font_options_copy (_SELF (self));
+  cr_options_check_status (options);
+  return CRFONTOPTIONS2RVAL (options);
+}
+
+static VALUE
+cr_options_merge (VALUE self, VALUE other)
+{
+  cairo_font_options_merge (_SELF (self), _SELF (other));
+  return self;
+}
+
+static VALUE
+cr_options_equal (VALUE self, VALUE other)
+{
+  return cairo_font_options_equal (_SELF (self), _SELF (other)) ? Qtrue : Qfalse;
+}
+
+static VALUE
+cr_options_hash (VALUE self)
+{
+  return INT2NUM (cairo_font_options_hash (_SELF (self)));
+}
+
+static VALUE
+cr_options_set_antialias (VALUE self, VALUE antialias)
+{
+  cairo_font_options_set_antialias (_SELF (self), RVAL2CRANTIALIAS (antialias));
+  return self;
+}
+
+static VALUE
+cr_options_get_antialias (VALUE self)
+{
+  return INT2NUM (cairo_font_options_get_antialias (_SELF (self)));
+}
+
+static VALUE
+cr_options_set_subpixel_order (VALUE self, VALUE subpixel_order)
+{
+  cairo_font_options_set_subpixel_order (_SELF (self),
+                                         RVAL2CRSUBPIXELORDER (subpixel_order));
+  return self;
+}
+
+static VALUE
+cr_options_get_subpixel_order (VALUE self)
+{
+  return INT2NUM (cairo_font_options_get_subpixel_order (_SELF (self)));
+}
+
+static VALUE
+cr_options_set_hint_style (VALUE self, VALUE hint_style)
+{
+  cairo_font_options_set_hint_style (_SELF (self),
+                                     RVAL2CRHINTSTYLE (hint_style));
+  return self;
+}
+
+static VALUE
+cr_options_get_hint_style (VALUE self)
+{
+  return INT2NUM (cairo_font_options_get_hint_style (_SELF (self)));
+}
+
+static VALUE
+cr_options_set_hint_metrics (VALUE self, VALUE hint_metrics)
+{
+  cairo_font_options_set_hint_metrics (_SELF (self),
+                                       RVAL2CRHINTMETRICS (hint_metrics));
+  return self;
+}
+
+static VALUE
+cr_options_get_hint_metrics (VALUE self)
+{
+  return INT2NUM (cairo_font_options_get_hint_metrics (_SELF (self)));
+}
+
+
+void
+Init_cairo_font_options (void)
+{
+  rb_cCairo_FontOptions =
+    rb_define_class_under (rb_mCairo, "FontOptions", rb_cObject);
+
+  rb_define_alloc_func (rb_cCairo_FontOptions, cr_options_allocate);
+  
+  rb_define_method (rb_cCairo_FontOptions, "initialize", cr_options_create, 0);
+
+  rb_define_method (rb_cCairo_FontOptions, "dup", cr_options_copy, 0);
+  rb_define_method (rb_cCairo_FontOptions, "merge", cr_options_merge, 1);
+  rb_define_method (rb_cCairo_FontOptions, "eql?", cr_options_equal, 1);
+  rb_define_method (rb_cCairo_FontOptions, "hash", cr_options_hash, 0);
+  rb_define_method (rb_cCairo_FontOptions, "set_antialias",
+                    cr_options_set_antialias, 1);
+  rb_define_method (rb_cCairo_FontOptions, "antialias",
+                    cr_options_get_antialias, 0);
+  rb_define_method (rb_cCairo_FontOptions, "set_subpixel_order",
+                    cr_options_set_subpixel_order, 1);
+  rb_define_method (rb_cCairo_FontOptions, "subpixel_order",
+                    cr_options_get_subpixel_order, 0);
+  rb_define_method (rb_cCairo_FontOptions, "set_hint_style",
+                    cr_options_set_hint_style, 1);
+  rb_define_method (rb_cCairo_FontOptions, "hint_style",
+                    cr_options_get_hint_style, 0);
+  rb_define_method (rb_cCairo_FontOptions, "set_hint_metrics",
+                    cr_options_set_hint_metrics, 1);
+  rb_define_method (rb_cCairo_FontOptions, "hint_metrics",
+                    cr_options_get_hint_metrics, 0);
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_glyph.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_glyph.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_glyph.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,156 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/10 15:40:26 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+ */
+
+
+#include "rb_cairo.h"
+
+VALUE rb_cCairo_Glyph;
+
+#define _SELF(self)  (RVAL2CRGLYPH(self))
+
+cairo_glyph_t *
+rb_cairo_glyph_from_ruby_object (VALUE obj)
+{
+  cairo_glyph_t *glyph;
+  if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_Glyph)))
+    {
+      rb_raise (rb_eTypeError, "not a cairo glyph");
+    }
+  Data_Get_Struct (obj, cairo_glyph_t, glyph);
+  return glyph;
+}
+
+static void
+cr_glyph_free (void *ptr)
+{
+  if (ptr)
+    {
+      free (ptr);
+    }
+}
+
+VALUE
+rb_cairo_glyph_to_ruby_object (cairo_glyph_t *glyph)
+{
+  if (glyph)
+    {
+      cairo_glyph_t *new_glyph = ALLOC (cairo_glyph_t);
+      *new_glyph = *glyph;
+      return Data_Wrap_Struct (rb_cCairo_Glyph, NULL, cr_glyph_free, new_glyph);
+    }
+  else
+    {
+      return Qnil;
+    }
+}
+
+static VALUE
+cr_glyph_allocate (VALUE klass)
+{
+  return Data_Wrap_Struct (klass, NULL, cr_glyph_free, NULL);
+}
+
+static VALUE
+cr_glyph_initialize (VALUE self, VALUE index, VALUE x, VALUE y)
+{
+  cairo_glyph_t *glyph;
+
+  glyph = ALLOC (cairo_glyph_t);
+  glyph->index = NUM2ULONG (index);
+  glyph->x = NUM2DBL (x);
+  glyph->y = NUM2DBL (y);
+
+  DATA_PTR (self) = glyph;
+  return Qnil;
+}
+
+static VALUE
+cr_glyph_index (VALUE self)
+{
+  return ULONG2NUM (_SELF(self)->index);
+}
+
+static VALUE
+cr_glyph_x (VALUE self)
+{
+  return rb_float_new (_SELF(self)->x);
+}
+
+static VALUE
+cr_glyph_y (VALUE self)
+{
+  return rb_float_new (_SELF(self)->y);
+}
+
+static VALUE
+cr_glyph_set_index (VALUE self, VALUE index)
+{
+  _SELF(self)->index = NUM2ULONG (index);
+  return self;
+}
+
+static VALUE
+cr_glyph_set_x (VALUE self, VALUE x)
+{
+  _SELF(self)->x = NUM2DBL (x);
+  return self;
+}
+
+static VALUE
+cr_glyph_set_y (VALUE self, VALUE y)
+{
+  _SELF(self)->y = NUM2DBL (y);
+  return self;
+}
+
+static VALUE
+cr_glyph_to_s (VALUE self)
+{
+  VALUE ret;
+
+  ret = rb_str_new2 ("#<");
+  rb_str_cat2 (ret, rb_class2name (CLASS_OF (self)));
+  rb_str_cat2 (ret, ": ");
+  rb_str_cat2 (ret, "index=");
+  rb_str_concat (ret, rb_inspect (cr_glyph_index (self)));
+  rb_str_cat2 (ret, ", ");
+  rb_str_cat2 (ret, "x=");
+  rb_str_concat (ret, rb_inspect (cr_glyph_x (self)));
+  rb_str_cat2 (ret, ", ");
+  rb_str_cat2 (ret, "y=");
+  rb_str_concat (ret, rb_inspect (cr_glyph_y (self)));
+  rb_str_cat2 (ret, ">");
+                 
+  return ret;
+}
+
+
+void
+Init_cairo_glyph (void)
+{
+  rb_cCairo_Glyph = rb_define_class_under (rb_mCairo, "Glyph", rb_cObject);
+
+  rb_define_alloc_func (rb_cCairo_Glyph, cr_glyph_allocate);
+
+  rb_define_method (rb_cCairo_Glyph, "initialize", cr_glyph_initialize, 3);
+  
+  rb_define_method (rb_cCairo_Glyph, "index", cr_glyph_index, 0);
+  rb_define_method (rb_cCairo_Glyph, "x", cr_glyph_x, 0);
+  rb_define_method (rb_cCairo_Glyph, "y", cr_glyph_y, 0);
+  rb_define_method (rb_cCairo_Glyph, "set_index", cr_glyph_set_index, 1);
+  rb_define_method (rb_cCairo_Glyph, "set_x", cr_glyph_set_x, 1);
+  rb_define_method (rb_cCairo_Glyph, "set_y", cr_glyph_set_y, 1);
+
+  rb_define_method (rb_cCairo_Glyph, "to_s", cr_glyph_to_s, 0);
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_matrix.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_matrix.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_matrix.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,254 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/10 15:40:26 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+ */
+
+
+#include "rb_cairo.h"
+#include "rb_cairo_private.h"
+
+VALUE rb_cCairo_Matrix;
+
+#define _SELF  (RVAL2CRMATRIX(self))
+
+cairo_matrix_t *
+rb_cairo_matrix_from_ruby_object (VALUE obj)
+{
+  cairo_matrix_t *matrix;
+  if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_Matrix)))
+    {
+      rb_raise (rb_eTypeError, "not a cairo matrix");
+    }
+  Data_Get_Struct (obj, cairo_matrix_t, matrix);
+  return matrix;
+}
+
+static void
+cr_matrix_free (void *ptr)
+{
+  if (ptr)
+    {
+      free ((cairo_matrix_t *) ptr);
+    }
+}
+
+VALUE
+rb_cairo_matrix_to_ruby_object (cairo_matrix_t *matrix)
+{
+  if (matrix)
+    {
+      cairo_matrix_t *new_matrix = ALLOC (cairo_matrix_t);
+      *new_matrix = *matrix;
+      return Data_Wrap_Struct (rb_cCairo_Matrix, NULL,
+                               cr_matrix_free, new_matrix);
+    }
+  else
+    {
+      return Qnil;
+    }
+}  
+
+static VALUE
+cr_matrix_allocate (VALUE klass)
+{
+  return Data_Wrap_Struct (klass, NULL, cr_matrix_free, NULL);
+}
+
+static VALUE
+cr_matrix_initialize (VALUE self,
+                      VALUE xx, VALUE yx,
+                      VALUE xy, VALUE yy,
+                      VALUE x0, VALUE y0)
+{
+  cairo_matrix_t *matrix = ALLOC (cairo_matrix_t);
+
+  cairo_matrix_init (matrix,
+                     NUM2DBL (xx), NUM2DBL (yx),
+                     NUM2DBL (xy), NUM2DBL (yy),
+                     NUM2DBL (x0), NUM2DBL (y0));
+  DATA_PTR (self) = matrix;
+  return Qnil;
+}
+
+static VALUE
+cr_matrix_init_identity (VALUE self)
+{
+  cairo_matrix_t matrix;
+  cairo_matrix_init_identity (&matrix);
+  return CRMATRIX2RVAL (&matrix);
+}
+
+static VALUE
+cr_matrix_init_translate (VALUE self, VALUE tx, VALUE ty)
+{
+  cairo_matrix_t matrix;
+  cairo_matrix_init_translate (&matrix, NUM2DBL (tx), NUM2DBL (ty));
+  return CRMATRIX2RVAL (&matrix);
+}
+
+static VALUE
+cr_matrix_init_scale (VALUE self, VALUE sx, VALUE sy)
+{
+  cairo_matrix_t matrix;
+  cairo_matrix_init_scale (&matrix, NUM2DBL (sx), NUM2DBL (sy));
+  return CRMATRIX2RVAL (&matrix);
+}
+
+static VALUE
+cr_matrix_init_rotate (VALUE self, VALUE radius)
+{
+  cairo_matrix_t matrix;
+  cairo_matrix_init_rotate (&matrix, NUM2DBL (radius));
+  return CRMATRIX2RVAL (&matrix);
+}
+
+static VALUE
+cr_matrix_identity (VALUE self)
+{
+  cairo_matrix_init_identity (_SELF);
+  return self;
+}
+
+static VALUE
+cr_matrix_translate (VALUE self, VALUE tx, VALUE ty)
+{
+  cairo_matrix_translate (_SELF, NUM2DBL (tx), NUM2DBL (ty));
+  return self;
+}
+
+static VALUE
+cr_matrix_scale (VALUE self, VALUE sx, VALUE sy)
+{
+  cairo_matrix_scale (_SELF, NUM2DBL (sx), NUM2DBL (sy));
+  return self;
+}
+
+static VALUE
+cr_matrix_rotate (VALUE self, VALUE radians)
+{
+  cairo_matrix_rotate (_SELF, NUM2DBL (radians));
+  return self;
+}
+
+static VALUE
+cr_matrix_invert (VALUE self)
+{
+  rb_cairo_check_status (cairo_matrix_invert (_SELF));
+  return self;
+}
+
+static VALUE
+cr_matrix_multiply (VALUE self, VALUE other)
+{
+  cairo_matrix_multiply (_SELF, _SELF, RVAL2CRMATRIX (other));
+  return self;
+}
+
+static VALUE
+cr_matrix_transform_distance (VALUE self, VALUE dx, VALUE dy)
+{
+  double pair[2];
+  pair[0] = NUM2DBL (dx);
+  pair[1] = NUM2DBL (dy);
+  cairo_matrix_transform_distance (_SELF, pair, pair + 1);
+  return rb_cairo__float_array (pair, 2);
+}
+
+static VALUE
+cr_matrix_transform_point (VALUE self, VALUE x, VALUE y)
+{
+  double pair[2];
+  pair[0] = NUM2DBL (x);
+  pair[1] = NUM2DBL (y);
+  cairo_matrix_transform_point (_SELF, pair, pair + 1);
+  return rb_cairo__float_array (pair, 2);
+}
+
+
+/* Utilities */
+static VALUE
+cr_matrix_set (VALUE self,
+               VALUE xx, VALUE yx,
+               VALUE xy, VALUE yy,
+               VALUE x0, VALUE y0)
+{
+  cairo_matrix_init (_SELF,
+                     NUM2DBL (xx), NUM2DBL (yx),
+                     NUM2DBL (xy), NUM2DBL (yy),
+                     NUM2DBL (x0), NUM2DBL (y0));
+  return self;
+}
+
+static VALUE
+cr_matrix_to_a (VALUE self)
+{
+  cairo_matrix_t *matrix = _SELF;
+  double affine[6];
+  affine[0] = matrix->xx;
+  affine[1] = matrix->yx;
+  affine[2] = matrix->xy;
+  affine[3] = matrix->yy;
+  affine[4] = matrix->x0;
+  affine[5] = matrix->y0;
+  return rb_cairo__float_array (affine, 6);
+}
+
+static VALUE
+cr_matrix_to_s(VALUE self)
+{
+  VALUE ret;
+
+  ret = rb_str_new2 ("#<");
+  rb_str_cat2 (ret, rb_class2name (CLASS_OF (self)));
+  rb_str_cat2 (ret, ":");
+  rb_str_concat (ret, rb_inspect (cr_matrix_to_a (self)));
+  rb_str_cat2 (ret, ">");
+  
+  return ret;
+}
+
+
+void
+Init_cairo_matrix (void)
+{
+  rb_cCairo_Matrix =
+    rb_define_class_under (rb_mCairo, "Matrix", rb_cObject);
+
+  rb_define_alloc_func (rb_cCairo_Matrix, cr_matrix_allocate);
+
+  rb_define_singleton_method (rb_cCairo_Matrix, "identity",
+                              cr_matrix_init_identity, 0);
+  rb_define_singleton_method (rb_cCairo_Matrix, "translate",
+                              cr_matrix_init_translate, 2);
+  rb_define_singleton_method (rb_cCairo_Matrix, "scale",
+                              cr_matrix_init_scale, 2);
+  rb_define_singleton_method (rb_cCairo_Matrix, "rotate",
+                              cr_matrix_init_rotate, 1);
+  
+  rb_define_method (rb_cCairo_Matrix, "initialize", cr_matrix_initialize, 6);
+  
+  rb_define_method (rb_cCairo_Matrix, "identity!", cr_matrix_identity, 0);
+  rb_define_method (rb_cCairo_Matrix, "translate!", cr_matrix_translate, 2);
+  rb_define_method (rb_cCairo_Matrix, "scale!", cr_matrix_scale, 2);
+  rb_define_method (rb_cCairo_Matrix, "rotate!", cr_matrix_rotate, 1);
+  rb_define_method (rb_cCairo_Matrix, "invert!", cr_matrix_invert, 0);
+  rb_define_method (rb_cCairo_Matrix, "multiply!", cr_matrix_multiply, 1);
+  rb_define_method (rb_cCairo_Matrix, "matrix_distance",
+                    cr_matrix_transform_distance, 2);
+  rb_define_method (rb_cCairo_Matrix, "transform_point",
+                    cr_matrix_transform_point, 2);
+
+  /* Utilities */
+  rb_define_method (rb_cCairo_Matrix, "set", cr_matrix_set, 6);
+  rb_define_method (rb_cCairo_Matrix, "to_a", cr_matrix_to_a, 0);
+  rb_define_method (rb_cCairo_Matrix, "to_s", cr_matrix_to_s, 0);
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_path.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_path.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_path.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,90 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/11 13:23:49 $
+ *
+ * Copyright 2005 Kouhei Sutou <kou at cozmixng.org>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+ */
+
+#include "rb_cairo.h"
+
+#define _SELF(self) (RVAL2CRPATH (self))
+
+VALUE rb_cCairo_Path;
+
+cairo_path_t *
+rb_cairo_path_from_ruby_object (VALUE obj)
+{
+  cairo_path_t *path;
+  if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_Path)))
+    {
+      rb_raise (rb_eTypeError, "not a cairo path");
+    }
+  Data_Get_Struct (obj, cairo_path_t, path);
+  return path;
+}
+
+static void
+cr_path_free (void *ptr)
+{
+  if (ptr)
+    {
+      cairo_path_destroy ((cairo_path_t *) ptr);
+    }
+}
+
+VALUE
+rb_cairo_path_to_ruby_object (cairo_path_t *path)
+{
+  if (path)
+    {
+      return Data_Wrap_Struct (rb_cCairo_Path, NULL, cr_path_free, path);
+    }
+  else
+    {
+      return Qnil;
+    }
+}
+
+static VALUE
+cr_path_each (VALUE self)
+{
+  cairo_path_t *path = _SELF(self);
+  int i, j;
+  
+  for (i = 0; i < path->num_data; i += path->data[i].header.length)
+    {
+      cairo_path_data_t *data = &(path->data[i]);
+      cairo_path_data_type_t type;
+      VALUE points;
+
+      type = RVAL2CRPATHDATATYPE (data->header.type);
+      points = rb_ary_new ();
+
+      for (j = 1; j < data->header.length; j++)
+        {
+          rb_ary_push (points, rb_ary_new3 (2,
+                                            rb_float_new (data[j].point.x),
+                                            rb_float_new (data[j].point.y)));
+        }
+      rb_yield_values (2, type, points);
+    }
+
+  return self;
+}
+
+
+void
+Init_cairo_path (void)
+{
+  rb_cCairo_Path = rb_define_class_under (rb_mCairo, "Path", rb_cObject);
+
+  rb_include_module (rb_cCairo_Path, rb_mEnumerable);
+
+  rb_define_method (rb_cCairo_Path, "each", cr_path_each, 0);
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_pattern.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_pattern.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_pattern.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,362 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/12 15:21:56 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+ */
+
+#include "rb_cairo.h"
+
+VALUE rb_cCairo_Pattern;
+VALUE rb_cCairo_SolidPattern;
+VALUE rb_cCairo_SurfacePattern;
+VALUE rb_cCairo_GradientPattern;
+VALUE rb_cCairo_LinearPattern;
+VALUE rb_cCairo_RadialPattern;
+
+#define _SELF(self)  (RVAL2CRPATTERN(self))
+
+static inline void
+cr_pattern_check_status (cairo_pattern_t *pattern)
+{
+  rb_cairo_check_status (cairo_pattern_status (pattern));
+}
+
+cairo_pattern_t *
+rb_cairo_pattern_from_ruby_object (VALUE obj)
+{
+  cairo_pattern_t *pattern;
+  if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_Pattern)))
+    {
+      rb_raise (rb_eTypeError, "not a cairo pattern");
+    }
+  Data_Get_Struct (obj, cairo_pattern_t, pattern);
+  return pattern;
+}
+
+static void
+cr_pattern_free (void *ptr)
+{
+  if (ptr)
+    {
+      cairo_pattern_destroy ((cairo_pattern_t *) ptr);
+    }
+}
+
+VALUE
+rb_cairo_pattern_to_ruby_object (cairo_pattern_t *pattern, VALUE klass)
+{
+  if (pattern)
+    {
+      cairo_pattern_reference (pattern);
+      return Data_Wrap_Struct (klass, NULL, cr_pattern_free, pattern);
+    }
+  else
+    {
+      return Qnil;
+    }
+}
+
+static VALUE
+cr_pattern_allocate (VALUE klass)
+{
+  return Data_Wrap_Struct (klass, NULL, cr_pattern_free, NULL);
+}
+
+static VALUE
+cr_pattern_initialize (VALUE self)
+{
+  rb_raise (rb_eTypeError, "abstract class");
+  return Qnil;
+}
+
+static VALUE
+cr_solid_pattern_initialize (int argc, VALUE *argv, VALUE self)
+{
+  VALUE red, green, blue, alpha;
+  int n;
+  cairo_pattern_t *pattern;
+
+  n = rb_scan_args (argc, argv, "13", &red, &green, &blue, &alpha);
+  
+  if (n == 1 && rb_obj_is_kind_of (red, rb_cArray) &&
+      (RARRAY (red)->len == 3 || RARRAY (red)->len == 4))
+    {
+      VALUE ary = red;
+      n = RARRAY (ary)->len;
+      
+      red = rb_ary_entry (ary, 0);
+      green = rb_ary_entry (ary, 1);
+      blue = rb_ary_entry (ary, 2);
+      alpha = rb_ary_entry (ary, 3);
+    }
+
+  if (n == 3)
+    {
+      pattern = cairo_pattern_create_rgb (NUM2DBL (red),
+                                          NUM2DBL (green),
+                                          NUM2DBL (blue));
+    }
+  else if (n == 4)
+    {
+      pattern = cairo_pattern_create_rgba (NUM2DBL (red),
+                                           NUM2DBL (green),
+                                           NUM2DBL (blue),
+                                           NUM2DBL (alpha));
+    }
+  else
+    {
+      rb_raise (rb_eArgError,
+                "invalid argument (expect "
+                "(red, green, blue), "
+                "([red, green, blue]), "
+                "(red, green, blue, alpha) or "
+                "([red, green, blue, alpha])"
+                ")");
+    }
+  
+  cr_pattern_check_status (pattern);
+  DATA_PTR (self) = pattern;
+  return Qnil;
+}
+
+static VALUE
+cr_surface_pattern_initialize (VALUE self, VALUE surface)
+{
+  cairo_pattern_t *pattern;
+
+  pattern = cairo_pattern_create_for_surface (RVAL2CRSURFACE (surface));
+  cr_pattern_check_status (pattern);
+  DATA_PTR (self) = pattern;
+  return Qnil;
+}
+
+static VALUE
+cr_linear_pattern_initialize (VALUE self, VALUE x0, VALUE y0,
+                              VALUE x1, VALUE y1)
+{
+  cairo_pattern_t *pattern;
+
+  pattern = cairo_pattern_create_linear (NUM2DBL (x0), NUM2DBL (y0),
+                                         NUM2DBL (x1), NUM2DBL (y1));
+  cr_pattern_check_status (pattern);
+  DATA_PTR (self) = pattern;
+  return Qnil;
+}
+
+static VALUE
+cr_radial_pattern_initialize (VALUE self, VALUE cx0, VALUE cy0, VALUE radius0,
+                              VALUE cx1, VALUE cy1, VALUE radius1)
+{
+  cairo_pattern_t *pattern;
+
+  pattern = cairo_pattern_create_radial (NUM2DBL (cx0), NUM2DBL (cy0),
+                                         NUM2DBL (radius0),
+                                         NUM2DBL (cx1), NUM2DBL (cy1),
+                                         NUM2DBL (radius1));
+  cr_pattern_check_status (pattern);
+  DATA_PTR (self) = pattern;
+  return Qnil;
+}
+
+/* Cairo::GradientPattern */
+static VALUE
+cr_gradient_pattern_add_color_stop_rgb (int argc, VALUE *argv, VALUE self)
+{
+  VALUE offset, red, green, blue;
+  int n;
+  
+  n = rb_scan_args (argc, argv, "22", &offset, &red, &green, &blue);
+
+  if (n == 2 && rb_obj_is_kind_of (red, rb_cArray))
+    {
+      VALUE ary = red;
+      n = RARRAY (ary)->len + 1;
+      
+      red = rb_ary_entry (ary, 0);
+      green = rb_ary_entry (ary, 1);
+      blue = rb_ary_entry (ary, 2);
+    }
+
+  if (n == 4)
+    {
+      cairo_pattern_add_color_stop_rgb (_SELF (self), NUM2DBL (offset),
+                                        NUM2DBL (red), NUM2DBL (green),
+                                        NUM2DBL (blue));
+    }
+  else
+    {
+      VALUE inspected_arg = rb_inspect (rb_ary_new4 (argc, argv));
+      rb_raise (rb_eArgError,
+                "invalid argument: %s (expect "
+                "(offset, red, green, blue) or "
+                "(offset, [red, green, blue])"
+                ")",
+                StringValuePtr (inspected_arg));
+    }
+
+  cr_pattern_check_status (_SELF (self));
+  return self;
+}
+
+static VALUE
+cr_gradient_pattern_add_color_stop_rgba (int argc, VALUE *argv, VALUE self)
+{
+  VALUE offset, red, green, blue, alpha;
+  int n;
+  
+  n = rb_scan_args (argc, argv, "23", &offset, &red, &green, &blue, &alpha);
+
+  if (n == 2 && rb_obj_is_kind_of (red, rb_cArray))
+    {
+      VALUE ary = red;
+      n = RARRAY (ary)->len + 1;
+      
+      red = rb_ary_entry (ary, 0);
+      green = rb_ary_entry (ary, 1);
+      blue = rb_ary_entry (ary, 2);
+      alpha = rb_ary_entry (ary, 3);
+    }
+
+  if (n == 4 || (n == 5 && NIL_P (alpha)))
+    {
+      cairo_pattern_add_color_stop_rgb (_SELF (self), NUM2DBL (offset),
+                                        NUM2DBL (red), NUM2DBL (green),
+                                        NUM2DBL (blue));
+    }
+  else if (n == 5)
+    {
+      cairo_pattern_add_color_stop_rgba (_SELF (self), NUM2DBL (offset),
+                                         NUM2DBL (red), NUM2DBL (green),
+                                         NUM2DBL (blue), NUM2DBL (alpha));
+    }
+  else
+    {
+      VALUE inspected_arg = rb_inspect (rb_ary_new4 (argc, argv));
+      rb_raise (rb_eArgError,
+                "invalid argument: %s (expect "
+                "(offset, red, green, blue), "
+                "(offset, [red, green, blue]), "
+                "(offset, red, green, blue, alpha) or "
+                "(offset, [red, green, blue, alpha])"
+                ")",
+                StringValuePtr (inspected_arg));
+    }
+
+  cr_pattern_check_status (_SELF (self));
+  return self;
+}
+
+
+/* Cairo::Pattern */
+static VALUE
+cr_pattern_set_matrix (VALUE self, VALUE matrix)
+{
+  cairo_pattern_set_matrix (_SELF (self), RVAL2CRMATRIX (matrix));
+  cr_pattern_check_status (_SELF (self));
+  return self;
+}
+
+static VALUE
+cr_pattern_get_matrix (VALUE self)
+{
+  cairo_matrix_t matrix;
+  cairo_pattern_get_matrix (_SELF (self), &matrix);
+  cr_pattern_check_status (_SELF (self));
+  return CRMATRIX2RVAL (&matrix);
+}
+
+/* Cairo::SurfacePattern */
+static VALUE
+cr_surface_pattern_set_extend (VALUE self, VALUE extend)
+{
+  cairo_pattern_set_extend (_SELF (self), RVAL2CREXTEND (extend));
+  cr_pattern_check_status (_SELF (self));
+  return self;
+}
+
+static VALUE
+cr_surface_pattern_get_extend (VALUE self)
+{
+  return INT2NUM (cairo_pattern_get_extend (_SELF (self)));
+}
+
+static VALUE
+cr_surface_pattern_set_filter (VALUE self, VALUE filter)
+{
+  cairo_pattern_set_filter (_SELF (self), RVAL2CRFILTER (filter));
+  cr_pattern_check_status (_SELF (self));
+  return self;
+}
+
+static VALUE
+cr_surface_pattern_get_filter (VALUE self)
+{
+  return INT2NUM (cairo_pattern_get_filter (_SELF (self)));
+}
+
+void
+Init_cairo_pattern (void)
+{
+  rb_cCairo_Pattern =
+    rb_define_class_under (rb_mCairo, "Pattern", rb_cObject);
+
+  rb_define_alloc_func (rb_cCairo_Pattern, cr_pattern_allocate);
+
+  rb_define_method (rb_cCairo_Pattern, "initialize", cr_pattern_initialize, 0);
+  
+  rb_define_method (rb_cCairo_Pattern, "set_matrix", cr_pattern_set_matrix, 1);
+  rb_define_method (rb_cCairo_Pattern, "matrix", cr_pattern_get_matrix, 0);
+  
+  rb_cCairo_SolidPattern =
+    rb_define_class_under (rb_mCairo, "SolidPattern", rb_cCairo_Pattern);
+
+  rb_define_method (rb_cCairo_SolidPattern, "initialize",
+                    cr_solid_pattern_initialize, -1);
+
+  rb_cCairo_SurfacePattern =
+    rb_define_class_under (rb_mCairo, "SurfacePattern", rb_cCairo_Pattern);
+  
+  rb_define_method (rb_cCairo_SurfacePattern, "initialize",
+                    cr_surface_pattern_initialize, 1);
+
+  rb_define_method (rb_cCairo_SurfacePattern, "set_extend",
+                    cr_surface_pattern_set_extend, 1);
+  rb_define_method (rb_cCairo_SurfacePattern, "extend",
+                    cr_surface_pattern_get_extend, 0);
+  rb_define_method (rb_cCairo_SurfacePattern, "set_filter",
+                    cr_surface_pattern_set_filter, 1);
+  rb_define_method (rb_cCairo_SurfacePattern, "filter",
+                    cr_surface_pattern_get_filter, 0);
+
+  rb_cCairo_GradientPattern =
+    rb_define_class_under (rb_mCairo, "GradientPattern", rb_cCairo_Pattern);
+
+  rb_define_method (rb_cCairo_GradientPattern, "add_color_stop_rgb",
+                    cr_gradient_pattern_add_color_stop_rgb, -1);
+  rb_define_method (rb_cCairo_GradientPattern, "add_color_stop_rgba",
+                    cr_gradient_pattern_add_color_stop_rgba, -1);
+  rb_define_alias (rb_cCairo_GradientPattern,
+                   "add_color_stop", "add_color_stop_rgba");
+
+  rb_cCairo_LinearPattern =
+    rb_define_class_under (rb_mCairo, "LinearPattern",
+                           rb_cCairo_GradientPattern);
+
+  rb_define_method (rb_cCairo_LinearPattern, "initialize",
+                    cr_linear_pattern_initialize, 4);
+
+  rb_cCairo_RadialPattern =
+    rb_define_class_under (rb_mCairo, "RadialPattern",
+                           rb_cCairo_GradientPattern);
+
+  rb_define_method (rb_cCairo_RadialPattern, "initialize",
+                    cr_radial_pattern_initialize, 6);
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_private.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_private.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_private.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,51 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/10 15:40:26 $
+ *
+ * Copyright 2005 Kouhei Sutou <kou at cozmixng.org>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+*/
+
+#include "rb_cairo.h"
+
+VALUE
+rb_cairo__float_array (double *values, unsigned count)
+{
+  VALUE result;
+  int i;
+
+  result = rb_ary_new2 (count);
+  for (i = 0; i < count; i++)
+    {
+      rb_ary_push (result, rb_float_new (values[i]));
+    }
+  return result;
+}
+
+void
+rb_cairo__glyphs_to_array (VALUE rb_array, cairo_glyph_t **glyphs, int *length)
+{
+  int i;
+  
+  if (!rb_obj_is_kind_of (rb_array, rb_cArray))
+     rb_raise (rb_eTypeError, "expected array");
+
+  *length = RARRAY(rb_array)->len;
+  *glyphs = ALLOCA_N (cairo_glyph_t, *length);
+
+  if (!*glyphs)
+    rb_cairo_check_status (CAIRO_STATUS_NO_MEMORY);
+
+  for (i = 0; i < *length; i++)
+    {
+      memcpy ((char *) &(*glyphs)[i],
+              (char *) RVAL2CRGLYPH (rb_ary_entry (rb_array, i)),
+              sizeof (cairo_glyph_t));
+    }
+}
+

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_private.h
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_private.h	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_private.h	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,20 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/10 15:40:26 $
+ *
+ * Copyright 2005 Kouhei Sutou <kou at cozmixng.org>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+*/
+
+#ifndef RB_CAIRO_PRIVATE_H
+#define RB_CAIRO_PRIVATE_H
+
+VALUE rb_cairo__float_array (double *values, unsigned count);
+void rb_cairo__glyphs_to_array (VALUE rb_array, cairo_glyph_t **glyphs, int *length);
+
+#endif

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_scaled_font.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_scaled_font.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_scaled_font.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,122 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/10 15:40:26 $
+ *
+ * Copyright 2005 Kouhei Sutou <kou at cozmixng.org>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+*/
+
+
+#include "rb_cairo.h"
+#include "rb_cairo_private.h"
+
+VALUE rb_cCairo_ScaledFont;
+
+#define _SELF(self)  (RVAL2CRSCALEDFONT(self))
+
+static inline void
+cr_scaled_font_check_status (cairo_scaled_font_t *font)
+{
+  rb_cairo_check_status (cairo_scaled_font_status (font));
+}
+
+cairo_scaled_font_t *
+rb_cairo_scaled_font_from_ruby_object (VALUE obj)
+{
+  cairo_scaled_font_t *font;
+  if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_ScaledFont)))
+    {
+      rb_raise (rb_eTypeError, "not a cairo scaled font");
+    }
+  Data_Get_Struct (obj, cairo_scaled_font_t, font);
+  return font;
+}
+
+static void
+cr_scaled_font_free (void *ptr)
+{
+  if (ptr)
+    {
+      cairo_scaled_font_destroy ((cairo_scaled_font_t *) ptr);
+    }
+}
+
+VALUE
+rb_cairo_scaled_font_to_ruby_object (cairo_scaled_font_t *font)
+{
+  if (font)
+    {
+      cairo_scaled_font_reference (font);
+      return Data_Wrap_Struct (rb_cCairo_FontFace, NULL,
+                               cr_scaled_font_free, font);
+    }
+  else
+    {
+      return Qnil;
+    }
+}
+
+static VALUE
+cr_scaled_font_allocate (VALUE klass)
+{
+  return Data_Wrap_Struct (klass, NULL, cr_scaled_font_free, NULL);
+}
+
+static VALUE
+cr_scaled_font_initialize (VALUE self, VALUE face, VALUE matrix,
+                           VALUE ctm, VALUE options)
+{
+  cairo_scaled_font_t *font;
+
+  font = cairo_scaled_font_create (RVAL2CRFONTFACE (face),
+                                   RVAL2CRMATRIX (matrix),
+                                   RVAL2CRMATRIX (ctm),
+                                   RVAL2CRFONTOPTIONS (options));
+  cr_scaled_font_check_status (font);
+  DATA_PTR (self) = font;
+  return Qnil;
+}
+
+static VALUE
+cr_scaled_font_extents (VALUE self)
+{
+  cairo_font_extents_t extents;
+  cairo_scaled_font_extents (_SELF (self), &extents);
+  cr_scaled_font_check_status (_SELF (self));
+  return CRFONTEXTENTS2RVAL (&extents);
+}
+
+static VALUE
+cr_scaled_font_glyph_extents (VALUE self, VALUE rb_glyphs)
+{
+  cairo_text_extents_t extents;
+  cairo_glyph_t *glyphs;
+  int count;
+
+  rb_cairo__glyphs_to_array (rb_glyphs, &glyphs, &count);
+  cairo_scaled_font_glyph_extents (_SELF (self), glyphs, count, &extents);
+  cr_scaled_font_check_status (_SELF (self));
+  return CRTEXTEXTENTS2RVAL (&extents);
+}
+
+void
+Init_cairo_scaled_font (void)
+{
+  rb_cCairo_ScaledFont =
+    rb_define_class_under (rb_mCairo, "ScaledFont", rb_cObject);
+
+  rb_define_alloc_func (rb_cCairo_ScaledFont, cr_scaled_font_allocate);
+
+  rb_define_method (rb_cCairo_ScaledFont, "initialize",
+                    cr_scaled_font_initialize, 4);
+
+  rb_define_method (rb_cCairo_ScaledFont, "extents",
+                    cr_scaled_font_extents, 0);
+  rb_define_method (rb_cCairo_ScaledFont, "glyph_extents",
+                    cr_scaled_font_glyph_extents, 1);
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_surface.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_surface.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_surface.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,684 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/15 14:33:46 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+ */
+
+#include "rb_cairo.h"
+#include "rubyio.h"
+
+#if CAIRO_HAS_PS_SURFACE
+#include <cairo-ps.h>
+#endif
+
+#if CAIRO_HAS_PDF_SURFACE
+#include <cairo-pdf.h>
+#endif
+
+
+VALUE rb_cCairo_Surface;
+VALUE rb_cCairo_ImageSurface;
+VALUE rb_cCairo_PDFSurface;
+VALUE rb_cCairo_PSSurface;
+
+static ID cr_id_read;
+static ID cr_id_write;
+static ID cr_id_holder;
+static ID cr_id_closed;
+static ID cr_id_closure;
+static cairo_user_data_key_t cr_klass_key;
+static cairo_user_data_key_t cr_closure_key;
+
+#define _SELF  (RVAL2CRSURFACE(self))
+
+#define CR_TRUE 1
+#define CR_FALSE 0
+
+static inline void
+cr_surface_check_status (cairo_surface_t *surface)
+{
+  rb_cairo_check_status (cairo_surface_status (surface));
+}
+
+static void
+cr_surface_set_klass (cairo_surface_t *surface, VALUE klass)
+{
+  cairo_status_t status;
+  status = cairo_surface_set_user_data (surface, &cr_klass_key,
+                                        (void *)klass, NULL);
+  rb_cairo_check_status (status);
+}
+
+static VALUE
+cr_surface_get_klass (cairo_surface_t *surface)
+{
+  VALUE klass = (VALUE)cairo_surface_get_user_data (surface, &cr_klass_key);
+  if (!klass)
+    {
+      rb_raise (rb_eArgError, "[BUG] uninitialized surface for Ruby");
+    }
+  return klass;
+}
+
+/* read/write callback */
+typedef struct cr_io_callback_closure {
+  VALUE target;
+  VALUE error;
+  VALUE klass;
+  unsigned char *data;
+  unsigned int length;
+  cairo_bool_t is_file;
+} cr_io_callback_closure_t;
+
+static VALUE
+cr_closure_target_push (VALUE klass, VALUE obj)
+{
+  VALUE holder, key, objs;
+  
+  holder = rb_ivar_get (klass, cr_id_holder);
+  key = rb_obj_id (obj);
+  objs = rb_hash_aref (holder, key);
+
+  if (NIL_P (objs))
+    {
+      objs = rb_ary_new ();
+      rb_hash_aset (holder, key, objs);
+    }
+
+  rb_ary_push(objs, obj);
+
+  return Qnil;
+}
+
+static VALUE
+cr_closure_target_pop(VALUE klass, VALUE obj)
+{
+  VALUE holder, key, objs;
+  VALUE result = Qnil;
+
+  holder = rb_ivar_get (klass, cr_id_holder);
+  key = rb_obj_id (obj);
+  objs = rb_hash_aref (holder, key);
+
+  if (!NIL_P (objs))
+    {
+      result = rb_ary_pop (objs);
+      if (RARRAY (objs)->len == 0)
+        {
+          rb_hash_delete (holder, key);
+        }
+    }
+
+  return result;
+}
+
+static cr_io_callback_closure_t *
+cr_closure_new (VALUE target, cairo_bool_t is_file)
+{
+  cr_io_callback_closure_t *closure;
+  closure = ALLOC (cr_io_callback_closure_t);
+
+  closure->target = target;
+  closure->error = Qnil;
+  closure->is_file = is_file;
+  
+  return closure;
+}
+
+static void
+cr_closure_destroy (cr_io_callback_closure_t *closure)
+{
+  if (closure->is_file)
+    cr_closure_target_pop (closure->klass, closure->target);
+
+  free (closure);
+}
+
+static void
+cr_closure_free (void *closure)
+{
+  cr_closure_destroy ((cr_io_callback_closure_t *) closure);
+}
+
+static VALUE
+cr_surface_io_func_rescue (VALUE io_closure)
+{
+  cr_io_callback_closure_t *closure;
+  closure = (cr_io_callback_closure_t *)io_closure;
+  closure->error = ruby_errinfo;
+  return Qnil;
+}
+
+/* write callback */
+static VALUE
+cr_surface_write_func_invoke (VALUE write_closure)
+{
+  VALUE output, data;
+  long written_bytes;
+  cr_io_callback_closure_t *closure;
+  unsigned int length;
+
+  closure = (cr_io_callback_closure_t *)write_closure;
+  
+  output = closure->target;
+  data = rb_str_new ((const char *)closure->data, closure->length);
+
+  length = RSTRING (data)->len;
+  while (length != 0)
+    {
+      VALUE rb_written_bytes = rb_funcall (output, cr_id_write, 1, data);
+      written_bytes = NUM2LONG (rb_written_bytes);
+      data = rb_str_substr (data, written_bytes,
+                            RSTRING (data)->len - written_bytes);
+      length -= written_bytes;
+    }
+  
+  return Qnil;
+}
+
+static cairo_status_t
+cr_surface_write_func (void *write_closure,
+                       const unsigned char *data, unsigned int length)
+{
+  cr_io_callback_closure_t *closure;
+
+  closure = (cr_io_callback_closure_t *)write_closure;
+  closure->data = (unsigned char *)data;
+  closure->length = length;
+  
+  rb_rescue2 (cr_surface_write_func_invoke, (VALUE) closure,
+              cr_surface_io_func_rescue, (VALUE) closure, rb_eException,
+              (VALUE)0);
+  
+  if (NIL_P (closure->error))
+    return CAIRO_STATUS_SUCCESS;
+  else
+    return CAIRO_STATUS_WRITE_ERROR;
+}
+
+/* read callback */
+static VALUE
+cr_surface_read_func_invoke (VALUE read_closure)
+{
+  VALUE input, result;
+  cr_io_callback_closure_t *closure;
+  unsigned int length, rest;
+
+  closure = (cr_io_callback_closure_t *)read_closure;
+  input = closure->target;
+  length = closure->length;
+  
+  result = rb_str_new2 ("");
+
+  for (rest = length; rest != 0; rest = length - RSTRING (result)->len)
+    {
+      rb_str_concat (result, rb_funcall (input, cr_id_read, 1, INT2NUM (rest)));
+    }
+
+  memcpy ((void *)closure->data, (const void *)StringValuePtr (result), length);
+
+  return Qnil;
+}
+
+static cairo_status_t
+cr_surface_read_func (void *read_closure,
+                      unsigned char *data, unsigned int length)
+{
+  cr_io_callback_closure_t *closure;
+
+  closure = (cr_io_callback_closure_t *)read_closure;
+  closure->data = data;
+  closure->length = length;
+  rb_rescue2 (cr_surface_read_func_invoke, (VALUE) closure,
+              cr_surface_io_func_rescue, (VALUE) closure, rb_eException,
+              (VALUE)0);
+  
+  if (NIL_P (closure->error))
+    return CAIRO_STATUS_SUCCESS;
+  else
+    return CAIRO_STATUS_READ_ERROR;
+}
+
+/* constructor/de-constructor */
+cairo_surface_t *
+rb_cairo_surface_from_ruby_object (VALUE obj)
+{
+  cairo_surface_t *surface;
+  if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_Surface)))
+    {
+      rb_raise (rb_eTypeError, "not a cairo surface");
+    }
+  Data_Get_Struct (obj, cairo_surface_t, surface);
+  cr_surface_set_klass (surface, rb_obj_class (obj));
+  return surface;
+}
+
+static void
+cr_surface_free (void *ptr)
+{
+  if (ptr)
+    {
+      cairo_surface_destroy ((cairo_surface_t *) ptr);
+    }
+}
+
+VALUE
+rb_cairo_surface_to_ruby_object (cairo_surface_t *surface)
+{
+  if (surface)
+    {
+      VALUE klass = cr_surface_get_klass (surface);
+      cairo_surface_reference (surface);
+      return Data_Wrap_Struct (klass, NULL, cr_surface_free, surface);
+    }
+  else
+    {
+      return Qnil;
+    }
+}
+
+static VALUE
+cr_surface_allocate (VALUE klass)
+{
+  return Data_Wrap_Struct (klass, NULL, cr_surface_free, NULL);
+}
+
+/* Surface manipulation */
+static VALUE
+cr_surface_create_similar (VALUE self, VALUE content,
+                           VALUE width, VALUE height)
+{
+  cairo_surface_t *surface;
+
+  surface = cairo_surface_create_similar (RVAL2CRSURFACE (self),
+                                          RVAL2CRCONTENT (content),
+                                          NUM2INT (width), NUM2INT (height));
+  cr_surface_check_status (surface);
+  cr_surface_set_klass (surface, rb_obj_class (self));
+  return CRSURFACE2RVAL (surface);
+}
+
+static VALUE
+cr_surface_finish (VALUE self)
+{
+  cr_io_callback_closure_t *closure;
+  closure = cairo_surface_get_user_data (_SELF, &cr_closure_key);
+  
+  cairo_surface_finish (_SELF);
+
+  if (closure && closure->is_file)
+    {
+      VALUE file;
+      file = closure->target;
+      if (!RTEST (rb_funcall (file, cr_id_closed, 0)))
+        rb_io_close (file);
+    }
+  
+  if (closure && !NIL_P (closure->error))
+    rb_exc_raise (closure->error);
+  
+  cr_surface_check_status (_SELF);
+  return self;
+}
+
+#if CAIRO_HAS_PNG_FUNCTIONS
+static VALUE
+cr_image_surface_write_to_png_stream (VALUE self, VALUE target)
+{
+  cairo_status_t status;
+  cr_io_callback_closure_t closure;
+
+  closure.target = target;
+  closure.error = Qnil;
+  closure.is_file = CR_FALSE;
+
+  status = cairo_surface_write_to_png_stream (_SELF, cr_surface_write_func,
+                                              (void *)&closure);
+  if (!NIL_P (closure.error))
+    rb_exc_raise (closure.error);
+
+  rb_cairo_check_status (status);
+  return self;
+}
+
+static VALUE
+cr_image_surface_write_to_png_stream_invoke (VALUE info)
+{
+  return cr_image_surface_write_to_png_stream (rb_ary_entry (info, 0),
+                                               rb_ary_entry (info, 1));
+}
+
+static VALUE
+cr_image_surface_write_to_png (VALUE self, VALUE filename)
+{
+  VALUE info, file;
+
+  file = rb_file_open (StringValuePtr (filename), "wb");
+  info = rb_ary_new3 (2, self, file);
+  return rb_ensure (cr_image_surface_write_to_png_stream_invoke, info,
+                    rb_io_close, file);
+}
+
+static VALUE
+cr_image_surface_write_to_png_generic (VALUE self, VALUE target)
+{
+  if (rb_respond_to (target, cr_id_write))
+    return cr_image_surface_write_to_png_stream (self, target);
+  else
+    return cr_image_surface_write_to_png (self, target);
+}
+#endif
+
+static VALUE
+cr_surface_get_font_options (VALUE self)
+{
+  cairo_font_options_t *options = NULL;
+  cairo_surface_get_font_options (_SELF, options);
+  cr_surface_check_status (_SELF);
+  options = cairo_font_options_copy (options);
+  rb_cairo_check_status (cairo_font_options_status (options));
+  return CRFONTOPTIONS2RVAL (options);
+}
+
+static VALUE
+cr_surface_flush (VALUE self)
+{
+  cairo_surface_flush (_SELF);
+  cr_surface_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_surface_mark_dirty (int argc, VALUE *argv, VALUE self)
+{
+  VALUE x, y, width, height;
+  int n;
+  
+  n = rb_scan_args (argc, argv, "04", &x, &y, &width, &height);
+
+  if (n == 0)
+    {
+      cairo_surface_mark_dirty (_SELF);
+    }
+  else if (n == 4)
+    {
+      cairo_surface_mark_dirty_rectangle (_SELF,
+                                          NUM2INT (x), NUM2INT (y),
+                                          NUM2INT (width), NUM2INT (height));
+    }
+  else
+    {
+      rb_raise (rb_eArgError,
+                "invalid argument (expect () or (x, y, width, height))");
+    }
+
+  cr_surface_check_status (_SELF);
+  return self;
+}
+
+static VALUE
+cr_surface_set_device_offset (VALUE self, VALUE x_offset, VALUE y_offset)
+{
+  cairo_surface_set_device_offset (_SELF,
+                                   NUM2DBL (x_offset),
+                                   NUM2DBL (y_offset));
+  cr_surface_check_status (_SELF);
+  return self;
+}
+
+
+/* Image-surface functions */
+#if CAIRO_HAS_PNG_FUNCTIONS
+static VALUE
+cr_image_surface_create_from_png_stream (VALUE target)
+{
+  cr_io_callback_closure_t closure;
+  cairo_surface_t *surface;
+
+  closure.target = target;
+  closure.error = Qnil;
+  closure.is_file = CR_FALSE;
+  
+  surface = cairo_image_surface_create_from_png_stream (cr_surface_read_func,
+                                                        (void *)&closure);
+  if (!NIL_P (closure.error))
+    rb_exc_raise (closure.error);
+  
+  return (VALUE)surface;
+}
+
+static VALUE
+cr_image_surface_create_from_png (VALUE filename)
+{
+  VALUE file;
+  file = rb_file_open (StringValuePtr (filename), "rb");
+  
+  return rb_ensure (cr_image_surface_create_from_png_stream, file,
+                    rb_io_close, file);
+}
+
+static VALUE
+cr_image_surface_create_from_png_generic (VALUE klass, VALUE target)
+{
+  VALUE rb_surface;
+  cairo_surface_t *surface;
+  if (rb_respond_to (target, cr_id_read))
+    surface = (cairo_surface_t *)cr_image_surface_create_from_png_stream (target);
+  else
+    surface = (cairo_surface_t *)cr_image_surface_create_from_png (target);
+
+  cr_surface_check_status (surface);
+  cr_surface_set_klass (surface, klass);
+  rb_surface = cr_surface_allocate (klass);
+  DATA_PTR (rb_surface) = surface;
+  return rb_surface;
+}
+#endif
+
+
+static cairo_surface_t *
+cr_image_surface_create (VALUE self, VALUE format, VALUE width, VALUE height)
+{
+  return cairo_image_surface_create (RVAL2CRFORMAT (format),
+                                     NUM2INT (width),
+                                     NUM2INT (height));
+}
+
+static cairo_surface_t *
+cr_image_surface_create_for_data (VALUE self, VALUE rb_data, VALUE format,
+                                  VALUE width, VALUE height, VALUE stride)
+{
+  unsigned char *data;
+
+  data = (unsigned char *)StringValuePtr (rb_data);
+  
+  return cairo_image_surface_create_for_data (data,
+                                              RVAL2CRFORMAT (format),
+                                              NUM2INT (width),
+                                              NUM2INT (height),
+                                              NUM2INT (stride));
+}
+
+static VALUE
+cr_image_surface_initialize (int argc, VALUE *argv, VALUE self)
+{
+  cairo_surface_t *surface;
+  VALUE arg1, arg2, arg3, arg4, arg5;
+  int n;
+  
+  n = rb_scan_args (argc, argv, "32", &arg1, &arg2, &arg3, &arg4, &arg5);
+
+  if (n == 3)
+    surface = cr_image_surface_create (self, arg1, arg2, arg3);
+  else if (n == 5)
+    surface =
+      cr_image_surface_create_for_data (self, arg1, arg2, arg3, arg4, arg5);
+  else
+    rb_raise (rb_eArgError,
+              "invalid argument (expect "
+              "(format, width, height) or "
+              "(data, format, width, height, stride))");
+
+  cr_surface_check_status (surface);
+  DATA_PTR (self) = surface;
+  return Qnil;
+}
+
+static VALUE
+cr_image_surface_get_width (VALUE self)
+{
+  return INT2NUM (cairo_image_surface_get_width (_SELF));
+}
+
+static VALUE
+cr_image_surface_get_height (VALUE self)
+{
+  return INT2NUM (cairo_image_surface_get_height (_SELF));
+}
+
+
+#define DEFINE_SURFACE(type)                                              \
+static VALUE                                                              \
+cr_ ## type ## _surface_initialize (VALUE self, VALUE target,             \
+                                    VALUE rb_width_in_points,             \
+                                    VALUE rb_height_in_points)            \
+{                                                                         \
+  cr_io_callback_closure_t *closure;                                      \
+  cairo_surface_t *surface;                                               \
+  double width_in_points, height_in_points;                               \
+                                                                          \
+  if (rb_respond_to (target, cr_id_write))                                \
+    {                                                                     \
+      closure = cr_closure_new (target, CR_FALSE);                        \
+    }                                                                     \
+  else                                                                    \
+    {                                                                     \
+      VALUE file;                                                         \
+      file = rb_file_open (StringValuePtr (target), "wb");                \
+      closure = cr_closure_new (file, CR_TRUE);                           \
+      closure->klass = rb_obj_class (self);                               \
+      cr_closure_target_push (closure->klass, closure->target);           \
+    }                                                                     \
+                                                                          \
+  width_in_points = NUM2DBL (rb_width_in_points);                         \
+  height_in_points = NUM2DBL (rb_height_in_points);                       \
+  surface =                                                               \
+    cairo_ ## type ## _surface_create_for_stream (cr_surface_write_func,  \
+                                                  (void *) closure,       \
+                                                  width_in_points,        \
+                                                  height_in_points);      \
+                                                                          \
+  if (cairo_surface_status (surface))                                     \
+    cr_closure_destroy (closure);                                         \
+  else                                                                    \
+    cairo_surface_set_user_data (surface, &cr_closure_key,                \
+                                 closure, cr_closure_free);               \
+                                                                          \
+  cr_surface_check_status (surface);                                      \
+  DATA_PTR (self) = surface;                                              \
+  return Qnil;                                                            \
+}                                                                         \
+                                                                          \
+static VALUE                                                              \
+cr_ ## type ## _surface_set_dpi (VALUE self, VALUE x_dpi, VALUE y_dpi)    \
+{                                                                         \
+  cairo_ ## type ## _surface_set_dpi (_SELF,                              \
+                                      NUM2DBL (x_dpi),                    \
+                                      NUM2DBL (y_dpi));                   \
+  cr_surface_check_status (_SELF);                                        \
+  return self;                                                            \
+}
+
+#if CAIRO_HAS_PS_SURFACE
+/* PS-surface functions */
+DEFINE_SURFACE(ps)
+#endif
+
+#if CAIRO_HAS_PDF_SURFACE
+/* PDF-surface functions */
+DEFINE_SURFACE(pdf)
+#endif
+
+void
+Init_cairo_surface (void)
+{
+  cr_id_read = rb_intern ("read");
+  cr_id_write = rb_intern ("write");
+  cr_id_closed = rb_intern ("closed?");
+  cr_id_closure = rb_intern ("closure");
+  cr_id_holder = rb_intern ("holder");
+  
+  rb_cCairo_Surface =
+    rb_define_class_under (rb_mCairo, "Surface", rb_cObject);
+
+  rb_define_alloc_func (rb_cCairo_Surface, cr_surface_allocate);
+  
+  rb_define_method (rb_cCairo_Surface, "create_similar",
+                    cr_surface_create_similar, 3);
+  rb_define_method (rb_cCairo_Surface, "finish", cr_surface_finish, 0);
+  
+  rb_define_method (rb_cCairo_Surface, "font_options",
+                    cr_surface_get_font_options, 0);
+  rb_define_method (rb_cCairo_Surface, "flush", cr_surface_flush, 0);
+  rb_define_method (rb_cCairo_Surface, "mark_dirty", cr_surface_mark_dirty, 0);
+  rb_define_method (rb_cCairo_Surface, "set_device_offset",
+                    cr_surface_set_device_offset, 2);
+
+  /* Image-surface */
+  rb_cCairo_ImageSurface =
+    rb_define_class_under (rb_mCairo, "ImageSurface", rb_cCairo_Surface);
+  
+#if CAIRO_HAS_PNG_FUNCTIONS
+  rb_define_singleton_method (rb_cCairo_ImageSurface, "from_png",
+                              cr_image_surface_create_from_png_generic, 1);
+#endif
+  
+  rb_define_method (rb_cCairo_ImageSurface, "initialize",
+                    cr_image_surface_initialize, -1);
+
+  rb_define_method (rb_cCairo_ImageSurface, "width",
+                    cr_image_surface_get_width, 0);
+  rb_define_method (rb_cCairo_ImageSurface, "height",
+                    cr_image_surface_get_height, 0);
+  
+#if CAIRO_HAS_PNG_FUNCTIONS
+  rb_define_method (rb_cCairo_ImageSurface, "write_to_png",
+                    cr_image_surface_write_to_png_generic, 1);
+#endif
+
+
+#define INIT_SURFACE(type, name)                                        \
+  rb_cCairo_ ## name ## Surface =                                       \
+    rb_define_class_under (rb_mCairo, # name "Surface",                 \
+                           rb_cCairo_Surface);                          \
+                                                                        \
+  rb_ivar_set (rb_cCairo_ ## name ## Surface,                           \
+               cr_id_holder, rb_hash_new ());                           \
+                                                                        \
+  rb_define_method (rb_cCairo_ ## name ## Surface, "initialize",        \
+                    cr_ ## type ## _surface_initialize, 3);             \
+  rb_define_method (rb_cCairo_ ## name ## Surface, "set_dpi",           \
+                    cr_ ## type ## _surface_set_dpi, 2);
+
+#if CAIRO_HAS_PS_SURFACE
+  /* PS-surface */
+  INIT_SURFACE(ps, PS)
+#else
+  rb_cCairo_PSSurface = Qnil;
+#endif
+
+#if CAIRO_HAS_PDF_SURFACE
+  /* PDF-surface */
+  INIT_SURFACE(pdf, PDF)
+#else
+  rb_cCairo_PDFSurface = Qnil;
+#endif
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_text_extents.c
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_text_extents.c	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/ext/rb_cairo_text_extents.c	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,137 @@
+/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
+/*
+ * Ruby Cairo Binding
+ *
+ * $Author: kou $
+ * $Date: 2005/10/10 15:40:26 $
+ *
+ * Copyright 2005 Øyvind Kolås <pippin at freedesktop.org>
+ * Copyright 2004-2005 MenTaLguY <mental at rydia.com>
+ *
+ * This file is made available under the same terms as Ruby
+ *
+ */
+
+#include "rb_cairo.h"
+
+VALUE rb_cCairo_TextExtents;
+
+#define _SELF(self)  (RVAL2CRTEXTEXTENTS(self))
+
+cairo_text_extents_t *
+rb_cairo_text_extents_from_ruby_object (VALUE obj)
+{
+  cairo_text_extents_t *extents;
+  if (!RTEST (rb_obj_is_kind_of (obj, rb_cCairo_TextExtents)))
+    {
+      rb_raise (rb_eTypeError, "not a cairo text_extents");
+    }
+  Data_Get_Struct (obj, cairo_text_extents_t, extents);
+  return extents;
+}
+
+VALUE
+rb_cairo_text_extents_to_ruby_object (cairo_text_extents_t *extents)
+{
+  if (extents)
+    {
+      cairo_text_extents_t *new_extents = ALLOC (cairo_text_extents_t);
+      *new_extents = *extents;
+      return Data_Wrap_Struct (rb_cCairo_TextExtents, NULL, -1, new_extents);
+    }
+  else
+    {
+      return Qnil;
+    }
+}
+
+
+static VALUE
+cr_text_extents_x_bearing (VALUE self)
+{
+  return rb_float_new (_SELF(self)->x_bearing);
+}
+
+static VALUE
+cr_text_extents_y_bearing (VALUE self)
+{
+  return rb_float_new (_SELF(self)->y_bearing);
+}
+
+static VALUE
+cr_text_extents_width (VALUE self)
+{
+  return rb_float_new (_SELF(self)->width);
+}
+
+static VALUE
+cr_text_extents_height (VALUE self)
+{
+  return rb_float_new (_SELF(self)->height);
+}
+
+static VALUE
+cr_text_extents_x_advance (VALUE self)
+{
+  return rb_float_new (_SELF(self)->x_advance);
+}
+
+static VALUE
+cr_text_extents_y_advance (VALUE self)
+{
+  return rb_float_new (_SELF(self)->y_advance);
+}
+
+static VALUE
+cr_text_extents_to_s (VALUE self)
+{
+  VALUE ret;
+
+  ret = rb_str_new2 ("#<");
+  rb_str_cat2 (ret, rb_class2name (CLASS_OF (self)));
+  rb_str_cat2 (ret, ": ");
+  rb_str_cat2 (ret, "x_bearing=");
+  rb_str_concat (ret, rb_inspect (cr_text_extents_x_bearing (self)));
+  rb_str_cat2 (ret, ", ");
+  rb_str_cat2 (ret, "y_bearing=");
+  rb_str_concat (ret, rb_inspect (cr_text_extents_y_bearing (self)));
+  rb_str_cat2 (ret, ", ");
+  rb_str_cat2 (ret, "width=");
+  rb_str_concat (ret, rb_inspect (cr_text_extents_width (self)));
+  rb_str_cat2 (ret, ", ");
+  rb_str_cat2 (ret, "height=");
+  rb_str_concat (ret, rb_inspect (cr_text_extents_height (self)));
+  rb_str_cat2 (ret, ", ");
+  rb_str_cat2 (ret, "x_advance=");
+  rb_str_concat (ret, rb_inspect (cr_text_extents_x_advance (self)));
+  rb_str_cat2 (ret, ", ");
+  rb_str_cat2 (ret, "y_advance=");
+  rb_str_concat (ret, rb_inspect (cr_text_extents_y_advance (self)));
+  rb_str_cat2 (ret, ">");
+                 
+  return ret;
+}
+
+
+void
+Init_cairo_text_extents (void)
+{
+  rb_cCairo_TextExtents =
+    rb_define_class_under (rb_mCairo, "TextExtents", rb_cObject);
+
+  rb_define_method (rb_cCairo_TextExtents, "x_bearing",
+                    cr_text_extents_x_bearing, 0);
+  rb_define_method (rb_cCairo_TextExtents, "y_bearing",
+                    cr_text_extents_y_bearing, 0);
+  rb_define_method (rb_cCairo_TextExtents, "width",
+                    cr_text_extents_width, 0);
+  rb_define_method (rb_cCairo_TextExtents, "height",
+                    cr_text_extents_height, 0);
+  rb_define_method (rb_cCairo_TextExtents, "x_advance",
+                    cr_text_extents_x_advance, 0);
+  rb_define_method (rb_cCairo_TextExtents, "y_advance",
+                    cr_text_extents_y_advance, 0);
+
+  rb_define_method (rb_cCairo_TextExtents, "to_s",
+                    cr_text_extents_to_s, 0);
+}

Added: packages/libcairo-ruby/trunk/packages/cairo/lib/cairo.rb
===================================================================
--- packages/libcairo-ruby/trunk/packages/cairo/lib/cairo.rb	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/packages/cairo/lib/cairo.rb	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,89 @@
+# vim: filetype=ruby:expandtab:shiftwidth=2:tabstop=8:softtabstop=2 :
+
+require 'cairo.so' 
+
+module Cairo
+
+  BINDINGS_VERSION = [1, 0, 0, "beta"]
+
+  module_function
+  def bindings_version
+    major, minor, micro, tag = BINDINGS_VERSION
+    version = [major, minor, micro].join('.')
+    version << "-#{tag}" if tag
+    version
+  end
+  
+  def __add_one_arg_setter(klass)
+    names = klass.instance_methods(false)
+    names.each do |name|
+      if /^set_(.*)/ =~ name and
+        not names.include? "#{$1}=" and
+        klass.instance_method(name).arity == 1
+        klass.module_eval("def #{$1}=(val); set_#{$1}(val); val; end")
+      end
+    end
+  end
+
+  class Context
+    Cairo.__add_one_arg_setter(self)
+
+    def quad_to(x1, y1, x2, y2)
+      ( x0, y0 ) = get_point
+      cx1 = x0 + 2 * ( x1 - x0 ) / 3
+      cy1 = y0 + 2 * ( y1 - y0 ) / 3
+      cx2 = cx1 + ( x2 - x0 ) / 3
+      cy2 = cy1 + ( y2 - y0 ) / 3
+      curve_to(cx1, cy1, cx2, cy2, x2, y2)
+    end
+    
+    def rel_quad_to(x1, y1, x2, y2)
+      ( x0, y0 ) = get_point
+      quad_to(x1 + x0, y1 + y0, x2 + x0, y2 + x0)
+    end
+  end
+
+  class Glyph
+    Cairo.__add_one_arg_setter(self)
+  end
+
+  class Surface
+    def dup
+      raise NotImplementedError
+    end
+    def clone
+      raise NotImplementedError
+    end
+  end
+
+  class Matrix
+    def dup
+      Matrix.new(*to_a)
+    end
+    
+    def clone
+      copy = dup
+      copy.freeze if self.frozen?
+      copy
+    end
+
+    def transform(tx, ty); dup.transform!(tx, ty); end
+    def scale(sx, sy); dup.scale!(sx, sy); end
+    def rotate(radians); dup.rotate!(radians); end
+    def invert; dup.invert!; end
+    def multiply(other); dup.multiply!(other); end
+    alias * multiply
+  end
+
+  class FontOptions
+    Cairo.__add_one_arg_setter(self)
+  end
+
+  class Pattern
+    Cairo.__add_one_arg_setter(self)
+  end
+
+  class SurfacePattern
+    Cairo.__add_one_arg_setter(self)
+  end
+end

Added: packages/libcairo-ruby/trunk/samples/.cvsignore
===================================================================
--- packages/libcairo-ruby/trunk/samples/.cvsignore	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/samples/.cvsignore	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,4 @@
+*.pdf
+*.ps
+*.png
+

Added: packages/libcairo-ruby/trunk/samples/pdf.rb
===================================================================
--- packages/libcairo-ruby/trunk/samples/pdf.rb	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/samples/pdf.rb	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,32 @@
+#!/usr/bin/env ruby
+
+$LOAD_PATH.unshift "../packages/cairo/ext/"
+$LOAD_PATH.unshift "../packages/cairo/lib/"
+
+require 'cairo'
+require 'stringio'
+
+surface = Cairo::PDFSurface.new("test.pdf", 200, 200)
+cr = Cairo::Context.new(surface)
+
+# fill background with white
+cr.set_source_rgba(1.0, 1.0, 1.0, 0.8)
+cr.paint
+
+# create shape
+cr.move_to(50, 50)
+cr.curve_to(100, 25, 100, 75, 150, 50)
+cr.line_to(150, 150)
+cr.line_to(50, 150)
+cr.close_path
+
+cr.set_source_rgb(0.0, 0.0, 0.0)
+cr.fill_preserve
+cr.set_source_rgb(1.0, 0.0, 0.0)
+cr.set_line_join(Cairo::LINE_JOIN_MITER)
+cr.set_line_width(4)
+cr.stroke
+
+cr.show_page
+
+cr.target.finish


Property changes on: packages/libcairo-ruby/trunk/samples/pdf.rb
___________________________________________________________________
Name: svn:executable
   + 

Added: packages/libcairo-ruby/trunk/samples/pdf2.rb
===================================================================
--- packages/libcairo-ruby/trunk/samples/pdf2.rb	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/samples/pdf2.rb	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,38 @@
+#!/usr/bin/env ruby
+
+$LOAD_PATH.unshift "../packages/cairo/ext/"
+$LOAD_PATH.unshift "../packages/cairo/lib/"
+
+require 'cairo'
+require 'stringio'
+
+output = StringIO.new
+surface = Cairo::PDFSurface.new(output, 200, 200)
+cr = Cairo::Context.new(surface)
+
+# fill background with white
+cr.set_source_rgba(1.0, 1.0, 1.0, 0.8)
+cr.paint
+
+# create shape
+cr.move_to(50, 50)
+cr.curve_to(100, 25, 100, 75, 150, 50)
+cr.line_to(150, 150)
+cr.line_to(50, 150)
+cr.close_path
+
+cr.set_source_rgb(0.0, 0.0, 0.0)
+cr.fill_preserve
+cr.set_source_rgb(1.0, 0.0, 0.0)
+cr.set_line_join(Cairo::LINE_JOIN_MITER)
+cr.set_line_width(4)
+cr.stroke
+
+cr.show_page
+
+cr.target.finish
+
+output.rewind
+File.open("test2.pdf", "wb") do |f|
+  f.print(output.read)
+end


Property changes on: packages/libcairo-ruby/trunk/samples/pdf2.rb
___________________________________________________________________
Name: svn:executable
   + 

Added: packages/libcairo-ruby/trunk/samples/png.rb
===================================================================
--- packages/libcairo-ruby/trunk/samples/png.rb	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/samples/png.rb	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,31 @@
+#!/usr/bin/env ruby
+
+$LOAD_PATH.unshift "../packages/cairo/ext/"
+$LOAD_PATH.unshift "../packages/cairo/lib/"
+
+require 'cairo'
+
+surface = Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32, 200, 200)
+cr = Cairo::Context.new(surface)
+
+# fill background with white
+cr.set_source_rgba(1.0, 1.0, 1.0, 0.8)
+cr.paint
+
+# create shape
+cr.move_to(50, 50)
+cr.curve_to(100, 25, 100, 75, 150, 50)
+cr.line_to(150, 150)
+cr.line_to(50, 150)
+cr.close_path
+
+cr.set_source_rgb(0.0, 0.0, 0.0)
+cr.fill_preserve
+cr.set_source_rgb(1.0, 0.0, 0.0)
+cr.set_line_join(Cairo::LINE_JOIN_MITER)
+cr.set_line_width(4)
+cr.stroke
+
+cr.target.write_to_png("test.png")
+
+cr.target.finish


Property changes on: packages/libcairo-ruby/trunk/samples/png.rb
___________________________________________________________________
Name: svn:executable
   + 

Added: packages/libcairo-ruby/trunk/samples/ps.rb
===================================================================
--- packages/libcairo-ruby/trunk/samples/ps.rb	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/samples/ps.rb	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,32 @@
+#!/usr/bin/env ruby
+
+$LOAD_PATH.unshift "../packages/cairo/ext/"
+$LOAD_PATH.unshift "../packages/cairo/lib/"
+
+require 'cairo'
+require 'stringio'
+
+surface = Cairo::PSSurface.new("test.ps", 200, 200)
+cr = Cairo::Context.new(surface)
+
+# fill background with white
+cr.set_source_rgba(1.0, 1.0, 1.0, 0.8)
+cr.paint
+
+# create shape
+cr.move_to(50, 50)
+cr.curve_to(100, 25, 100, 75, 150, 50)
+cr.line_to(150, 150)
+cr.line_to(50, 150)
+cr.close_path
+
+cr.set_source_rgb(0.0, 0.0, 0.0)
+cr.fill_preserve
+cr.set_source_rgb(1.0, 0.0, 0.0)
+cr.set_line_join(Cairo::LINE_JOIN_MITER)
+cr.set_line_width(4)
+cr.stroke
+
+cr.show_page
+
+cr.target.finish


Property changes on: packages/libcairo-ruby/trunk/samples/ps.rb
___________________________________________________________________
Name: svn:executable
   + 

Added: packages/libcairo-ruby/trunk/samples/ps2.rb
===================================================================
--- packages/libcairo-ruby/trunk/samples/ps2.rb	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/samples/ps2.rb	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,38 @@
+#!/usr/bin/env ruby
+
+$LOAD_PATH.unshift "../packages/cairo/ext/"
+$LOAD_PATH.unshift "../packages/cairo/lib/"
+
+require 'cairo'
+require 'stringio'
+
+output = StringIO.new
+surface = Cairo::PSSurface.new(output, 200, 200)
+cr = Cairo::Context.new(surface)
+
+# fill background with white
+cr.set_source_rgba(1.0, 1.0, 1.0, 0.8)
+cr.paint
+
+# create shape
+cr.move_to(50, 50)
+cr.curve_to(100, 25, 100, 75, 150, 50)
+cr.line_to(150, 150)
+cr.line_to(50, 150)
+cr.close_path
+
+cr.set_source_rgb(0.0, 0.0, 0.0)
+cr.fill_preserve
+cr.set_source_rgb(1.0, 0.0, 0.0)
+cr.set_line_join(Cairo::LINE_JOIN_MITER)
+cr.set_line_width(4)
+cr.stroke
+
+cr.show_page
+
+cr.target.finish
+
+output.rewind
+File.open("test2.ps", "wb") do |f|
+  f.print(output.read)
+end


Property changes on: packages/libcairo-ruby/trunk/samples/ps2.rb
___________________________________________________________________
Name: svn:executable
   + 

Added: packages/libcairo-ruby/trunk/setup.rb
===================================================================
--- packages/libcairo-ruby/trunk/setup.rb	2006-01-02 09:59:48 UTC (rev 194)
+++ packages/libcairo-ruby/trunk/setup.rb	2006-01-02 10:04:52 UTC (rev 195)
@@ -0,0 +1,1551 @@
+#
+# setup.rb
+#
+# Copyright (c) 2000-2005 Minero Aoki
+#
+# This program is free software.
+# You can distribute/modify this program under the terms of
+# the GNU LGPL, Lesser General Public License version 2.1.
+#
+
+unless Enumerable.method_defined?(:map)   # Ruby 1.4.6
+  module Enumerable
+    alias map collect
+  end
+end
+
+unless File.respond_to?(:read)   # Ruby 1.6
+  def File.read(fname)
+    open(fname) {|f|
+      return f.read
+    }
+  end
+end
+
+unless Errno.const_defined?(:ENOTEMPTY)   # Windows?
+  module Errno
+    class ENOTEMPTY
+      # We do not raise this exception, implementation is not needed.
+    end
+  end
+end
+
+def File.binread(fname)
+  open(fname, 'rb') {|f|
+    return f.read
+  }
+end
+
+# for corrupted Windows' stat(2)
+def File.dir?(path)
+  File.directory?((path[-1,1] == '/') ? path : path + '/')
+end
+
+
+class ConfigTable
+
+  include Enumerable
+
+  def initialize(rbconfig)
+    @rbconfig = rbconfig
+    @items = []
+    @table = {}
+    # options
+    @install_prefix = nil
+    @config_opt = nil
+    @verbose = true
+    @no_harm = false
+    @libsrc_pattern = '*.rb'
+  end
+
+  attr_accessor :install_prefix
+  attr_accessor :config_opt
+
+  attr_writer :verbose
+
+  def verbose?
+    @verbose
+  end
+
+  attr_writer :no_harm
+
+  def no_harm?
+    @no_harm
+  end
+
+  attr_accessor :libsrc_pattern
+
+  def [](key)
+    lookup(key).resolve(self)
+  end
+
+  def []=(key, val)
+    lookup(key).set val
+  end
+
+  def names
+    @items.map {|i| i.name }
+  end
+
+  def each(&block)
+    @items.each(&block)
+  end
+
+  def key?(name)
+    @table.key?(name)
+  end
+
+  def lookup(name)
+    @table[name] or setup_rb_error "no such config item: #{name}"
+  end
+
+  def add(item)
+    @items.push item
+    @table[item.name] = item
+  end
+
+  def remove(name)
+    item = lookup(name)
+    @items.delete_if {|i| i.name == name }
+    @table.delete_if {|name, i| i.name == name }
+    item
+  end
+
+  def load_script(path, inst = nil)
+    if File.file?(path)
+      MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
+    end
+  end
+
+  def savefile
+    '.config'
+  end
+
+  def load_savefile
+    begin
+      File.foreach(savefile()) do |line|
+        k, v = *line.split(/=/, 2)
+        self[k] = v.strip
+      end
+    rescue Errno::ENOENT
+      setup_rb_error $!.message + "\n#{File.basename($0)} config first"
+    end
+  end
+
+  def save
+    @items.each {|i| i.value }
+    File.open(savefile(), 'w') {|f|
+      @items.each do |i|
+        f.printf "%s=%s\n", i.name, i.value if i.value? and i.value
+      end
+    }
+  end
+
+  def load_standard_entries
+    standard_entries(@rbconfig).each do |ent|
+      add ent
+    end
+  end
+
+  def standard_entries(rbconfig)
+    c = rbconfig
+
+    rubypath = c['bindir'] + '/' + c['ruby_install_name']
+
+    major = c['MAJOR'].to_i
+    minor = c['MINOR'].to_i
+    teeny = c['TEENY'].to_i
+    version = "#{major}.#{minor}"
+
+    # ruby ver. >= 1.4.4?
+    newpath_p = ((major >= 2) or
+                 ((major == 1) and
+                  ((minor >= 5) or
+                   ((minor == 4) and (teeny >= 4)))))
+
+    if c['rubylibdir']
+      # V > 1.6.3
+      libruby         = "#{c['prefix']}/lib/ruby"
+      librubyver      = c['rubylibdir']
+      librubyverarch  = c['archdir']
+      siteruby        = c['sitedir']
+      siterubyver     = c['sitelibdir']
+      siterubyverarch = c['sitearchdir']
+    elsif newpath_p
+      # 1.4.4 <= V <= 1.6.3
+      libruby         = "#{c['prefix']}/lib/ruby"
+      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
+      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+      siteruby        = c['sitedir']
+      siterubyver     = "$siteruby/#{version}"
+      siterubyverarch = "$siterubyver/#{c['arch']}"
+    else
+      # V < 1.4.4
+      libruby         = "#{c['prefix']}/lib/ruby"
+      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
+      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+      siteruby        = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
+      siterubyver     = siteruby
+      siterubyverarch = "$siterubyver/#{c['arch']}"
+    end
+    parameterize = lambda {|path|
+      path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
+    }
+
+    if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
+      makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
+    else
+      makeprog = 'make'
+    end
+
+    [
+      ExecItem.new('installdirs', 'std/site/home',
+                   'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
+          {|val, table|
+            case val
+            when 'std'
+              table['rbdir'] = '$librubyver'
+              table['sodir'] = '$librubyverarch'
+            when 'site'
+              table['rbdir'] = '$siterubyver'
+              table['sodir'] = '$siterubyverarch'
+            when 'home'
+              setup_rb_error '$HOME was not set' unless ENV['HOME']
+              table['prefix'] = ENV['HOME']
+              table['rbdir'] = '$libdir/ruby'
+              table['sodir'] = '$libdir/ruby'
+            end
+          },
+      PathItem.new('prefix', 'path', c['prefix'],
+                   'path prefix of target environment'),
+      PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
+                   'the directory for commands'),
+      PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
+                   'the directory for libraries'),
+      PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
+                   'the directory for shared data'),
+      PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
+                   'the directory for man pages'),
+      PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
+                   'the directory for system configuration files'),
+      PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
+                   'the directory for local state data'),
+      PathItem.new('libruby', 'path', libruby,
+                   'the directory for ruby libraries'),
+      PathItem.new('librubyver', 'path', librubyver,
+                   'the directory for standard ruby libraries'),
+      PathItem.new('librubyverarch', 'path', librubyverarch,
+                   'the directory for standard ruby extensions'),
+      PathItem.new('siteruby', 'path', siteruby,
+          'the directory for version-independent aux ruby libraries'),
+      PathItem.new('siterubyver', 'path', siterubyver,
+                   'the directory for aux ruby libraries'),
+      PathItem.new('siterubyverarch', 'path', siterubyverarch,
+                   'the directory for aux ruby binaries'),
+      PathItem.new('rbdir', 'path', '$siterubyver',
+                   'the directory for ruby scripts'),
+      PathItem.new('sodir', 'path', '$siterubyverarch',
+                   'the directory for ruby extentions'),
+      PathItem.new('rubypath', 'path', rubypath,
+                   'the path to set to #! line'),
+      ProgramItem.new('rubyprog', 'name', rubypath,
+                      'the ruby program using for installation'),
+      ProgramItem.new('makeprog', 'name', makeprog,
+                      'the make program to compile ruby extentions'),
+      SelectItem.new('shebang', 'all/ruby/never', 'ruby',
+                     'shebang line (#!) editing mode'),
+      BoolItem.new('without-ext', 'yes/no', 'no',
+                   'does not compile/install ruby extentions')
+    ]
+  end
+  private :standard_entries
+
+  def load_multipackage_entries
+    multipackage_entries().each do |ent|
+      add ent
+    end
+  end
+
+  def multipackage_entries
+    [
+      PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
+                               'package names that you want to install'),
+      PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
+                               'package names that you do not want to install')
+    ]
+  end
+  private :multipackage_entries
+
+  ALIASES = {
+    'std-ruby'         => 'librubyver',
+    'stdruby'          => 'librubyver',
+    'rubylibdir'       => 'librubyver',
+    'archdir'          => 'librubyverarch',
+    'site-ruby-common' => 'siteruby',     # For backward compatibility
+    'site-ruby'        => 'siterubyver',  # For backward compatibility
+    'bin-dir'          => 'bindir',
+    'bin-dir'          => 'bindir',
+    'rb-dir'           => 'rbdir',
+    'so-dir'           => 'sodir',
+    'data-dir'         => 'datadir',
+    'ruby-path'        => 'rubypath',
+    'ruby-prog'        => 'rubyprog',
+    'ruby'             => 'rubyprog',
+    'make-prog'        => 'makeprog',
+    'make'             => 'makeprog'
+  }
+
+  def fixup
+    ALIASES.each do |ali, name|
+      @table[ali] = @table[name]
+    end
+    @items.freeze
+    @table.freeze
+    @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/
+  end
+
+  def parse_opt(opt)
+    m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}"
+    m.to_a[1,2]
+  end
+
+  def dllext
+    @rbconfig['DLEXT']
+  end
+
+  def value_config?(name)
+    lookup(name).value?
+  end
+
+  class Item
+    def initialize(name, template, default, desc)
+      @name = name.freeze
+      @template = template
+      @value = default
+      @default = default
+      @description = desc
+    end
+
+    attr_reader :name
+    attr_reader :description
+
+    attr_accessor :default
+    alias help_default default
+
+    def help_opt
+      "--#{@name}=#{@template}"
+    end
+
+    def value?
+      true
+    end
+
+    def value
+      @value
+    end
+
+    def resolve(table)
+      @value.gsub(%r<\$([^/]+)>) { table[$1] }
+    end
+
+    def set(val)
+      @value = check(val)
+    end
+
+    private
+
+    def check(val)
+      setup_rb_error "config: --#{name} requires argument" unless val
+      val
+    end
+  end
+
+  class BoolItem < Item
+    def config_type
+      'bool'
+    end
+
+    def help_opt
+      "--#{@name}"
+    end
+
+    private
+
+    def check(val)
+      return 'yes' unless val
+      unless /\A(y(es)?|n(o)?|t(rue)?|f(alse))\z/i =~ val
+        setup_rb_error "config: --#{@name} accepts only yes/no for argument"
+      end
+      (/\Ay(es)?|\At(rue)/i =~ value) ? 'yes' : 'no'
+    end
+  end
+
+  class PathItem < Item
+    def config_type
+      'path'
+    end
+
+    private
+
+    def check(path)
+      setup_rb_error "config: --#{@name} requires argument"  unless path
+      path[0,1] == '$' ? path : File.expand_path(path)
+    end
+  end
+
+  class ProgramItem < Item
+    def config_type
+      'program'
+    end
+  end
+
+  class SelectItem < Item
+    def initialize(name, selection, default, desc)
+      super
+      @ok = selection.split('/')
+    end
+
+    def config_type
+      'select'
+    end
+
+    private
+
+    def check(val)
+      unless @ok.include?(val.strip)
+        setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
+      end
+      val.strip
+    end
+  end
+
+  class ExecItem < Item
+    def initialize(name, selection, desc, &block)
+      super name, selection, nil, desc
+      @ok = selection.split('/')
+      @action = block
+    end
+
+    def config_type
+      'exec'
+    end
+
+    def value?
+      false
+    end
+
+    def resolve(table)
+      setup_rb_error "$#{name()} wrongly used as option value"
+    end
+
+    undef set
+
+    def evaluate(val, table)
+      v = val.strip.downcase
+      unless @ok.include?(v)
+        setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})"
+      end
+      @action.call v, table
+    end
+  end
+
+  class PackageSelectionItem < Item
+    def initialize(name, template, default, help_default, desc)
+      super name, template, default, desc
+      @help_default = help_default
+    end
+
+    attr_reader :help_default
+
+    def config_type
+      'package'
+    end
+
+    private
+
+    def check(val)
+      unless File.dir?("packages/#{val}")
+        setup_rb_error "config: no such package: #{val}"
+      end
+      val
+    end
+  end
+
+  class MetaConfigEnvironment
+    def intiailize(config, installer)
+      @config = config
+      @installer = installer
+    end
+
+    def config_names
+      @config.names
+    end
+
+    def config?(name)
+      @config.key?(name)
+    end
+
+    def bool_config?(name)
+      @config.lookup(name).config_type == 'bool'
+    end
+
+    def path_config?(name)
+      @config.lookup(name).config_type == 'path'
+    end
+
+    def value_config?(name)
+      @config.lookup(name).config_type != 'exec'
+    end
+
+    def add_config(item)
+      @config.add item
+    end
+
+    def add_bool_config(name, default, desc)
+      @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
+    end
+
+    def add_path_config(name, default, desc)
+      @config.add PathItem.new(name, 'path', default, desc)
+    end
+
+    def set_config_default(name, default)
+      @config.lookup(name).default = default
+    end
+
+    def remove_config(name)
+      @config.remove(name)
+    end
+
+    # For only multipackage
+    def packages
+      raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer
+      @installer.packages
+    end
+
+    # For only multipackage
+    def declare_packages(list)
+      raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer
+      @installer.packages = list
+    end
+  end
+
+end   # class ConfigTable
+
+
+# This module requires: #verbose?, #no_harm?
+module FileOperations
+
+  def mkdir_p(dirname, prefix = nil)
+    dirname = prefix + File.expand_path(dirname) if prefix
+    $stderr.puts "mkdir -p #{dirname}" if verbose?
+    return if no_harm?
+
+    # Does not check '/', it's too abnormal.
+    dirs = File.expand_path(dirname).split(%r<(?=/)>)
+    if /\A[a-z]:\z/i =~ dirs[0]
+      disk = dirs.shift
+      dirs[0] = disk + dirs[0]
+    end
+    dirs.each_index do |idx|
+      path = dirs[0..idx].join('')
+      Dir.mkdir path unless File.dir?(path)
+    end
+  end
+
+  def rm_f(path)
+    $stderr.puts "rm -f #{path}" if verbose?
+    return if no_harm?
+    force_remove_file path
+  end
+
+  def rm_rf(path)
+    $stderr.puts "rm -rf #{path}" if verbose?
+    return if no_harm?
+    remove_tree path
+  end
+
+  def remove_tree(path)
+    if File.symlink?(path)
+      remove_file path
+    elsif File.dir?(path)
+      remove_tree0 path
+    else
+      force_remove_file path
+    end
+  end
+
+  def remove_tree0(path)
+    Dir.foreach(path) do |ent|
+      next if ent == '.'
+      next if ent == '..'
+      entpath = "#{path}/#{ent}"
+      if File.symlink?(entpath)
+        remove_file entpath
+      elsif File.dir?(entpath)
+        remove_tree0 entpath
+      else
+        force_remove_file entpath
+      end
+    end
+    begin
+      Dir.rmdir path
+    rescue Errno::ENOTEMPTY
+      # directory may not be empty
+    end
+  end
+
+  def move_file(src, dest)
+    force_remove_file dest
+    begin
+      File.rename src, dest
+    rescue
+      File.open(dest, 'wb') {|f|
+        f.write File.binread(src)
+      }
+      File.chmod File.stat(src).mode, dest
+      File.unlink src
+    end
+  end
+
+  def force_remove_file(path)
+    begin
+      remove_file path
+    rescue
+    end
+  end
+
+  def remove_file(path)
+    File.chmod 0777, path
+    File.unlink path
+  end
+
+  def install(from, dest, mode, prefix = nil)
+    $stderr.puts "install #{from} #{dest}" if verbose?
+    return if no_harm?
+
+    realdest = prefix ? prefix + File.expand_path(dest) : dest
+    realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
+    str = File.binread(from)
+    if diff?(str, realdest)
+      verbose_off {
+        rm_f realdest if File.exist?(realdest)
+      }
+      File.open(realdest, 'wb') {|f|
+        f.write str
+      }
+      File.chmod mode, realdest
+
+      File.open("#{objdir_root()}/InstalledFiles", 'a') {|f|
+        if prefix
+          f.puts realdest.sub(prefix, '')
+        else
+          f.puts realdest
+        end
+      }
+    end
+  end
+
+  def diff?(new_content, path)
+    return true unless File.exist?(path)
+    new_content != File.binread(path)
+  end
+
+  def command(*args)
+    $stderr.puts args.join(' ') if verbose?
+    system(args.join(' ')) or raise RuntimeError,
+        "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
+  end
+
+  def ruby(*args)
+    command config('rubyprog'), *args
+  end
+  
+  def make(task = nil)
+    command(*[config('makeprog'), task].compact)
+  end
+
+  def extdir?(dir)
+    File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb")
+  end
+
+  def files_of(dir)
+    Dir.open(dir) {|d|
+      return d.select {|ent| File.file?("#{dir}/#{ent}") }
+    }
+  end
+
+  DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn )
+
+  def directories_of(dir)
+    Dir.open(dir) {|d|
+      return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT
+    }
+  end
+
+end
+
+
+# This module requires: #srcdir_root, #objdir_root, #relpath
+module HookScriptAPI
+
+  def get_config(key)
+    @config[key]
+  end
+
+  alias config get_config
+
+  # obsolete: use metaconfig to change configuration
+  def set_config(key, val)
+    @config[key] = val
+  end
+
+  #
+  # srcdir/objdir (works only in the package directory)
+  #
+
+  def curr_srcdir
+    "#{srcdir_root()}/#{relpath()}"
+  end
+
+  def curr_objdir
+    "#{objdir_root()}/#{relpath()}"
+  end
+
+  def srcfile(path)
+    "#{curr_srcdir()}/#{path}"
+  end
+
+  def srcexist?(path)
+    File.exist?(srcfile(path))
+  end
+
+  def srcdirectory?(path)
+    File.dir?(srcfile(path))
+  end
+  
+  def srcfile?(path)
+    File.file?(srcfile(path))
+  end
+
+  def srcentries(path = '.')
+    Dir.open("#{curr_srcdir()}/#{path}") {|d|
+      return d.to_a - %w(. ..)
+    }
+  end
+
+  def srcfiles(path = '.')
+    srcentries(path).select {|fname|
+      File.file?(File.join(curr_srcdir(), path, fname))
+    }
+  end
+
+  def srcdirectories(path = '.')
+    srcentries(path).select {|fname|
+      File.dir?(File.join(curr_srcdir(), path, fname))
+    }
+  end
+
+end
+
+
+class ToplevelInstaller
+
+  Version   = '3.4.0'
+  Copyright = 'Copyright (c) 2000-2005 Minero Aoki'
+
+  TASKS = [
+    [ 'all',      'do config, setup, then install' ],
+    [ 'config',   'saves your configurations' ],
+    [ 'show',     'shows current configuration' ],
+    [ 'setup',    'compiles ruby extentions and others' ],
+    [ 'install',  'installs files' ],
+    [ 'test',     'run all tests in test/' ],
+    [ 'clean',    "does `make clean' for each extention" ],
+    [ 'distclean',"does `make distclean' for each extention" ]
+  ]
+
+  def ToplevelInstaller.invoke
+    config = ConfigTable.new(load_rbconfig())
+    config.load_standard_entries
+    config.load_multipackage_entries if multipackage?
+    config.fixup
+    klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller)
+    klass.new(File.dirname($0), config).invoke
+  end
+
+  def ToplevelInstaller.multipackage?
+    File.dir?(File.dirname($0) + '/packages')
+  end
+
+  def ToplevelInstaller.load_rbconfig
+    if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg }
+      ARGV.delete(arg)
+      load File.expand_path(arg.split(/=/, 2)[1])
+      $".push 'rbconfig.rb'
+    else
+      require 'rbconfig'
+    end
+    ::Config::CONFIG
+  end
+
+  def initialize(ardir_root, config)
+    @ardir = File.expand_path(ardir_root)
+    @config = config
+    # cache
+    @valid_task_re = nil
+  end
+
+  def config(key)
+    @config[key]
+  end
+
+  def inspect
+    "#<#{self.class} #{__id__()}>"
+  end
+
+  def invoke
+    run_metaconfigs
+    case task = parsearg_global()
+    when nil, 'all'
+      parsearg_config
+      init_installers
+      exec_config
+      exec_setup
+      exec_install
+    else
+      case task
+      when 'config', 'test'
+        ;
+      when 'clean', 'distclean'
+        @config.load_savefile if File.exist?(@config.savefile)
+      else
+        @config.load_savefile
+      end
+      __send__ "parsearg_#{task}"
+      init_installers
+      __send__ "exec_#{task}"
+    end
+  end
+  
+  def run_metaconfigs
+    @config.load_script "#{@ardir}/metaconfig"
+  end
+
+  def init_installers
+    @installer = Installer.new(@config, @ardir, File.expand_path('.'))
+  end
+
+  #
+  # Hook Script API bases
+  #
+
+  def srcdir_root
+    @ardir
+  end
+
+  def objdir_root
+    '.'
+  end
+
+  def relpath
+    '.'
+  end
+
+  #
+  # Option Parsing
+  #
+
+  def parsearg_global
+    while arg = ARGV.shift
+      case arg
+      when /\A\w+\z/
+        setup_rb_error "invalid task: #{arg}" unless valid_task?(arg)
+        return arg
+      when '-q', '--quiet'
+        @config.verbose = false
+      when '--verbose'
+        @config.verbose = true
+      when '--help'
+        print_usage $stdout
+        exit 0
+      when '--version'
+        puts "#{File.basename($0)} version #{Version}"
+        exit 0
+      when '--copyright'
+        puts Copyright
+        exit 0
+      else
+        setup_rb_error "unknown global option '#{arg}'"
+      end
+    end
+    nil
+  end
+
+  def valid_task?(t)
+    valid_task_re() =~ t
+  end
+
+  def valid_task_re
+    @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/
+  end
+
+  def parsearg_no_options
+    unless ARGV.empty?
+      setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}"
+    end
+  end
+
+  alias parsearg_show       parsearg_no_options
+  alias parsearg_setup      parsearg_no_options
+  alias parsearg_test       parsearg_no_options
+  alias parsearg_clean      parsearg_no_options
+  alias parsearg_distclean  parsearg_no_options
+
+  def parsearg_config
+    evalopt = []
+    set = []
+    @config.config_opt = []
+    while i = ARGV.shift
+      if /\A--?\z/ =~ i
+        @config.config_opt = ARGV.dup
+        break
+      end
+      name, value = *@config.parse_opt(i)
+      if @config.value_config?(name)
+        @config[name] = value
+      else
+        evalopt.push [name, value]
+      end
+      set.push name
+    end
+    evalopt.each do |name, value|
+      @config.lookup(name).evaluate value, @config
+    end
+    # Check if configuration is valid
+    set.each do |n|
+      @config[n] if @config.value_config?(n)
+    end
+  end
+
+  def parsearg_install
+    @config.no_harm = false
+    @config.install_prefix = ''
+    while a = ARGV.shift
+      case a
+      when '--no-harm'
+        @config.no_harm = true
+      when /\A--prefix=/
+        path = a.split(/=/, 2)[1]
+        path = File.expand_path(path) unless path[0,1] == '/'
+        @config.install_prefix = path
+      else
+        setup_rb_error "install: unknown option #{a}"
+      end
+    end
+  end
+
+  def print_usage(out)
+    out.puts 'Typical Installation Procedure:'
+    out.puts "  $ ruby #{File.basename $0} config"
+    out.puts "  $ ruby #{File.basename $0} setup"
+    out.puts "  # ruby #{File.basename $0} install (may require root privilege)"
+    out.puts
+    out.puts 'Detailed Usage:'
+    out.puts "  ruby #{File.basename $0} <global option>"
+    out.puts "  ruby #{File.basename $0} [<global options>] <task> [<task options>]"
+
+    fmt = "  %-24s %s\n"
+    out.puts
+    out.puts 'Global options:'
+    out.printf fmt, '-q,--quiet',   'suppress message outputs'
+    out.printf fmt, '   --verbose', 'output messages verbosely'
+    out.printf fmt, '   --help',    'print this message'
+    out.printf fmt, '   --version', 'print version and quit'
+    out.printf fmt, '   --copyright',  'print copyright and quit'
+    out.puts
+    out.puts 'Tasks:'
+    TASKS.each do |name, desc|
+      out.printf fmt, name, desc
+    end
+
+    fmt = "  %-24s %s [%s]\n"
+    out.puts
+    out.puts 'Options for CONFIG or ALL:'
+    @config.each do |item|
+      out.printf fmt, item.help_opt, item.description, item.help_default
+    end
+    out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's"
+    out.puts
+    out.puts 'Options for INSTALL:'
+    out.printf fmt, '--no-harm', 'only display what to do if given', 'off'
+    out.printf fmt, '--prefix=path',  'install path prefix', ''
+    out.puts
+  end
+
+  #
+  # Task Handlers
+  #
+
+  def exec_config
+    @installer.exec_config
+    @config.save   # must be final
+  end
+
+  def exec_setup
+    @installer.exec_setup
+  end
+
+  def exec_install
+    @installer.exec_install
+  end
+
+  def exec_test
+    @installer.exec_test
+  end
+
+  def exec_show
+    @config.each do |i|
+      printf "%-20s %s\n", i.name, i.value if i.value?
+    end
+  end
+
+  def exec_clean
+    @installer.exec_clean
+  end
+
+  def exec_distclean
+    @installer.exec_distclean
+  end
+
+end   # class ToplevelInstaller
+
+
+class ToplevelInstallerMulti < ToplevelInstaller
+
+  include FileOperations
+
+  def initialize(ardir_root, config)
+    super
+    @packages = directories_of("#{@ardir}/packages")
+    raise 'no package exists' if @packages.empty?
+    @root_installer = Installer.new(@config, @ardir, File.expand_path('.'))
+  end
+
+  def run_metaconfigs
+    @config.load_script "#{@ardir}/metaconfig", self
+    @packages.each do |name|
+      @config.load_script "#{@ardir}/packages/#{name}/metaconfig"
+    end
+  end
+
+  attr_reader :packages
+
+  def packages=(list)
+    raise 'package list is empty' if list.empty?
+    list.each do |name|
+      raise "directory packages/#{name} does not exist"\
+              unless File.dir?("#{@ardir}/packages/#{name}")
+    end
+    @packages = list
+  end
+
+  def init_installers
+    @installers = {}
+    @packages.each do |pack|
+      @installers[pack] = Installer.new(@config,
+                                       "#{@ardir}/packages/#{pack}",
+                                       "packages/#{pack}")
+    end
+    with    = extract_selection(config('with'))
+    without = extract_selection(config('without'))
+    @selected = @installers.keys.select {|name|
+                  (with.empty? or with.include?(name)) \
+                      and not without.include?(name)
+                }
+  end
+
+  def extract_selection(list)
+    a = list.split(/,/)
+    a.each do |name|
+      setup_rb_error "no such package: #{name}"  unless @installers.key?(name)
+    end
+    a
+  end
+
+  def print_usage(f)
+    super
+    f.puts 'Inluded packages:'
+    f.puts '  ' + @packages.sort.join(' ')
+    f.puts
+  end
+
+  #
+  # Task Handlers
+  #
+
+  def exec_config
+    run_hook 'pre-config'
+    each_selected_installers {|inst| inst.exec_config }
+    run_hook 'post-config'
+    @config.save   # must be final
+  end
+
+  def exec_setup
+    run_hook 'pre-setup'
+    each_selected_installers {|inst| inst.exec_setup }
+    run_hook 'post-setup'
+  end
+
+  def exec_install
+    run_hook 'pre-install'
+    each_selected_installers {|inst| inst.exec_install }
+    run_hook 'post-install'
+  end
+
+  def exec_test
+    run_hook 'pre-test'
+    each_selected_installers {|inst| inst.exec_test }
+    run_hook 'post-test'
+  end
+
+  def exec_clean
+    rm_f @config.savefile
+    run_hook 'pre-clean'
+    each_selected_installers {|inst| inst.exec_clean }
+    run_hook 'post-clean'
+  end
+
+  def exec_distclean
+    rm_f @config.savefile
+    run_hook 'pre-distclean'
+    each_selected_installers {|inst| inst.exec_distclean }
+    run_hook 'post-distclean'
+  end
+
+  #
+  # lib
+  #
+
+  def each_selected_installers
+    Dir.mkdir 'packages' unless File.dir?('packages')
+    @selected.each do |pack|
+      $stderr.puts "Processing the package `#{pack}' ..." if verbose?
+      Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
+      Dir.chdir "packages/#{pack}"
+      yield @installers[pack]
+      Dir.chdir '../..'
+    end
+  end
+
+  def run_hook(id)
+    @root_installer.run_hook id
+  end
+
+  # module FileOperations requires this
+  def verbose?
+    @config.verbose?
+  end
+
+  # module FileOperations requires this
+  def no_harm?
+    @config.no_harm?
+  end
+
+end   # class ToplevelInstallerMulti
+
+
+class Installer
+
+  FILETYPES = %w( bin lib ext data conf man )
+
+  include FileOperations
+  include HookScriptAPI
+
+  def initialize(config, srcroot, objroot)
+    @config = config
+    @srcdir = File.expand_path(srcroot)
+    @objdir = File.expand_path(objroot)
+    @currdir = '.'
+  end
+
+  def inspect
+    "#<#{self.class} #{File.basename(@srcdir)}>"
+  end
+
+  #
+  # Hook Script API base methods
+  #
+
+  def srcdir_root
+    @srcdir
+  end
+
+  def objdir_root
+    @objdir
+  end
+
+  def relpath
+    @currdir
+  end
+
+  #
+  # Config Access
+  #
+
+  # module FileOperations requires this
+  def verbose?
+    @config.verbose?
+  end
+
+  # module FileOperations requires this
+  def no_harm?
+    @config.no_harm?
+  end
+
+  def verbose_off
+    begin
+      save, @config.verbose = @config.verbose?, false
+      yield
+    ensure
+      @config.verbose = save
+    end
+  end
+
+  #
+  # TASK config
+  #
+
+  def exec_config
+    exec_task_traverse 'config'
+  end
+
+  def config_dir_bin(rel)
+  end
+
+  def config_dir_lib(rel)
+  end
+
+  def config_dir_man(rel)
+  end
+
+  def config_dir_ext(rel)
+    extconf if extdir?(curr_srcdir())
+  end
+
+  def extconf
+    ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt
+  end
+
+  def config_dir_data(rel)
+  end
+
+  def config_dir_conf(rel)
+  end
+
+  #
+  # TASK setup
+  #
+
+  def exec_setup
+    exec_task_traverse 'setup'
+  end
+
+  def setup_dir_bin(rel)
+    files_of(curr_srcdir()).each do |fname|
+      adjust_shebang "#{curr_srcdir()}/#{fname}"
+    end
+  end
+
+  def adjust_shebang(path)
+    return if no_harm?
+    tmpfile = File.basename(path) + '.tmp'
+    begin
+      File.open(path, 'rb') {|r|
+        first = r.gets
+        return unless File.basename(first.sub(/\A\#!/, '').split[0].to_s) == 'ruby'
+        $stderr.puts "adjusting shebang: #{File.basename(path)}" if verbose?
+        File.open(tmpfile, 'wb') {|w|
+          w.print first.sub(/\A\#!\s*\S+/, '#! ' + config('rubypath'))
+          w.write r.read
+        }
+      }
+      move_file tmpfile, File.basename(path)
+    ensure
+      File.unlink tmpfile if File.exist?(tmpfile)
+    end
+  end
+
+  def setup_dir_lib(rel)
+  end
+
+  def setup_dir_man(rel)
+  end
+
+  def setup_dir_ext(rel)
+    make if extdir?(curr_srcdir())
+  end
+
+  def setup_dir_data(rel)
+  end
+
+  def setup_dir_conf(rel)
+  end
+
+  #
+  # TASK install
+  #
+
+  def exec_install
+    rm_f 'InstalledFiles'
+    exec_task_traverse 'install'
+  end
+
+  def install_dir_bin(rel)
+    install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755
+  end
+
+  def install_dir_lib(rel)
+    install_files rubyscripts(), "#{config('rbdir')}/#{rel}", 0644
+  end
+
+  def install_dir_ext(rel)
+    return unless extdir?(curr_srcdir())
+    install_files rubyextentions('.'),
+                  "#{config('sodir')}/#{File.dirname(rel)}",
+                  0555
+  end
+
+  def install_dir_data(rel)
+    install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644
+  end
+
+  def install_dir_conf(rel)
+    # FIXME: should not remove current config files
+    # (rename previous file to .old/.org)
+    install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644
+  end
+
+  def install_dir_man(rel)
+    install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644
+  end
+
+  def install_files(list, dest, mode)
+    mkdir_p dest, @config.install_prefix
+    list.each do |fname|
+      install fname, dest, mode, @config.install_prefix
+    end
+  end
+
+  def rubyscripts
+    glob_select(@config.libsrc_pattern, targetfiles())
+  end
+
+  def rubyextentions(dir)
+    ents = glob_select("*.#{@config.dllext}", targetfiles())
+    if ents.empty?
+      setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first"
+    end
+    ents
+  end
+
+  def targetfiles
+    mapdir(existfiles() - hookfiles())
+  end
+
+  def mapdir(ents)
+    ents.map {|ent|
+      if File.exist?(ent)
+      then ent                         # objdir
+      else "#{curr_srcdir()}/#{ent}"   # srcdir
+      end
+    }
+  end
+
+  # picked up many entries from cvs-1.11.1/src/ignore.c
+  JUNK_FILES = %w( 
+    core RCSLOG tags TAGS .make.state
+    .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb
+    *~ *.old *.bak *.BAK *.orig *.rej _$* *$
+
+    *.org *.in .*
+  )
+
+  def existfiles
+    glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.')))
+  end
+
+  def hookfiles
+    %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt|
+      %w( config setup install clean ).map {|t| sprintf(fmt, t) }
+    }.flatten
+  end
+
+  def glob_select(pat, ents)
+    re = globs2re([pat])
+    ents.select {|ent| re =~ ent }
+  end
+
+  def glob_reject(pats, ents)
+    re = globs2re(pats)
+    ents.reject {|ent| re =~ ent }
+  end
+
+  GLOB2REGEX = {
+    '.' => '\.',
+    '$' => '\$',
+    '#' => '\#',
+    '*' => '.*'
+  }
+
+  def globs2re(pats)
+    /\A(?:#{
+      pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|')
+    })\z/
+  end
+
+  #
+  # TASK test
+  #
+
+  TESTDIR = 'test'
+
+  def exec_test
+    unless File.directory?('test')
+      $stderr.puts 'no test in this package' if verbose?
+      return
+    end
+    $stderr.puts 'Running tests...' if verbose?
+    require 'test/unit'
+    runner = Test::Unit::AutoRunner.new(true)
+    runner.to_run << TESTDIR
+    runner.run
+  end
+
+  #
+  # TASK clean
+  #
+
+  def exec_clean
+    exec_task_traverse 'clean'
+    rm_f @config.savefile
+    rm_f 'InstalledFiles'
+  end
+
+  def clean_dir_bin(rel)
+  end
+
+  def clean_dir_lib(rel)
+  end
+
+  def clean_dir_ext(rel)
+    return unless extdir?(curr_srcdir())
+    make 'clean' if File.file?('Makefile')
+  end
+
+  def clean_dir_data(rel)
+  end
+
+  def clean_dir_conf(rel)
+  end
+
+  #
+  # TASK distclean
+  #
+
+  def exec_distclean
+    exec_task_traverse 'distclean'
+    rm_f @config.savefile
+    rm_f 'InstalledFiles'
+  end
+
+  def distclean_dir_bin(rel)
+  end
+
+  def distclean_dir_lib(rel)
+  end
+
+  def distclean_dir_ext(rel)
+    return unless extdir?(curr_srcdir())
+    make 'distclean' if File.file?('Makefile')
+  end
+
+  def distclean_dir_data(rel)
+  end
+
+  def distclean_dir_conf(rel)
+  end
+
+  #
+  # lib
+  #
+
+  def exec_task_traverse(task)
+    run_hook "pre-#{task}"
+    FILETYPES.each do |type|
+      if config('without-ext') == 'yes' and type == 'ext'
+        $stderr.puts 'skipping ext/* by user option' if verbose?
+        next
+      end
+      traverse task, type, "#{task}_dir_#{type}"
+    end
+    run_hook "post-#{task}"
+  end
+
+  def traverse(task, rel, mid)
+    dive_into(rel) {
+      run_hook "pre-#{task}"
+      __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
+      directories_of(curr_srcdir()).each do |d|
+        traverse task, "#{rel}/#{d}", mid
+      end
+      run_hook "post-#{task}"
+    }
+  end
+
+  def dive_into(rel)
+    return unless File.dir?("#{@srcdir}/#{rel}")
+
+    dir = File.basename(rel)
+    Dir.mkdir dir unless File.dir?(dir)
+    prevdir = Dir.pwd
+    Dir.chdir dir
+    $stderr.puts '---> ' + rel if verbose?
+    @currdir = rel
+    yield
+    Dir.chdir prevdir
+    $stderr.puts '<--- ' + rel if verbose?
+    @currdir = File.dirname(rel)
+  end
+
+  def run_hook(id)
+    path = [ "#{curr_srcdir()}/#{id}",
+             "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) }
+    return unless path
+    begin
+      instance_eval File.read(path), path, 1
+    rescue
+      raise if $DEBUG
+      setup_rb_error "hook #{path} failed:\n" + $!.message
+    end
+  end
+
+end   # class Installer
+
+
+class SetupError < StandardError; end
+
+def setup_rb_error(msg)
+  raise SetupError, msg
+end
+
+if $0 == __FILE__
+  begin
+    ToplevelInstaller.invoke
+  rescue SetupError
+    raise if $DEBUG
+    $stderr.puts $!.message
+    $stderr.puts "Try 'ruby #{$0} --help' for detailed usage."
+    exit 1
+  end
+end


Property changes on: packages/libcairo-ruby/trunk/setup.rb
___________________________________________________________________
Name: svn:executable
   + 




More information about the pkg-ruby-extras-maintainers mailing list