[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