perl-Pango r2 - in trunk: . lib t t/inc xs



Author: tsch
Date: Sun Nov  2 12:33:26 2008
New Revision: 2
URL: http://svn.gnome.org/viewvc/perl-Pango?rev=2&view=rev

Log:
Initial import into GNOME SVN.


Added:
   trunk/AUTHORS
   trunk/ChangeLog
   trunk/LICENSE
   trunk/MAINTAINERS
   trunk/MANIFEST
   trunk/MANIFEST.SKIP
   trunk/Makefile.PL
   trunk/NEWS
   trunk/README
   trunk/copyright.pod
   trunk/doctypes
   trunk/lib/
   trunk/lib/Pango.pm
   trunk/maps-1.0
   trunk/maps-1.10
   trunk/maps-1.16
   trunk/maps-1.18
   trunk/maps-1.4
   trunk/maps-1.6
   trunk/maps-1.8
   trunk/pango-perl-private.h
   trunk/pango-perl.h
   trunk/pango.exports
   trunk/pango.typemap
   trunk/t/
   trunk/t/Pango.t
   trunk/t/PangoAttributes.t
   trunk/t/PangoCairo.t
   trunk/t/PangoContext.t
   trunk/t/PangoFont.t
   trunk/t/PangoFontMap.t
   trunk/t/PangoFontset.t
   trunk/t/PangoGravity.t
   trunk/t/PangoLayout.t
   trunk/t/PangoMatrix.t
   trunk/t/PangoRenderer.t
   trunk/t/PangoScript.t
   trunk/t/PangoTabs.t
   trunk/t/PangoTypes.t
   trunk/t/inc/
   trunk/t/inc/PangoTestHelper.pm
   trunk/xs/
   trunk/xs/Pango.xs
   trunk/xs/PangoAttributes.xs
   trunk/xs/PangoCairo.xs
   trunk/xs/PangoContext.xs
   trunk/xs/PangoFont.xs
   trunk/xs/PangoFontMap.xs
   trunk/xs/PangoFontset.xs
   trunk/xs/PangoGravity.xs
   trunk/xs/PangoLayout.xs
   trunk/xs/PangoMatrix.xs
   trunk/xs/PangoRenderer.xs
   trunk/xs/PangoScript.xs
   trunk/xs/PangoTabs.xs
   trunk/xs/PangoTypes.xs
   trunk/xs_files-1.0
   trunk/xs_files-1.10
   trunk/xs_files-1.16
   trunk/xs_files-1.6

Added: trunk/AUTHORS
==============================================================================
--- (empty file)
+++ trunk/AUTHORS	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,12 @@
+The Gtk2-Perl Team - contact us at gtk-perl-list gnome org
+==========================================================
+muppet                   scott at asofyet dot org
+Ross McFarland           rwmcfa1 at neces dot com
+Torsten Schoenfeld       kaffeetisch at web dot de
+Marc Lehmann             pcg at goof dot com
+Goran Thyni              goran at kirra dot net
+Joern Reder              joern at zyn dot de
+Chas Owens               alas at wilma dot widomaker dot com
+Guillaume Cottenceau     gc at mandrakesoft dot com
+
+gtk2-perl is covered by the LGPL -- see the file LICENSE for details.

Added: trunk/LICENSE
==============================================================================
--- (empty file)
+++ trunk/LICENSE	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,504 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 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.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+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 and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, 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 library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+  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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+  If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be 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.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+  9. 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 Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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 with
+this License.
+
+  11. 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 Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  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 library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library 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
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; 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.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+

Added: trunk/MAINTAINERS
==============================================================================
--- (empty file)
+++ trunk/MAINTAINERS	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,3 @@
+Torsten SchÃnfeld
+E-mail: tsch svn gnome org
+Userid: tsch

Added: trunk/MANIFEST
==============================================================================
--- (empty file)
+++ trunk/MANIFEST	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,56 @@
+AUTHORS
+ChangeLog
+copyright.pod
+doctypes
+lib/Pango.pm
+LICENSE
+MAINTAINERS
+Makefile.PL
+MANIFEST			This list of files
+MANIFEST.SKIP
+maps-1.0
+maps-1.10
+maps-1.16
+maps-1.18
+maps-1.4
+maps-1.6
+maps-1.8
+NEWS
+pango-perl-private.h
+pango-perl.h
+pango.exports
+pango.typemap
+README
+t/inc/PangoTestHelper.pm
+t/Pango.t
+t/PangoAttributes.t
+t/PangoCairo.t
+t/PangoContext.t
+t/PangoFont.t
+t/PangoFontMap.t
+t/PangoFontset.t
+t/PangoGravity.t
+t/PangoLayout.t
+t/PangoMatrix.t
+t/PangoRenderer.t
+t/PangoScript.t
+t/PangoTabs.t
+t/PangoTypes.t
+xs/Pango.xs
+xs/PangoAttributes.xs
+xs/PangoCairo.xs
+xs/PangoContext.xs
+xs/PangoFont.xs
+xs/PangoFontMap.xs
+xs/PangoFontset.xs
+xs/PangoGravity.xs
+xs/PangoLayout.xs
+xs/PangoMatrix.xs
+xs/PangoRenderer.xs
+xs/PangoScript.xs
+xs/PangoTabs.xs
+xs/PangoTypes.xs
+xs_files-1.0
+xs_files-1.10
+xs_files-1.16
+xs_files-1.6

Added: trunk/MANIFEST.SKIP
==============================================================================
--- (empty file)
+++ trunk/MANIFEST.SKIP	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,9 @@
+\.bak$
+\.svn
+blib
+build
+^Makefile$
+^Pango\.bs$
+^pm_to_blib$
+^xs/.*\.c$
+^xs/.*\.o$

Added: trunk/Makefile.PL
==============================================================================
--- (empty file)
+++ trunk/Makefile.PL	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,237 @@
+# Copyright (C) 2003-2007 by the gtk2-perl team (see the file AUTHORS for the
+# full list)
+#
+# This library is free software; you can redistribute it and/or modify it under
+# the terms of the GNU Library General Public License as published by the Free
+# Software Foundation; either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# This library 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 Library General Public License for
+# more details.
+#
+# You should have received a copy of the GNU Library General Public License
+# along with this library; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA.
+#
+# $Id$
+#
+
+BEGIN { require 5.008; }
+
+use strict;
+use warnings;
+
+use ExtUtils::MakeMaker;
+use File::Spec;
+use Cwd;
+
+# minimum required version of dependencies we need to build
+our %build_reqs = (
+	'perl-ExtUtils-Depends'   => '0.300',
+	'perl-ExtUtils-PkgConfig' => '1.030',
+	'perl-Glib'               => '1.200', # FIXME: 1.22
+	'perl-Cairo'              => '1.000',
+	'pango'                   => '1.0.0',
+);
+
+our %PREREQ_PM = (
+	'ExtUtils::Depends'   => $build_reqs{'perl-ExtUtils-Depends'},
+	'ExtUtils::PkgConfig' => $build_reqs{'perl-ExtUtils-PkgConfig'},
+	'Glib'                => $build_reqs{'perl-Glib'},
+);
+
+#
+# look for our prerequisites.  if they can't be found, warn and exit with
+# status 0 to indicate to CPAN testers that their system isn't supported.
+#
+unless (eval "use ExtUtils::Depends '$build_reqs{'perl-ExtUtils-Depends'}';"
+           . "use ExtUtils::PkgConfig '$build_reqs{'perl-ExtUtils-PkgConfig'}';"
+           . "use Glib '$build_reqs{'perl-Glib'}';"
+           . "use Glib::CodeGen;"
+           . "use Glib::MakeHelper;"
+           . "1") {
+	warn <<"__EOW__";
+Pre-requisites not found:
+$@
+Please install them manually.
+__EOW__
+	exit 0;
+}
+
+# all the generated stuff will go into this subdir...
+mkdir 'build', 0777;
+
+#
+# look for our packages.  if they can't be found, warn and exit with status 0
+# to indicate to CPAN testers that their system isn't supported.
+#
+my %pango_pkgcfg;
+unless (eval { %pango_pkgcfg = ExtUtils::PkgConfig->find ('pango'); 1; }) {
+	warn $@;
+	exit 0;
+}
+
+#
+# retrieve pango's version
+#
+my @pango_version = split /\./, $pango_pkgcfg{modversion};
+
+#
+# decide what files to use in the build based on the version we found.
+#
+my @xs_files = ();
+my @xs_lists =
+	Glib::MakeHelper->select_files_by_version ("xs_files", @pango_version);
+foreach my $filename (@xs_lists) {
+	my @names = Glib::MakeHelper->read_source_list_file ($filename);
+	push @xs_files, @names;
+}
+
+#
+# if pango >= 1.10, we depend on Cairo
+#
+my $have_cairo = 0;
+my %pangocairo_pkgcfg;
+if ($pango_version[0] > 1 || ($pango_version[0] == 1 && $pango_version[1] >= 10)) {
+	$PREREQ_PM{Cairo} = $build_reqs{'perl-Cairo'};
+	unless (eval "use Cairo '$build_reqs{'perl-Cairo'}'; 1;") {
+		warn <<"__EOW__";
+Pre-requisites not found:
+$@
+Please install them manually.
+__EOW__
+		exit 0;
+	}
+
+	unless (eval { %pangocairo_pkgcfg = ExtUtils::PkgConfig->find ('pangocairo'); 1; }) {
+		warn $@;
+		exit 0;
+	}
+
+	$have_cairo = 1;
+}
+
+=for FIXME
+
+#
+# generate the constants wrappers
+#
+my @constants_lists =
+	Glib::MakeHelper->select_files_by_version ('constants', @pango_version);
+my $constants_file = File::Spec->catfile ('build', 'constants.xs');
+Gtk2::CodeGen->generate_constants_wrappers (
+	prefix => 'Pango',
+	lists => \ constants_lists,
+	xs_file => $constants_file,
+	header => 'pango-perl.h',
+        export_tag => 'constants');
+push @xs_files, $constants_file;
+
+=cut
+
+#
+# create version macros
+#
+ExtUtils::PkgConfig->write_version_macros(
+	"build/pango-perl-versions.h",
+	pango => "PANGO",
+);
+
+#
+# since we've started down the dark path of breaking from standard MakeMaker,
+# forever will it dominate our destiny; we must specify install paths for the
+# modules and man files by hand.
+#
+our %pm_files = (
+	'lib/Pango.pm' => '$(INST_LIBDIR)/Pango.pm',
+);
+our %pod_files = (
+	'lib/Pango.pm' => '$(INST_MAN3DIR)/Pango.$(MAN3EXT)',
+	Glib::MakeHelper->do_pod_files (@xs_files),
+);
+
+#
+# autogeneration
+#
+# we have a whole lot of types which need cast macros, typemap entries,
+# and package mapping registration; instead of writing this by hand, we
+# use a set of map files which define how things are laid out, and then use
+# some boilerplate code to convert those mappings into a header, typemap,
+# and xsh file.  see the docs for Glib::CodeGen for more info.
+#
+# all possible maps must be available at xsubpp time, as xsubpp processes
+# all code, even inside #ifdefs.
+Glib::CodeGen->parse_maps ('pango-perl', input => [<maps-[0-9]\.[0-9]*>]);
+
+# one more command generates code to boot all the various extra XS modules.
+# we need this because we have lots of XS files without corresponding PMs to
+# bootstrap them.
+Glib::CodeGen->write_boot (xs_files => \ xs_files);
+
+#
+# now we're ready to start creating the makefile... finally.
+# we need to use ExtUtils::Depends to get relevant information out of
+# the Glib extension, and to save config information for other modules which
+# will chain from this one.
+#
+
+my @deps = qw/Glib/;
+my $inc = $pango_pkgcfg{cflags} . ' -I./build ';
+my $libs = $pango_pkgcfg{libs};
+if ($have_cairo) {
+	push @deps, qw/Cairo/;
+	$inc .= $pangocairo_pkgcfg{cflags};
+	$libs .= $pangocairo_pkgcfg{libs};
+}
+
+my @typemaps = map { File::Spec->catfile(cwd(), $_) }
+                   qw(build/pango-perl.typemap pango.typemap);
+
+my $pango = ExtUtils::Depends->new ('Pango', @deps);
+$pango->set_inc ($inc);
+$pango->set_libs ($libs);
+$pango->add_pm (%pm_files);
+$pango->add_xs (@xs_files);
+$pango->add_typemaps (@typemaps);
+
+$pango->install (qw(pango-perl.h
+                    build/pango-perl-autogen.h
+                    build/pango-perl-versions.h
+                    doctypes));
+$pango->save_config ('build/IFiles.pm');
+
+# exports list needed for win32, unused on others
+my @exports = Glib::MakeHelper->read_source_list_file ('pango.exports');
+
+my $configure_requires =
+  Glib::MakeHelper->get_configure_requires_yaml(%PREREQ_PM);
+
+WriteMakefile(
+    NAME          => 'Pango',
+    VERSION_FROM  => 'lib/Pango.pm',
+    ABSTRACT_FROM => 'lib/Pango.pm',
+    PREREQ_PM     => \%PREREQ_PM,
+    XSPROTOARG    => '-noprototypes',
+    MAN3PODS      => \%pod_files,
+    FUNCLIST      => \ exports,
+    DL_FUNCS      => { Pango => [] },
+
+    $pango->get_makefile_vars,
+
+    EXTRA_META    => $configure_requires,
+);
+
+#
+# extra makefile override stuff
+#
+sub MY::postamble
+{
+	return Glib::MakeHelper->postamble_clean ()
+	     . Glib::MakeHelper->postamble_docs_full (
+			DEPENDS => $pango,
+			DOCTYPES => 'doctypes',
+			COPYRIGHT_FROM => 'copyright.pod');
+
+}

Added: trunk/NEWS
==============================================================================
--- (empty file)
+++ trunk/NEWS	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,4 @@
+Overview of changes in Pango 1.190
+==================================
+
+* Initial release.

Added: trunk/README
==============================================================================
--- (empty file)
+++ trunk/README	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,91 @@
+Pango
+=====
+
+FIXME
+
+To discuss gtk2-perl, ask questions and flame/praise the authors,
+join gtk-perl-list gnome org at lists.gnome.org.
+
+Also have a look at the gtk2-perl website and sourceforge project page,
+http://gtk2-perl.sourceforge.net
+
+
+INSTALLATION
+------------
+
+To install this module type the following:
+
+   perl Makefile.PL
+   make
+   make test
+   make install
+
+To avoid installing to a system directory, since this is a beta release,
+you can change the installation prefix at Makefile.PL time with
+
+   perl Makefile.PL PREFIX=/some/other/place
+
+This will install the module to the subdirectory lib/perl5 under the given
+prefix.  If this is not already in perl's include path, you'll need to tell
+perl how to get to this library directory so you can use it; there are three
+ways:
+
+  in your environment (the easiest):
+    # assuming a bourne-style shell
+    PERL5LIB=/some/other/place/lib/perl5/site_perl
+    export PERL5LIB
+
+  on the perl command line:
+    perl -I /some/other/place/lib/perl5/site_perl yourscript
+
+  in the code of your perl script:
+    use lib '/some/other/place/lib/perl5/site_perl';
+
+
+DEPENDENCIES
+------------
+
+This module requires these other modules and libraries:
+
+  perl >= 5.8.0
+  Glib >= 1.200 (Perl module)
+  pango > 1.x (C library)
+
+If pango is as new or newer as 1.10, the Cairo module is also required:
+
+  Cairo >= 1.000 (Perl module)
+
+In order to build it from source, you'll also need
+
+  ExtUtils::Depends >= 0.300
+  ExtUtils::PkgConfig >= 1.030
+
+
+BUG REPORTS
+-----------
+
+Please report bugs to the gnome-perl product in GNOME's Bugzilla:
+<http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-perl>
+
+
+COPYRIGHT AND LICENSE
+---------------------
+
+Copyright (C) 2003-2008 by the gtk2-perl team (see the file AUTHORS for the
+full list)
+
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Library General Public License as published by the Free
+Software Foundation; either version 2.1 of the License, or (at your option) any
+later version.
+
+This library 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 Library General Public License for more
+details.
+
+You should have received a copy of the GNU Library General Public License along
+with this library; if not, write to the Free Software Foundation, Inc., 59
+Temple Place - Suite 330, Boston, MA  02111-1307  USA.
+
+# $Id: README,v 1.92 2008/06/22 17:26:55 kaffeetisch Exp $

Added: trunk/copyright.pod
==============================================================================
--- (empty file)
+++ trunk/copyright.pod	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,3 @@
+Copyright (C) 2003-2008 by the gtk2-perl team.
+
+This software is licensed under the LGPL.  See L<Pango> for a full notice.

Added: trunk/doctypes
==============================================================================
--- (empty file)
+++ trunk/doctypes	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,4 @@
+# C name        description
+# ------------  ----------------
+PangoRectangle	array reference
+PangoGlyph	integer

Added: trunk/lib/Pango.pm
==============================================================================
--- (empty file)
+++ trunk/lib/Pango.pm	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,121 @@
+#
+# Copyright (C) 2003-2008 by the gtk2-perl team (see the file AUTHORS for
+# the full list)
+#
+# This library is free software; you can redistribute it and/or modify it under
+# the terms of the GNU Library General Public License as published by the Free
+# Software Foundation; either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# This library 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 Library General Public License for
+# more details.
+#
+# You should have received a copy of the GNU Library General Public License
+# along with this library; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place - Suite 330, Boston, MA  02111-1307  USA.
+#
+# $Id$
+#
+
+package Pango;
+
+use 5.008;
+use strict;
+use warnings;
+
+use Glib;
+
+# if pango is at 1.10.0 or newer, we need to import the Cairo module for the
+# cairo glue in pango.
+eval "use Cairo;";
+
+use Exporter;
+require DynaLoader;
+
+our $VERSION = '1.190';
+
+our @ISA = qw(DynaLoader Exporter);
+
+sub dl_load_flags { $^O eq 'darwin' ? 0x00 : 0x01 }
+
+# now load the XS code.
+Pango->bootstrap ($VERSION);
+
+# %Pango::EXPORT_TAGS is filled from the constants-x.y files by the generated XS
+# code in build/constants.xs
+our @EXPORT_OK = map { @$_ } values %Pango::EXPORT_TAGS;
+$Pango::EXPORT_TAGS{all} = \ EXPORT_OK;
+
+1;
+__END__
+# documentation is a good thing.
+
+=head1 NAME
+
+Pango - FIXME
+
+=head1 SYNOPSIS
+
+  FIXME
+
+=head1 ABSTRACT
+
+FIXME
+
+=head1 DESCRIPTION
+
+FIXME
+
+=head1 EXPORTS
+
+Pango exports nothing by default, but some constants are available upon request.
+
+=over
+
+=item Tag: constants
+
+  FIXME
+
+=back
+
+=head1 SEE ALSO
+
+L<perl>(1), L<Glib>(3pm), L<Gtk2>(3pm).
+
+L<Pango::index>(3pm) lists the autogenerated api documentation pod files for
+Pango.1
+
+=head1 AUTHORS
+
+The gtk2-perl team:
+
+ muppet <scott at asofyet dot org>
+ Ross McFarland <rwmcfa1 at neces dot com>
+ Torsten Schoenfeld <kaffeetisch at web dot de>
+ Marc Lehmann <pcg at goof dot com>
+ GÃran Thyni <gthyni at kirra dot net>
+ JÃrn Reder <joern at zyn dot de>
+ Chas Owens <alas at wilma dot widomaker dot com>
+ Guillaume Cottenceau <gc at mandrakesoft dot com>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2003-2008 by the gtk2-perl team.
+
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Library General Public License as published by the Free
+Software Foundation; either version 2 of the License, or (at your option) any
+later version.
+
+This library 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 Library General Public License for more
+details.
+
+You should have received a copy of the GNU Library General Public License along
+with this library; if not, write to the Free Software Foundation, Inc., 59
+Temple Place - Suite 330, Boston, MA 02111-1307 USA.
+
+=cut

Added: trunk/maps-1.0
==============================================================================
--- (empty file)
+++ trunk/maps-1.0	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,37 @@
+#
+# this file defines mappings only for types that existed in pango 1.0.x
+#
+
+PANGO_TYPE_ALIGNMENT	PangoAlignment	GEnum	Pango::Alignment
+PANGO_TYPE_ATTR_LIST	PangoAttrList	GBoxed	Pango::AttrList
+PANGO_TYPE_ATTR_TYPE	PangoAttrType	GEnum	Pango::AttrType
+PANGO_TYPE_COLOR	PangoColor	GBoxed	Pango::Color
+PANGO_TYPE_CONTEXT	PangoContext	GObject	Pango::Context
+PANGO_TYPE_COVERAGE_LEVEL	PangoCoverageLevel	GEnum	Pango::CoverageLevel
+PANGO_TYPE_DIRECTION	PangoDirection	GEnum	Pango::Direction
+PANGO_TYPE_FONT_DESCRIPTION	PangoFontDescription	GBoxed	Pango::FontDescription
+PANGO_TYPE_FONT_FACE	PangoFontFace	GObject	Pango::FontFace
+PANGO_TYPE_FONT_FAMILY	PangoFontFamily	GObject	Pango::FontFamily
+PANGO_TYPE_FONT_MAP	PangoFontMap	GObject	Pango::FontMap
+PANGO_TYPE_FONT_MASK	PangoFontMask	GFlags	Pango::FontMask
+PANGO_TYPE_FONT_METRICS	PangoFontMetrics	GBoxed	Pango::FontMetrics
+PANGO_TYPE_FONT	PangoFont	GObject	Pango::Font
+PANGO_TYPE_FONTSET	PangoFontset	GObject	Pango::Fontset
+PANGO_TYPE_GLYPH_STRING	PangoGlyphString	GBoxed	Pango::GlyphString
+PANGO_TYPE_LANGUAGE	PangoLanguage	GBoxed	Pango::Language
+PANGO_TYPE_LAYOUT	PangoLayout	GObject	Pango::Layout
+PANGO_TYPE_SCRIPT	PangoScript	GEnum	Pango::Script
+PANGO_TYPE_STRETCH	PangoStretch	GEnum	Pango::Stretch
+PANGO_TYPE_STYLE	PangoStyle	GEnum	Pango::Style
+PANGO_TYPE_TAB_ALIGN	PangoTabAlign	GEnum	Pango::TabAlign
+PANGO_TYPE_TAB_ARRAY	PangoTabArray	GBoxed	Pango::TabArray
+PANGO_TYPE_UNDERLINE	PangoUnderline	GEnum	Pango::Underline
+PANGO_TYPE_VARIANT	PangoVariant	GEnum	Pango::Variant
+PANGO_TYPE_WEIGHT	PangoWeight	GEnum	Pango::Weight
+PANGO_TYPE_WRAP_MODE	PangoWrapMode	GEnum	Pango::WrapMode
+
+# custom types
+PANGO_TYPE_ATTRIBUTE		PangoAttribute		GBoxed	Pango::Attribute
+PANGO_TYPE_ATTR_ITERATOR	PangoAttrIterator	GBoxed	Pango::AttrIterator
+PANGO_TYPE_LAYOUT_ITER		PangoLayoutIter		GBoxed	Pango::LayoutIter
+PANGO_TYPE_LAYOUT_LINE		PangoLayoutLine		GBoxed	Pango::LayoutLine

Added: trunk/maps-1.10
==============================================================================
--- (empty file)
+++ trunk/maps-1.10	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,5 @@
+#
+# this file defines mappings only for types that existed in pango 1.10.x
+#
+
+PANGO_TYPE_CAIRO_FONT_MAP	PangoCairoFontMap	GInterface	Pango::Cairo::FontMap

Added: trunk/maps-1.16
==============================================================================
--- (empty file)
+++ trunk/maps-1.16	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,6 @@
+#
+# this file defines mappings only for types that existed in pango 1.16.x
+#
+
+PANGO_TYPE_GRAVITY	PangoGravity		GEnum	Pango::Gravity
+PANGO_TYPE_GRAVITY_HINT	PangoGravityHint	GEnum	Pango::GravityHint

Added: trunk/maps-1.18
==============================================================================
--- (empty file)
+++ trunk/maps-1.18	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,5 @@
+#
+# this file defines mappings only for types that existed in pango 1.18.x
+#
+
+PANGO_TYPE_CAIRO_FONT	PangoCairoFont	GInterface	Pango::Cairo::Font

Added: trunk/maps-1.4
==============================================================================
--- (empty file)
+++ trunk/maps-1.4	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,5 @@
+#
+# this file defines mappings only for types that existed in pango 1.4.x
+#
+
+PANGO_TYPE_SCRIPT_ITER	PangoScriptIter	GBoxed	Pango::ScriptIter

Added: trunk/maps-1.6
==============================================================================
--- (empty file)
+++ trunk/maps-1.6	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,6 @@
+#
+# this file defines mappings only for types that existed in pango 1.6.x
+#
+
+PANGO_TYPE_MATRIX	PangoMatrix	GBoxed	Pango::Matrix
+PANGO_TYPE_ELLIPSIZE_MODE	PangoEllipsizeMode	GEnum	Pango::EllipsizeMode

Added: trunk/maps-1.8
==============================================================================
--- (empty file)
+++ trunk/maps-1.8	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,7 @@
+#
+# this file defines mappings only for types that existed in pango 1.8.x
+#
+
+PANGO_TYPE_RENDERER		PangoRenderer		GObject		Pango::Renderer
+
+PANGO_TYPE_RENDER_PART		PangoRenderPart		GEnum		Pango::RenderPart

Added: trunk/pango-perl-private.h
==============================================================================
--- (empty file)
+++ trunk/pango-perl-private.h	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2003-2008 by the gtk2-perl team (see the file AUTHORS for the
+ * full list)
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ *
+ * This library 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 Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307  USA.
+ *
+ * THIS IS A PRIVATE HEADER FOR USE ONLY IN Pango ITSELF.
+ *
+ * $Id$
+ */
+
+#ifndef _PANGO_PERL_PRIVATE_H_
+#define _PANGO_PERL_PRIVATE_H_
+
+#include "pango-perl.h"
+
+/* Implemented in PangoAttributes.xs. */
+void gtk2perl_pango_attribute_register_custom_type (PangoAttrType type, const char *package);
+
+#define GTK2PERL_PANGO_ATTR_REGISTER_CUSTOM_TYPE(attr, package)	\
+{								\
+	static gboolean type_registered_already = FALSE;	\
+	if (!type_registered_already) {				\
+		gtk2perl_pango_attribute_register_custom_type	\
+			((attr)->klass->type, package);		\
+		type_registered_already = TRUE;			\
+	}							\
+}
+
+#define GTK2PERL_PANGO_ATTR_STORE_INDICES(offset, attr)	\
+	if (items == offset + 2) {			\
+		guint start = SvUV (ST (offset));	\
+		guint end = SvUV (ST (offset + 1));	\
+		attr->start_index = start;		\
+		attr->end_index = end;			\
+	}
+
+#endif /* _PANGO_PERL_PRIVATE_H_ */

Added: trunk/pango-perl.h
==============================================================================
--- (empty file)
+++ trunk/pango-perl.h	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,74 @@
+/*
+ *
+ * Copyright (C) 2003-2008 by the gtk2-perl team (see the file AUTHORS for the
+ * full list)
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ *
+ * This library 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 Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307  USA.
+ *
+ *
+ * $Id$
+ */
+
+#ifndef _PANGO_PERL_H_
+#define _PANGO_PERL_H_
+
+#include <gperl.h>
+#include <pango/pango.h>
+
+#include "pango-perl-versions.h"
+
+#if PANGO_CHECK_VERSION (1, 10, 0)
+# include <pango/pangocairo.h>
+#endif
+
+/* custom GType for PangoAttribute */
+#ifndef PANGO_TYPE_ATTRIBUTE
+# define PANGO_TYPE_ATTRIBUTE (gtk2perl_pango_attribute_get_type ())
+  GType gtk2perl_pango_attribute_get_type (void) G_GNUC_CONST;
+#endif
+
+/* custom GType for PangoAttrIter */
+#ifndef PANGO_TYPE_ATTR_ITERATOR
+# define PANGO_TYPE_ATTR_ITERATOR (gtk2perl_pango_attr_iterator_get_type ())
+  GType gtk2perl_pango_attr_iterator_get_type (void) G_GNUC_CONST;
+#endif
+
+/* custom GType for PangoLayoutIter */
+#ifndef PANGO_TYPE_LAYOUT_ITER
+# define PANGO_TYPE_LAYOUT_ITER (gtk2perl_pango_layout_iter_get_type ())
+  GType gtk2perl_pango_layout_iter_get_type (void) G_GNUC_CONST;
+#endif
+
+/* custom GType for PangoLayoutLine */
+#ifndef PANGO_TYPE_LAYOUT_LINE
+# define PANGO_TYPE_LAYOUT_LINE (gtk2perl_pango_layout_line_get_type ())
+  GType gtk2perl_pango_layout_line_get_type (void) G_GNUC_CONST;
+#endif
+
+/* custom GType for PangoScriptIter */
+#if PANGO_CHECK_VERSION (1, 4, 0)
+# ifndef PANGO_TYPE_SCRIPT_ITER
+#  define PANGO_TYPE_SCRIPT_ITER (gtk2perl_pango_script_iter_get_type ())
+   GType gtk2perl_pango_script_iter_get_type (void) G_GNUC_CONST;
+# endif
+#endif
+
+#include "pango-perl-autogen.h"
+
+/* exported for various other parts of pango */
+SV * newSVPangoRectangle (PangoRectangle * rectangle);
+PangoRectangle * SvPangoRectangle (SV * sv);
+
+#endif /* _PANGO_PERL_H_ */

Added: trunk/pango.exports
==============================================================================
--- (empty file)
+++ trunk/pango.exports	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,6 @@
+#
+# $Id$
+#
+
+newSVPangoRectangle
+SvPangoRectangle

Added: trunk/pango.typemap
==============================================================================
--- (empty file)
+++ trunk/pango.typemap	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,12 @@
+#
+# Copyright (C) 2004 by the gtk2-perl team (see the file AUTHORS)
+#
+# Licensed under the LGPL, see LICENSE file for more information.
+#
+# $Id$
+#
+
+TYPEMAP
+
+PangoGlyph		T_UV
+PangoRectangle *	T_GPERL_GENERIC_WRAPPER

Added: trunk/t/Pango.t
==============================================================================
--- (empty file)
+++ trunk/t/Pango.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,11 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Test::More tests => 4;
+
+use_ok ('Pango');
+
+my @version = Pango->GET_VERSION_INFO;
+is (@version, 3, 'version info is three items long');
+ok (Pango->CHECK_VERSION(0, 0, 0), 'CHECK_VERSION pass');
+ok (!Pango->CHECK_VERSION(50, 0, 0), 'CHECK_VERSION fail');

Added: trunk/t/PangoAttributes.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoAttributes.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,574 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper tests => 202;
+
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/t/PangoAttributes.t,v 1.5 2007/07/22 21:43:45 kaffeetisch Exp $
+
+#
+# pango_color_parse(), pango_color_to_string()
+#
+
+my $color = Pango::Color->parse ('white');
+isa_ok ($color, 'Pango::Color');
+isa_ok ($color, 'ARRAY');
+is_deeply ($color, [0xffff, 0xffff, 0xffff]);
+
+SKIP: {
+	skip 'new 1.16 stuff', 2
+		unless Pango->CHECK_VERSION (1, 16, 0);
+
+	is (Pango::Color->to_string ($color), '#ffffffffffff');
+	is ($color->to_string, '#ffffffffffff');
+}
+
+#
+# PangoAttrLanguage
+#
+
+my $lang = Pango::Language->from_string ('de-de');
+my $attr = Pango::AttrLanguage->new ($lang);
+isa_ok ($attr, 'Pango::AttrLanguage');
+isa_ok ($attr, 'Pango::Attribute');
+is ($attr->value->to_string, 'de-de');
+
+$lang = Pango::Language->from_string ('en-us');
+$attr->value ($lang);
+is ($attr->value->to_string, 'en-us');
+
+$attr = Pango::AttrLanguage->new ($lang, 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrFamily
+#
+
+$attr = Pango::AttrFamily->new ('sans');
+isa_ok ($attr, 'Pango::AttrFamily');
+isa_ok ($attr, 'Pango::AttrString');
+isa_ok ($attr, 'Pango::Attribute');
+is ($attr->value, 'sans');
+
+is ($attr->value ('sans-serif'), 'sans');
+is ($attr->value, 'sans-serif');
+
+$attr = Pango::AttrFamily->new ('sans', 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrForeground
+#
+
+$attr = Pango::AttrForeground->new (0, 0, 0);
+isa_ok ($attr, 'Pango::AttrForeground');
+isa_ok ($attr, 'Pango::AttrColor');
+isa_ok ($attr, 'Pango::Attribute');
+is_deeply ($attr->value, [0, 0, 0]);
+
+is_deeply ($attr->value ([0xffff, 0xffff, 0xffff]), [0, 0, 0]);
+is_deeply ($attr->value, [0xffff, 0xffff, 0xffff]);
+
+$attr = Pango::AttrForeground->new (0, 0, 0, 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrBackground
+#
+
+$attr = Pango::AttrBackground->new (0, 0, 0);
+isa_ok ($attr, 'Pango::AttrBackground');
+isa_ok ($attr, 'Pango::AttrColor');
+isa_ok ($attr, 'Pango::Attribute');
+is_deeply ($attr->value, [0, 0, 0]);
+
+$attr->value ([0xffff, 0xffff, 0xffff]);
+is_deeply ($attr->value, [0xffff, 0xffff, 0xffff]);
+
+$attr = Pango::AttrBackground->new (0, 0, 0, 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrSize
+#
+
+$attr = Pango::AttrSize->new (23);
+isa_ok ($attr, 'Pango::AttrSize');
+isa_ok ($attr, 'Pango::AttrInt');
+isa_ok ($attr, 'Pango::Attribute');
+is ($attr->value, 23);
+
+$attr->value (42);
+is ($attr->value, 42);
+
+$attr = Pango::AttrSize->new (23, 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+SKIP: {
+	skip 'Pango::AttrSize->new_absolute', 7
+		unless Pango->CHECK_VERSION (1, 8, 0);
+
+	$attr = Pango::AttrSize->new_absolute (23);
+	isa_ok ($attr, 'Pango::AttrSize');
+	isa_ok ($attr, 'Pango::AttrInt');
+	isa_ok ($attr, 'Pango::Attribute');
+	is ($attr->value, 23);
+
+	$attr->value (42);
+	is ($attr->value, 42);
+
+	$attr = Pango::AttrSize->new_absolute (23, 23, 42);
+	is ($attr->start_index, 23);
+	is ($attr->end_index, 42);
+}
+
+#
+# PangoAttrStyle
+#
+
+$attr = Pango::AttrStyle->new ('normal');
+isa_ok ($attr, 'Pango::AttrStyle');
+isa_ok ($attr, 'Pango::Attribute');
+is ($attr->value, 'normal');
+
+$attr->value ('italic');
+is ($attr->value, 'italic');
+
+$attr = Pango::AttrStyle->new ('normal', 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrWeight
+#
+
+$attr = Pango::AttrWeight->new ('bold');
+isa_ok ($attr, 'Pango::AttrWeight');
+isa_ok ($attr, 'Pango::Attribute');
+is ($attr->value, 'bold');
+
+$attr->value ('heavy');
+is ($attr->value, 'heavy');
+
+$attr = Pango::AttrWeight->new ('bold', 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrVariant
+#
+
+$attr = Pango::AttrVariant->new ('normal');
+isa_ok ($attr, 'Pango::AttrVariant');
+isa_ok ($attr, 'Pango::Attribute');
+is ($attr->value, 'normal');
+
+$attr->value ('small-caps');
+is ($attr->value, 'small-caps');
+
+$attr = Pango::AttrVariant->new ('normal', 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrStretch
+#
+
+$attr = Pango::AttrStretch->new ('normal');
+isa_ok ($attr, 'Pango::AttrStretch');
+isa_ok ($attr, 'Pango::Attribute');
+is ($attr->value, 'normal');
+
+$attr->value ('condensed');
+is ($attr->value, 'condensed');
+
+$attr = Pango::AttrStretch->new ('normal', 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrUnderline
+#
+
+$attr = Pango::AttrUnderline->new ('none');
+isa_ok ($attr, 'Pango::AttrUnderline');
+isa_ok ($attr, 'Pango::Attribute');
+is ($attr->value, 'none');
+
+$attr->value ('double');
+is ($attr->value, 'double');
+
+$attr = Pango::AttrUnderline->new ('none', 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrStrikethrough
+#
+
+$attr = Pango::AttrStrikethrough->new (FALSE);
+isa_ok ($attr, 'Pango::AttrStrikethrough');
+isa_ok ($attr, 'Pango::Attribute');
+ok (!$attr->value);
+
+$attr->value (TRUE);
+ok ($attr->value);
+
+$attr = Pango::AttrStrikethrough->new (FALSE, 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrFontDesc
+#
+
+my $desc = Pango::FontDescription->from_string ('Sans 12');
+$attr = Pango::AttrFontDesc->new ($desc);
+isa_ok ($attr, 'Pango::AttrFontDesc');
+isa_ok ($attr, 'Pango::Attribute');
+is ($attr->desc->to_string, 'Sans 12');
+
+$desc = Pango::FontDescription->from_string ('Sans 14');
+is ($attr->desc ($desc)->to_string, 'Sans 12');
+is ($attr->desc->to_string, 'Sans 14');
+
+$attr = Pango::AttrFontDesc->new ($desc, 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrScale
+#
+
+$attr = Pango::AttrScale->new (2.0);
+isa_ok ($attr, 'Pango::AttrScale');
+isa_ok ($attr, 'Pango::Attribute');
+is ($attr->value, 2.0);
+
+$attr->value (4.0);
+is ($attr->value, 4.0);
+
+$attr = Pango::AttrScale->new (2.0, 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrRise
+#
+
+$attr = Pango::AttrRise->new (23);
+isa_ok ($attr, 'Pango::AttrRise');
+isa_ok ($attr, 'Pango::Attribute');
+is ($attr->value, 23);
+
+$attr->value (42);
+is ($attr->value, 42);
+
+$attr = Pango::AttrRise->new (23, 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrShape
+#
+
+my $ink     = { x => 23, y => 42, width => 10, height => 15 };
+my $logical = { x => 42, y => 23, width => 15, height => 10 };
+
+$attr = Pango::AttrShape->new ($ink, $logical);
+isa_ok ($attr, 'Pango::AttrShape');
+isa_ok ($attr, 'Pango::Attribute');
+is_deeply ($attr->ink_rect, $ink);
+is_deeply ($attr->logical_rect, $logical);
+
+$attr->ink_rect ($logical);
+is_deeply ($attr->ink_rect, $logical);
+$attr->logical_rect ($ink);
+is_deeply ($attr->logical_rect, $ink);
+
+$attr = Pango::AttrShape->new ($ink, $logical, 23, 42);
+is ($attr->start_index, 23);
+is ($attr->end_index, 42);
+
+#
+# PangoAttrFallback
+#
+
+SKIP: {
+	skip 'Pango::AttrFallback', 6
+		unless Pango->CHECK_VERSION (1, 4, 0);
+
+	$attr = Pango::AttrFallback->new (FALSE);
+	isa_ok ($attr, 'Pango::AttrFallback');
+	isa_ok ($attr, 'Pango::Attribute');
+	ok (!$attr->value);
+
+	$attr->value (TRUE);
+	ok ($attr->value);
+
+	$attr = Pango::AttrFallback->new (FALSE, 23, 42);
+	is ($attr->start_index, 23);
+	is ($attr->end_index, 42);
+}
+
+#
+# PangoAttrLetterSpacing
+#
+
+SKIP: {
+	skip 'Pango::AttrLetterSpacing', 7
+		unless Pango->CHECK_VERSION (1, 6, 0);
+
+	$attr = Pango::AttrLetterSpacing->new (23);
+	isa_ok ($attr, 'Pango::AttrLetterSpacing');
+	isa_ok ($attr, 'Pango::AttrInt');
+	isa_ok ($attr, 'Pango::Attribute');
+	is ($attr->value, 23);
+
+	$attr->value (42);
+	is ($attr->value, 42);
+
+	$attr = Pango::AttrLetterSpacing->new (23, 23, 42);
+	is ($attr->start_index, 23);
+	is ($attr->end_index, 42);
+}
+
+#
+# PangoAttrUnderlineColor
+#
+
+SKIP: {
+	skip 'Pango::AttrUnderlineColor', 8
+		unless Pango->CHECK_VERSION (1, 8, 0);
+
+	$attr = Pango::AttrUnderlineColor->new (0, 0, 0);
+	isa_ok ($attr, 'Pango::AttrUnderlineColor');
+	isa_ok ($attr, 'Pango::AttrColor');
+	isa_ok ($attr, 'Pango::Attribute');
+	is_deeply ($attr->value, [0, 0, 0]);
+
+	is_deeply ($attr->value ([0xffff, 0xffff, 0xffff]), [0, 0, 0]);
+	is_deeply ($attr->value, [0xffff, 0xffff, 0xffff]);
+
+	$attr = Pango::AttrUnderlineColor->new (0, 0, 0, 23, 42);
+	is ($attr->start_index, 23);
+	is ($attr->end_index, 42);
+}
+
+#
+# PangoAttrStrikethroughColor
+#
+
+SKIP: {
+	skip 'Pango::AttrStrikethroughColor', 8
+		unless Pango->CHECK_VERSION (1, 8, 0);
+
+	$attr = Pango::AttrStrikethroughColor->new (0, 0, 0);
+	isa_ok ($attr, 'Pango::AttrStrikethroughColor');
+	isa_ok ($attr, 'Pango::AttrColor');
+	isa_ok ($attr, 'Pango::Attribute');
+	is_deeply ($attr->value, [0, 0, 0]);
+
+	is_deeply ($attr->value ([0xffff, 0xffff, 0xffff]), [0, 0, 0]);
+	is_deeply ($attr->value, [0xffff, 0xffff, 0xffff]);
+
+	$attr = Pango::AttrStrikethroughColor->new (0, 0, 0, 23, 42);
+	is ($attr->start_index, 23);
+	is ($attr->end_index, 42);
+}
+
+#
+# PangoAttrGravity, PangoAttrGravityHint
+#
+
+SKIP: {
+	skip 'PangoAttrGravity, PangoAttrGravityHint', 14
+		unless Pango->CHECK_VERSION (1, 16, 0);
+
+	$attr = Pango::AttrGravity->new ('south');
+	isa_ok ($attr, 'Pango::AttrGravity');
+	isa_ok ($attr, 'Pango::Attribute');
+	is ($attr->value, 'south');
+
+	is ($attr->value ('north'), 'south');
+	is ($attr->value, 'north');
+
+	$attr = Pango::AttrGravity->new ('south', 23, 42);
+	is ($attr->start_index, 23);
+	is ($attr->end_index, 42);
+
+	$attr = Pango::AttrGravityHint->new ('strong');
+	isa_ok ($attr, 'Pango::AttrGravityHint');
+	isa_ok ($attr, 'Pango::Attribute');
+	is ($attr->value, 'strong');
+
+	is ($attr->value ('line'), 'strong');
+	is ($attr->value, 'line');
+
+	$attr = Pango::AttrGravityHint->new ('strong', 23, 42);
+	is ($attr->start_index, 23);
+	is ($attr->end_index, 42);
+}
+
+#
+# PangoAttrList
+#
+
+my $attr_one = Pango::AttrWeight->new ('light', 23, 42);
+my $attr_two = Pango::AttrWeight->new ('normal', 23, 42);
+my $attr_three = Pango::AttrWeight->new ('bold', 23, 42);
+
+my $list_one = Pango::AttrList->new;
+$list_one->insert ($attr_one);
+$list_one->insert_before ($attr_two);
+$list_one->change ($attr_three);
+
+my $list_two = Pango::AttrList->new;
+$list_one->insert ($attr_three);
+$list_one->insert_before ($attr_two);
+$list_one->change ($attr_one);
+
+$list_one->splice ($list_two, 0, 2);
+
+#
+# PangoAttrIterator
+#
+
+my $list = Pango::AttrList->new;
+
+my $attr_weight = Pango::AttrWeight->new ('normal', 0, 23);
+$list->insert ($attr_weight);
+
+my $attr_variant = Pango::AttrVariant->new ('normal', 0, 42);
+$list->insert ($attr_variant);
+
+my $iter = $list->get_iterator;
+isa_ok ($iter, 'Pango::AttrIterator');
+
+is_deeply ([$iter->range], [0, 23]);
+ok ($iter->get ('weight')->equal ($attr_weight));
+
+my @attrs = $iter->get_attrs;
+is (scalar @attrs, 2);
+ok ($attrs[1]->equal ($attr_variant));
+
+ok ($iter->next);
+ok ($iter->next);
+
+ attrs = $iter->get_attrs;
+is (scalar @attrs, 0);
+
+is ($iter->get ('weight'), undef);
+
+# get_font
+$list = Pango::AttrList->new;
+
+$lang = Pango::Language->from_string ('de-de');
+$attr = Pango::AttrLanguage->new ($lang, 0, 23);
+$list->insert($attr);
+
+$attr = Pango::AttrWeight->new ('bold', 0, 23);
+$list->insert($attr);
+
+$iter = $list->get_iterator;
+my ($desc_new, $lang_new, @extra) = $iter->get_font;
+is ($desc_new->get_weight, 'bold');
+is ($lang_new->to_string, 'de-de');
+is (scalar @extra, 0);
+
+$attr = Pango::AttrBackground->new (0, 0, 0, 0, 23);
+$list->insert($attr);
+
+$attr = Pango::AttrForeground->new (0, 0, 0, 0, 23);
+$list->insert($attr);
+
+$iter = $list->get_iterator;
+($desc_new, $lang_new, @extra) = $iter->get_font;
+is ($desc_new->get_weight, 'bold');
+is ($lang_new->to_string, 'de-de');
+is (scalar @extra, 2);
+isa_ok ($extra[0], 'Pango::AttrBackground');
+isa_ok ($extra[1], 'Pango::AttrForeground');
+
+# filter
+SKIP: {
+	skip 'filter', 12
+		unless Pango->CHECK_VERSION (1, 2, 0);
+
+	# run four times -> 8 tests
+	my $callback = sub {
+	  my ($attr, $data) = @_;
+	  isa_ok ($attr, 'Pango::Attribute');
+	  is ($data, 'urgs');
+	  return $attr->isa ('Pango::AttrWeight');
+	};
+
+	my $list_new = $list->filter ($callback, 'urgs');
+	$iter = $list_new->get_iterator;
+	@attrs = $iter->get_attrs;
+	is (scalar @attrs, 1);
+	isa_ok ($attrs[0], 'Pango::AttrWeight');
+	ok ($iter->next);
+	ok (!$iter->next);
+}
+
+#
+# pango_parse_markup()
+#
+
+my ($attr_list, $text, $accel_char) =
+	Pango->parse_markup
+		('<big>this text is <i>really</i> cool</big> (no lie)');
+isa_ok ($attr_list, 'Pango::AttrList');
+is ($text, 'this text is really cool (no lie)', 'text is stripped of tags');
+ok ((not defined $accel_char), 'no accel_char if no accel_marker');
+
+{
+	# first, only <big>
+	my $iter = $attr_list->get_iterator;
+	my @attrs = $iter->get_attrs;
+	is (scalar @attrs, 1);
+	isa_ok ($attrs[0], 'Pango::AttrScale');
+
+	# then, <big> and <i>
+	$iter->next;
+	@attrs = $iter->get_attrs;
+	is (scalar @attrs, 2);
+	isa_ok ($attrs[0], 'Pango::AttrScale');
+	isa_ok ($attrs[1], 'Pango::AttrStyle');
+
+	# finally, only <big> again
+	$iter->next;
+	@attrs = $iter->get_attrs;
+	is (scalar @attrs, 1);
+	isa_ok ($attrs[0], 'Pango::AttrScale');
+}
+
+($attr_list, $text) = Pango->parse_markup ('no markup here');
+isa_ok ($attr_list, 'Pango::AttrList');
+is ($text, 'no markup here', 'no tags, nothing stripped');
+
+($attr_list, $text, $accel_char) =
+	Pango->parse_markup ('Text with _accel__chars', '_');
+isa_ok ($attr_list, 'Pango::AttrList');
+is ($text, 'Text with accel_chars');
+is ($accel_char, 'a');
+
+# invalid markup causes an exception...
+eval { Pango->parse_markup ('<bad>invalid markup') };
+isa_ok ($@, 'Glib::Error');
+isa_ok ($@, 'Glib::Markup::Error');
+is ($ ->domain, 'g-markup-error-quark');
+ok ($ ->matches ('Glib::Markup::Error', 'unknown-element'),
+    'invalid markup causes exceptions');
+$@ = undef;
+
+__END__
+
+Copyright (C) 2005-2006 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoCairo.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoCairo.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,138 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper;
+
+if (UNIVERSAL::can("Pango::Cairo::FontMap", "new") &&
+    Pango -> CHECK_VERSION(1, 10, 0)) {
+  plan tests => 22;
+} else {
+  plan skip_all => "PangoCairo stuff: need Cairo and pango >= 1.10.0";
+}
+
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/t/PangoCairo.t,v 1.10 2008/03/30 19:31:44 kaffeetisch Exp $
+
+my $fontmap = Pango::Cairo::FontMap -> new();
+isa_ok($fontmap, "Pango::Cairo::FontMap");
+isa_ok($fontmap, "Pango::FontMap");
+
+SKIP: {
+  skip 'new 1.18 stuff', 3
+    unless Pango -> CHECK_VERSION(1, 18, 0);
+
+  $fontmap = Pango::Cairo::FontMap -> new_for_font_type('ft');
+
+  skip 'new_for_font_type returned undef', 3
+    unless defined $fontmap;
+
+  isa_ok($fontmap, "Pango::Cairo::FontMap");
+  isa_ok($fontmap, "Pango::FontMap");
+  is($fontmap -> get_font_type(), 'ft');
+}
+
+$fontmap = Pango::Cairo::FontMap -> get_default();
+isa_ok($fontmap, "Pango::Cairo::FontMap");
+isa_ok($fontmap, "Pango::FontMap");
+
+$fontmap -> set_resolution(72);
+is($fontmap -> get_resolution(), 72);
+
+my $context = $fontmap -> create_context();
+isa_ok($context, "Pango::Context");
+
+# Just to make sure this is a valid Pango::FontMap
+isa_ok(($fontmap -> list_families())[0], "Pango::FontFamily");
+
+my $target = Cairo::ImageSurface -> create("argb32", 100, 100);
+my $cr = Cairo::Context -> create($target);
+
+Pango::Cairo::update_context($cr, $context);
+
+my $options = Cairo::FontOptions -> create();
+
+# Function interface
+{
+  Pango::Cairo::Context::set_font_options($context, $options);
+  isa_ok(Pango::Cairo::Context::get_font_options($context),
+         "Cairo::FontOptions");
+
+  Pango::Cairo::Context::set_resolution($context, 72);
+  is(Pango::Cairo::Context::get_resolution($context), 72);
+}
+
+# Method interface
+{
+  isa_ok($context, "Pango::Cairo::Context");
+
+  $context -> set_font_options($options);
+  isa_ok($context -> get_font_options(), "Cairo::FontOptions");
+
+  $context -> set_resolution(72);
+  is($context -> get_resolution(), 72);
+}
+
+my $layout = Pango::Cairo::create_layout($cr);
+isa_ok($layout, "Pango::Layout");
+
+my $line = $layout -> get_line(0);
+
+Pango::Cairo::show_layout_line($cr, $line);
+Pango::Cairo::show_layout($cr, $layout);
+Pango::Cairo::layout_line_path($cr, $line);
+Pango::Cairo::layout_path($cr, $layout);
+
+Pango::Cairo::update_layout($cr, $layout);
+
+# FIXME: pango_cairo_show_glyph_string, pango_cairo_glyph_string_path.
+
+SKIP: {
+  skip "error line stuff", 0
+    unless Pango -> CHECK_VERSION(1, 14, 0);
+
+  Pango::Cairo::show_error_underline($cr, 23, 42, 5, 5);
+  Pango::Cairo::error_underline_path($cr, 23, 42, 5, 5);
+}
+
+SKIP: {
+  skip 'new 1.18 stuff', 6
+    unless Pango -> CHECK_VERSION(1, 18, 0);
+
+  $context -> set_shape_renderer(undef, undef);
+
+  my $target = Cairo::ImageSurface -> create('argb32', 100, 100);
+  my $cr = Cairo::Context -> create($target);
+
+  my $layout = Pango::Cairo::create_layout($cr);
+  Pango::Cairo::Context::set_shape_renderer(
+    $layout -> get_context(),
+    sub {
+      my ($cr, $shape, $do_path, $data) = @_;
+
+      isa_ok($cr, 'Cairo::Context');
+      isa_ok($shape, 'Pango::AttrShape');
+      ok(defined $do_path);
+      is($data, 'bla');
+    },
+    'bla');
+  $layout -> set_text('Bla');
+
+  my $ink     = { x => 23, y => 42, width => 10, height => 15 };
+  my $logical = { x => 42, y => 23, width => 15, height => 10 };
+  my $attr = Pango::AttrShape -> new($ink, $logical, 0, 1);
+  my $list = Pango::AttrList -> new();
+  $list -> insert($attr);
+  $layout -> set_attributes($list);
+
+  Pango::Cairo::show_layout($cr, $layout);
+
+  my $desc = Pango::FontDescription -> from_string('Sans 10');
+  my $font = $fontmap -> load_font($context, $desc);
+  isa_ok($font, 'Pango::Cairo::Font');
+  isa_ok($font -> get_scaled_font(), 'Cairo::ScaledFont');
+}
+
+__END__
+
+Copyright (C) 2005 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoContext.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoContext.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,68 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper need_gtk => 1, tests => 15;
+
+# $Id$
+
+my $label = Gtk2::Label -> new("Bla");
+
+my $context = $label -> create_pango_context();
+isa_ok($context, "Pango::Context");
+
+my @families = $context->list_families;
+ok (@families > 0, 'got a list of somethings');
+isa_ok ($families[0], 'Pango::FontFamily');
+
+my $font = Pango::FontDescription -> from_string("Sans 12");
+my $language = Gtk2 -> get_default_language();
+
+$context -> set_font_description($font);
+isa_ok($context -> get_font_description(), "Pango::FontDescription");
+
+$context -> set_language($language);
+isa_ok($context -> get_language(), "Pango::Language");
+
+$context -> set_base_dir("ltr");
+is($context -> get_base_dir(), "ltr");
+
+isa_ok($context -> load_font($font), "Pango::Font");
+isa_ok($context -> load_fontset($font, $language), "Pango::Fontset");
+isa_ok($context -> get_metrics($font, $language), "Pango::FontMetrics");
+
+SKIP: {
+  skip("[sg]et_matrix are new in 1.6", 2)
+    unless (Pango -> CHECK_VERSION(1, 6, 0));
+
+  $context -> set_matrix(Pango::Matrix -> new());
+  isa_ok($context -> get_matrix(), "Pango::Matrix");
+
+  $context -> set_matrix(undef);
+  is($context -> get_matrix(), undef);
+}
+
+SKIP: {
+  skip("get_font_map is new in 1.6", 1)
+    unless (Pango -> CHECK_VERSION(1, 6, 0));
+
+  isa_ok($context -> get_font_map(), "Pango::FontMap");
+}
+
+SKIP: {
+  skip("new 1.16 stuff", 3)
+    unless (Pango -> CHECK_VERSION(1, 16, 0));
+
+  ok(defined $context -> get_gravity());
+
+  $context -> set_base_gravity("north");
+  is($context -> get_base_gravity(), "north");
+
+  $context -> set_gravity_hint("natural");
+  is($context -> get_gravity_hint(), "natural");
+}
+
+__END__
+
+Copyright (C) 2003-2004 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoFont.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoFont.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,170 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper need_gtk => 1, tests => 57;
+
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/t/PangoFont.t,v 1.14 2007/09/15 14:33:00 kaffeetisch Exp $
+
+my $description = Pango::FontDescription -> new();
+isa_ok($description, "Pango::FontDescription");
+
+like($description -> hash(), qr/^\d+$/);
+is($description -> equal($description), 1);
+
+$description -> set_family("Sans");
+$description -> set_family_static("Sans");
+is($description -> get_family(), "Sans");
+
+$description -> set_style("normal");
+is($description -> get_style(), "normal");
+
+$description -> set_variant("normal");
+is($description -> get_variant(), "normal");
+
+$description -> set_weight("bold");
+is($description -> get_weight(), "bold");
+
+$description -> set_stretch("condensed");
+is($description -> get_stretch(), "condensed");
+
+$description -> set_size(23);
+is($description -> get_size(), 23);
+
+isa_ok($description -> get_set_fields(), "Pango::FontMask");
+$description -> unset_fields([qw(size stretch)]);
+
+$description -> merge($description, 1);
+$description -> merge_static($description, 1);
+
+ok(!$description -> better_match($description, $description));
+ok($description -> better_match(undef, $description));
+
+$description = Pango::FontDescription -> from_string("Sans 12");
+isa_ok($description, "Pango::FontDescription");
+
+is($description -> to_string(), "Sans 12");
+ok(defined($description -> to_filename()));
+
+SKIP: {
+  skip("new 1.8 stuff", 1)
+    unless (Pango -> CHECK_VERSION(1, 8, 0));
+
+  $description -> set_absolute_size(23.42);
+  is($description -> get_size_is_absolute(), TRUE);
+}
+
+SKIP: {
+  skip("new 1.16 stuff", 1)
+    unless (Pango -> CHECK_VERSION(1, 16, 0));
+
+  $description -> set_gravity("south");
+  is($description -> get_gravity(), "south");
+}
+
+###############################################################################
+
+my $label = Gtk2::Label -> new("Bla");
+my $context = $label -> create_pango_context();
+my $font = $context -> load_font($description);
+my $language = Gtk2 -> get_default_language();
+
+my $number = qr/^-?\d+$/;
+
+isa_ok($font -> describe(), "Pango::FontDescription");
+
+SKIP: {
+  skip "new 1.14 stuff", 1
+    unless Pango -> CHECK_VERSION(1, 14, 0);
+
+  isa_ok($font -> describe_with_absolute_size(), "Pango::FontDescription");
+}
+
+foreach my $rectangle ($font -> get_glyph_extents(23)) {
+  foreach my $key (qw(x y width height)) {
+    like($rectangle -> { $key }, $number);
+  }
+}
+
+my $metrics = $font -> get_metrics($language);
+isa_ok($metrics, "Pango::FontMetrics");
+
+like($metrics -> get_ascent(), $number);
+like($metrics -> get_descent(), $number);
+like($metrics -> get_approximate_char_width(), $number);
+like($metrics -> get_approximate_digit_width(), $number);
+
+SKIP: {
+  skip("new 1.6 stuff", 4)
+    unless (Pango -> CHECK_VERSION(1, 6, 0));
+
+  like($metrics -> get_underline_position(), $number);
+  like($metrics -> get_underline_thickness(), $number);
+  like($metrics -> get_strikethrough_position(), $number);
+  like($metrics -> get_strikethrough_thickness(), $number);
+}
+
+SKIP: {
+  skip("new 1.10 stuff", 1)
+    unless (Pango -> CHECK_VERSION(1, 10, 0));
+
+  isa_ok($font -> get_font_map(), "Pango::FontMap");
+}
+
+###############################################################################
+
+like(int(Pango -> scale()), $number);
+like(int(Pango -> scale_xx_small()), $number);
+like(int(Pango -> scale_x_small()), $number);
+like(int(Pango -> scale_small()), $number);
+like(int(Pango -> scale_medium()), $number);
+like(int(Pango -> scale_large()), $number);
+like(int(Pango -> scale_x_large()), $number);
+like(int(Pango -> scale_xx_large()), $number);
+like(int(Pango -> PANGO_PIXELS(23)), $number);
+like(int(Pango -> pixels(23)), $number);
+
+###############################################################################
+
+my @families = $context->list_families;
+ok (@families > 0, 'got a list of families');
+isa_ok ($families[0], 'Pango::FontFamily');
+ok ($families[0]->get_name, 'get_name works');
+SKIP: {
+  skip "is_monospace is new in 1.4.0", 1
+    unless Pango->CHECK_VERSION (1, 4, 0);
+  # we don't really have a way of knowing if this font should actually
+  # be monospaced, so just check that the function doesn't die.
+  $families[0]->is_monospace;
+  ok (1, 'is_monospace works');
+}
+
+my @faces = $families[0]->list_faces;
+#print "faces @faces\n";
+ok (@faces > 0, 'got a list of faces');
+isa_ok ($faces[0], 'Pango::FontFace');
+my $desc = $faces[0]->describe;
+isa_ok ($desc, 'Pango::FontDescription');
+ok ($faces[0]->get_face_name);
+SKIP: {
+  skip "list_sizes is new in 1.4.0", 1
+    unless Pango->CHECK_VERSION (1, 4, 0);
+  # again, whether we'll get sizes depends on whether this first font and
+  # face is a bitmapped font.  we can't know that, so just test that the
+  # call does not result in a crash.
+  my @sizes = $faces[0]->list_sizes;
+  #print "sizes @sizes\n";
+  ok (1, 'list_sizes did not crash');
+}
+
+SKIP: {
+  skip("new 1.18 stuff", 1)
+    unless (Pango -> CHECK_VERSION(1, 18, 0));
+
+  ok(defined $faces[0]->is_synthesized);
+}
+
+__END__
+
+Copyright (C) 2003-2005 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoFontMap.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoFontMap.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,30 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper need_gtk => 1, tests => 4;
+
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/t/PangoFontMap.t,v 1.2 2004/10/24 15:49:33 muppetman Exp $
+
+my $label = Gtk2::Label -> new("Bla");
+
+my $context = $label -> create_pango_context();
+isa_ok($context, "Pango::Context");
+
+SKIP: {
+  skip("get_font_map is new in 1.6", 3)
+    unless (Pango -> CHECK_VERSION(1, 6, 0));
+
+  my $map = $context -> get_font_map();
+  my $desc = Pango::FontDescription -> from_string("Sans 12");
+  my $lang = Pango::Language -> from_string("de_DE");
+
+  isa_ok($map -> load_font($context, $desc), "Pango::Font");
+  isa_ok($map -> load_fontset($context, $desc, $lang), "Pango::Fontset");
+  isa_ok(($map -> list_families())[0], "Pango::FontFamily");
+}
+
+__END__
+
+Copyright (C) 2004 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoFontset.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoFontset.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper need_gtk => 1, tests => 7;
+
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/t/PangoFontset.t,v 1.1 2004/04/19 19:20:52 kaffeetisch Exp $
+
+my $label = Gtk2::Label -> new("Bla");
+my $context = $label -> create_pango_context();
+my $font = Pango::FontDescription -> from_string("Sans 12");
+my $language = Gtk2 -> get_default_language();
+my $set = $context -> load_fontset($font, $language);
+
+isa_ok($set -> get_font(23), "Pango::Font");
+isa_ok($set -> get_metrics(), "Pango::FontMetrics");
+
+SKIP: {
+  skip("foreach is new in 1.4", 5)
+    unless (Pango -> CHECK_VERSION(1, 4, 0));
+
+  $set -> foreach(sub {
+    isa_ok(shift(), "Pango::Fontset");
+    isa_ok(shift(), "Pango::Font");
+    return 1;
+  });
+
+  $set -> foreach(sub {
+    isa_ok(shift(), "Pango::Fontset");
+    isa_ok(shift(), "Pango::Font");
+    is(shift(), "bla");
+    return 1;
+  }, "bla");
+}
+
+__END__
+
+Copyright (C) 2004 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoGravity.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoGravity.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper tests => 4;
+
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/t/PangoGravity.t,v 1.2 2007/06/17 12:55:56 kaffeetisch Exp $
+
+SKIP: {
+  skip "PangoGravity", 4
+    unless Pango->CHECK_VERSION (1, 16, 0);
+
+  is (Pango::Gravity::to_rotation ('south'), 0.0);
+  ok (!Pango::Gravity::is_vertical ('south'));
+
+  my $matrix = Pango::Matrix->new;
+  is (Pango::Gravity::get_for_matrix ($matrix), 'south');
+
+  is (Pango::Gravity::get_for_script ('common', 'south', 'strong'), 'south');
+}
+
+__END__
+
+Copyright (C) 2007 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoLayout.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoLayout.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,221 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper need_gtk => 1, tests => 71;
+
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/t/PangoLayout.t,v 1.21 2008/05/20 19:31:42 kaffeetisch Exp $
+
+my $label = Gtk2::Label -> new("Bla");
+my $context = $label -> create_pango_context();
+
+my $layout = Pango::Layout -> new($context);
+isa_ok($layout, "Pango::Layout");
+is($layout -> get_context(), $context);
+
+$layout -> context_changed();
+
+$layout -> set_text("Bla bla.");
+is($layout -> get_text(), "Bla bla.");
+
+$layout -> set_markup("Bla bla.");
+is($layout -> set_markup_with_accel("Bla _bla.", "_"), "b");
+
+my $font = Pango::FontDescription -> new();
+
+$layout -> set_font_description($font);
+
+SKIP: {
+  skip("set_font_description was slightly borken", 0)
+    unless (Pango -> CHECK_VERSION(1, 4, 0));
+
+  $layout -> set_font_description(undef);
+}
+
+SKIP: {
+  skip("new 1.8 stuff", 2)
+    unless (Pango -> CHECK_VERSION(1, 8, 0));
+
+  is($layout -> get_font_description(), undef);
+
+  $layout -> set_font_description($font);
+  isa_ok($layout -> get_font_description(), "Pango::FontDescription");
+}
+
+$layout -> set_width(23);
+is($layout -> get_width(), 23);
+
+$layout -> set_wrap("word");
+is($layout -> get_wrap(), "word");
+
+$layout -> set_indent(5);
+is($layout -> get_indent(), 5);
+
+$layout -> set_spacing(5);
+is($layout -> get_spacing(), 5);
+
+$layout -> set_justify(1);
+is($layout -> get_justify(), 1);
+
+my $attributes = $layout -> get_attributes();
+isa_ok($attributes, "Pango::AttrList");
+$layout -> set_attributes($attributes);
+
+SKIP: {
+  skip("[sg]et_auto_dir are new in 1.3.5", 1)
+    unless (Pango -> CHECK_VERSION(1, 4, 0));
+
+  $layout -> set_auto_dir(1);
+  is($layout -> get_auto_dir(), 1);
+}
+
+$layout -> set_alignment("left");
+is($layout -> get_alignment(), "left");
+
+$layout -> set_tabs(Pango::TabArray -> new(8, 0));
+isa_ok($layout -> get_tabs(), "Pango::TabArray");
+
+$layout -> set_single_paragraph_mode(1);
+is($layout -> get_single_paragraph_mode(), 1);
+
+my $attribute = ($layout -> get_log_attrs())[0];
+isa_ok($attribute, "HASH");
+
+is_deeply($attribute, {
+  is_line_break => 0,
+  is_mandatory_break => 0,
+  is_char_break => 1,
+  is_white => 0,
+  is_cursor_position => 1,
+  is_word_start => 1,
+  is_word_end => 0,
+  is_sentence_boundary =>
+    (Pango -> CHECK_VERSION(1, 21, 1) ? 1 : 0), # FIXME: 1.22
+  is_sentence_start => 1,
+  is_sentence_end => 0,
+  Pango -> CHECK_VERSION(1, 4, 0) ?
+    (backspace_deletes_character => 1) :
+    (),
+  Pango -> CHECK_VERSION(1, 18, 0) ?
+    (is_expandable_space => 0) :
+    ()
+});
+
+foreach ($layout -> index_to_pos(23),
+         $layout -> get_cursor_pos(1),
+         $layout -> get_extents(),
+         $layout -> get_pixel_extents()) {
+  isa_ok($_, "HASH");
+}
+
+my $number = qr/^\d+$/;
+
+my ($index, $trailing) = $layout -> xy_to_index(5, 5);
+like($index, $number);
+like($trailing, $number);
+
+is_deeply([$layout -> move_cursor_visually(1, 0, 0, 1)], [1, 0]);
+
+my ($width, $height) = $layout -> get_size();
+like($width, $number);
+like($height, $number);
+
+($width, $height) = $layout -> get_pixel_size();
+like($width, $number);
+like($height, $number);
+
+like($layout -> get_line_count(), $number);
+
+{
+  my @lines = $layout -> get_lines();
+  isa_ok($lines[0], "Pango::LayoutLine");
+  is(scalar @lines, $layout -> get_line_count());
+
+  my $line = $layout -> get_line(0);
+  isa_ok($line, "Pango::LayoutLine");
+
+  my ($outside, $index, $trailing) = $line -> x_to_index(23);
+  ok(defined $outside && defined $index && defined $trailing);
+  ok(defined $line -> index_to_x(0, TRUE));
+
+  my @ranges = $line -> get_x_ranges(0, 8000);
+  isa_ok($ranges[0], "ARRAY");
+  is(scalar @{$ranges[0]}, 2);
+
+  my ($ink, $logical);
+  ($ink, $logical) = $line -> get_extents();
+  isa_ok($ink, "HASH");
+  isa_ok($logical, "HASH");
+  ($ink, $logical) = $line -> get_pixel_extents();
+  isa_ok($ink, "HASH");
+  isa_ok($logical, "HASH");
+}
+
+{
+  my $iter = $layout -> get_iter();
+  isa_ok($iter, "Pango::LayoutIter");
+
+  foreach ($iter -> get_char_extents(),
+           $iter -> get_cluster_extents(),
+           $iter -> get_run_extents(),
+           $iter -> get_line_extents(),
+           $iter -> get_layout_extents()) {
+    isa_ok($_, "HASH");
+  }
+
+  my ($y0, $y1) = $iter -> get_line_yrange();
+  like($y0, $number);
+  like($y1, $number);
+
+  ok($iter -> next_run());
+  ok($iter -> next_char());
+  ok($iter -> next_cluster());
+  ok(!$iter -> next_line());
+  ok($iter -> at_last_line());
+
+  like($iter -> get_index(), $number);
+  like($iter -> get_baseline(), $number);
+
+  isa_ok($iter -> get_line(), "Pango::LayoutLine");
+}
+
+SKIP: {
+  skip("[sg]et_ellipsize are new in 1.6", 1)
+    unless (Pango -> CHECK_VERSION(1, 6, 0));
+
+  $layout -> set_ellipsize("end");
+  is($layout -> get_ellipsize(), "end");
+}
+
+SKIP: {
+  skip "1.16 stuff", 3
+    unless Pango -> CHECK_VERSION(1, 16, 0);
+
+  isa_ok($layout -> get_line_readonly(0), "Pango::LayoutLine");
+  my @lines = $layout -> get_lines_readonly();
+  is(scalar @lines, $layout -> get_line_count());
+  my $iter = $layout -> get_iter();
+  isa_ok($iter -> get_line_readonly(), "Pango::LayoutLine");
+}
+
+SKIP: {
+  skip 'new 1.20 stuff', 2
+    unless (Pango -> CHECK_VERSION(1, 20, 0));
+
+  my $iter = $layout -> get_iter();
+  is($iter -> get_layout(), $layout);
+  isa_ok($iter -> copy(), 'Pango::LayoutIter');
+}
+
+SKIP: {
+  skip 'new 1.20 stuff', 1
+    unless (Pango -> CHECK_VERSION(1, 20, 0));
+
+  $layout -> set_height(23);
+  is($layout -> get_height(), 23);
+}
+
+__END__
+
+Copyright (C) 2003-2005 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoMatrix.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoMatrix.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,95 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper tests => 48;
+
+# $Id: PangoMatrix.t,v 1.2 2007/06/17 12:55:56 kaffeetisch Exp $
+
+SKIP: {
+  skip("PangoMatrix is new in 1.6", 44)
+    unless (Pango -> CHECK_VERSION(1, 6, 0));
+
+  my $matrix = Pango::Matrix -> new(2.3, 2.3, 2.3, 2.3, 2.3, 2.3);
+  isa_ok($matrix, "Pango::Matrix");
+  delta_ok($matrix -> xx, 2.3);
+  delta_ok($matrix -> xy, 2.3);
+  delta_ok($matrix -> yx, 2.3);
+  delta_ok($matrix -> yy, 2.3);
+  delta_ok($matrix -> x0, 2.3);
+  delta_ok($matrix -> y0, 2.3);
+
+  $matrix = Pango::Matrix -> new();
+  isa_ok($matrix, "Pango::Matrix");
+  is($matrix -> xx, 1);
+  is($matrix -> xy, 0);
+  is($matrix -> yx, 0);
+  is($matrix -> yy, 1);
+  is($matrix -> x0, 0);
+  is($matrix -> y0, 0);
+
+  $matrix -> translate(5, 5);
+  is($matrix -> xx, 1);
+  is($matrix -> xy, 0);
+  is($matrix -> yx, 0);
+  is($matrix -> yy, 1);
+  is($matrix -> x0, 5);
+  is($matrix -> y0, 5);
+
+  $matrix -> scale(2, 2);
+  is($matrix -> xx, 2);
+  is($matrix -> xy, 0);
+  is($matrix -> yx, 0);
+  is($matrix -> yy, 2);
+  is($matrix -> x0, 5);
+  is($matrix -> y0, 5);
+
+  $matrix -> rotate(0);
+  is($matrix -> xx, 2);
+  is($matrix -> xy, 0);
+  is($matrix -> yx, 0);
+  is($matrix -> yy, 2);
+  is($matrix -> x0, 5);
+  is($matrix -> y0, 5);
+
+  $matrix -> concat($matrix);
+  is($matrix -> xx, 4);
+  is($matrix -> xy, 0);
+  is($matrix -> yx, 0);
+  is($matrix -> yy, 4);
+  is($matrix -> x0, 15);
+  is($matrix -> y0, 15);
+
+  $matrix -> xx(2.3);
+  $matrix -> xy(2.3);
+  $matrix -> yx(2.3);
+  $matrix -> yy(2.3);
+  $matrix -> x0(2.3);
+  $matrix -> y0(2.3);
+  delta_ok($matrix -> xx, 2.3);
+  delta_ok($matrix -> xy, 2.3);
+  delta_ok($matrix -> yx, 2.3);
+  delta_ok($matrix -> yy, 2.3);
+  delta_ok($matrix -> x0, 2.3);
+  delta_ok($matrix -> y0, 2.3);
+}
+
+SKIP: {
+  skip "1.16 stuff", 4
+    unless Pango -> CHECK_VERSION(1, 16, 0);
+
+  my $matrix = Pango::Matrix -> new(); # identity
+
+  is_deeply([$matrix -> transform_distance(1.0, 2.0)], [1.0, 2.0]);
+
+  is_deeply([$matrix -> transform_point(1.0, 2.0)], [1.0, 2.0]);
+
+  my $rect = {x => 1.0, y => 2.0, width => 23.0, height => 42.0};
+  is_deeply($matrix -> transform_rectangle($rect), $rect);
+  is_deeply($matrix -> transform_pixel_rectangle($rect), $rect);
+}
+
+__END__
+
+Copyright (C) 2007 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoRenderer.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoRenderer.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,73 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper need_gtk => 1, tests => 7;
+
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/t/PangoRenderer.t,v 1.7 2008/03/10 20:54:36 kaffeetisch Exp $
+
+SKIP: {
+  skip("PangoRenderer is new in 1.8", 5)
+    unless (Pango -> CHECK_VERSION(1, 8, 0));
+
+  my $screen = Gtk2::Gdk::Screen -> get_default();
+
+  my $renderer = Gtk2::Gdk::PangoRenderer -> new($screen);
+  isa_ok($renderer, "Pango::Renderer");
+
+  my $window = Gtk2::Window -> new();
+  $window -> realize();
+  $renderer -> set_drawable($window -> window);
+
+  my $gc = Gtk2::Gdk::GC -> new($window -> window);
+  $renderer -> set_gc($gc);
+
+  $renderer -> activate();
+
+  my $layout = $window -> create_pango_layout("Bla");
+  $renderer -> draw_layout($layout, 0, 0);
+  $renderer -> draw_layout_line($layout -> get_line(0), 0, 0);
+
+  $renderer -> draw_rectangle("foreground", 0, 0, 10, 10);
+  $renderer -> draw_error_underline(0, 0, 10, 10);
+
+  my $description = Pango::FontDescription -> new();
+  $description -> set_family("Sans");
+  $description -> set_size(23);
+
+  my $context = $window -> create_pango_context();
+  my $font = $context -> load_font($description);
+
+  $renderer -> draw_glyph($font, 0, 0, 0);
+  $renderer -> part_changed("foreground");
+
+  $renderer -> set_color("foreground", undef);
+  is($renderer -> get_color("foreground"), undef);
+
+  $renderer -> set_color("background", [0xaaaa, 0xbbbb, 0xcccc]);
+  is_deeply($renderer -> get_color("background"), [0xaaaa, 0xbbbb, 0xcccc]);
+
+  $renderer -> set_matrix(undef);
+  is($renderer -> get_matrix(), undef);
+
+  my $matrix = Pango::Matrix -> new();
+  $renderer -> set_matrix($matrix);
+  isa_ok($renderer -> get_matrix(), "Pango::Matrix");
+
+  $renderer -> deactivate();
+
+  SKIP: {
+    skip 'new 1.20 stuff', 2
+      unless (Pango -> CHECK_VERSION(1, 20, 0));
+
+    # These always return undef unless called from inside a subclass' drawing
+    # function.  How do we test that?
+    is($renderer -> get_layout(), undef);
+    is($renderer -> get_layout_line(), undef);
+  }
+}
+
+__END__
+
+Copyright (C) 2005 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoScript.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoScript.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper tests => 8;
+
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/t/PangoScript.t,v 1.2 2004/10/30 17:13:23 kaffeetisch Exp $
+
+SKIP: {
+  skip("PangoScript is new in 1.4", 8)
+    unless (Pango -> CHECK_VERSION(1, 4, 0));
+
+  is(Pango::Script -> for_unichar("a"), "latin");
+
+  my $lang = Pango::Script -> get_sample_language("latin");
+  isa_ok($lang, "Pango::Language");
+  is($lang -> includes_script("latin"), 1);
+
+  my $iter = Pango::ScriptIter -> new("urgs");
+  isa_ok($iter, "Pango::ScriptIter");
+
+  my ($start, $end, $script) = $iter -> get_range();
+  is($start, "urgs");
+  is($end, "");
+  is($script, "latin");
+
+  ok(!$iter -> next());
+}
+
+__END__
+
+Copyright (C) 2004 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoTabs.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoTabs.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper tests => 6;
+
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/t/PangoTabs.t,v 1.7 2004/09/13 21:07:34 kaffeetisch Exp $
+
+SKIP: {
+  skip("PangoTabs was broken prior to 1.3.3", 6)
+    unless (Pango -> CHECK_VERSION(1, 4, 0));
+
+  my $array = Pango::TabArray -> new(8, 0);
+  isa_ok($array, "Pango::TabArray");
+
+  $array = Pango::TabArray -> new_with_positions(2, 1, "left", 8, "left", 16);
+  isa_ok($array, "Pango::TabArray");
+
+  $array -> resize(3);
+  is($array -> get_size(), 3);
+
+  $array -> set_tab(2, "left", 24);
+  is_deeply([$array -> get_tab(2)], ["left", 24]);
+
+  is_deeply([$array -> get_tabs()], ["left", 8, "left", 16, "left", 24]);
+
+  is($array -> get_positions_in_pixels(), 1);
+}
+
+__END__
+
+Copyright (C) 2003 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/PangoTypes.t
==============================================================================
--- (empty file)
+++ trunk/t/PangoTypes.t	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use lib qw(t/inc);
+use PangoTestHelper tests => 9;
+
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/t/PangoTypes.t,v 1.7 2007/06/17 12:55:56 kaffeetisch Exp $
+
+SKIP: {
+  skip("find_base_dir is new in 1.4", 1)
+    unless (Pango -> CHECK_VERSION(1, 4, 0));
+
+  is(Pango -> find_base_dir("urgs"), "ltr");
+}
+
+my $language = Pango::Language -> from_string("de_DE");
+isa_ok($language, "Pango::Language");
+is($language -> to_string(), "de-de");
+is($language -> matches("*"), 1);
+
+SKIP: {
+  skip "1.16 stuff", 5
+    unless Pango -> CHECK_VERSION(1, 16, 0);
+
+  isa_ok(Pango::Language -> get_default(), "Pango::Language");
+
+  is(Pango::units_from_double(Pango::units_to_double(23)), 23);
+
+  my $rect = {x => 1.0, y => 2.0, width => 23.0, height => 42.0};
+  my ($new_ink, $new_logical) = Pango::extents_to_pixels($rect, $rect);
+  isa_ok($new_ink, "HASH");
+  isa_ok($new_logical, "HASH");
+
+  is_deeply([Pango::extents_to_pixels(undef, undef)], [undef, undef]);
+}
+
+__END__
+
+Copyright (C) 2004-2007 by the gtk2-perl team (see the file AUTHORS for the
+full list).  See LICENSE for more information.

Added: trunk/t/inc/PangoTestHelper.pm
==============================================================================
--- (empty file)
+++ trunk/t/inc/PangoTestHelper.pm	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,35 @@
+# $Id$
+package PangoTestHelper;
+
+use Test::More;
+
+my $REQ_GTK2_VERSION = 1.210; # FIXME: 1.22
+
+sub import {
+  my $class = shift;
+  my %options = @_;
+
+  if ($options{need_gtk}) {
+    unless (eval "use Gtk2 $REQ_GTK2_VERSION -init; 1;") {
+      plan skip_all => "This test needs Gtk2 >= $REQ_GTK2_VERSION";
+    }
+  }
+
+  if (exists $options{tests}) {
+    plan tests => $options{tests};
+  }
+}
+
+package main;
+
+use Glib qw/TRUE FALSE/;
+use Pango;
+use Test::More;
+
+# Inspired by Test::Number::Delta
+sub delta_ok ($$;$) {
+	my ($a, $b, $msg) = @_;
+	ok (abs ($a - $b) < 1e-6, $msg);
+}
+
+1;

Added: trunk/xs/Pango.xs
==============================================================================
--- (empty file)
+++ trunk/xs/Pango.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2008 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * Licensed under the LGPL, see LICENSE file for more information.
+ *
+ * $Id$
+ */
+
+#include "pango-perl.h"
+
+MODULE = Pango		PACKAGE = Pango		PREFIX = PANGO_
+
+BOOT:
+#include "register.xsh"
+#include "boot.xsh"
+	gperl_handle_logs_for ("Pango");
+
+# Don't doc these in Pango, or we'll clobber the main POD page!
+
+=for object Pango::version
+=cut
+
+=for see_also L<Gtk2::version>
+=cut
+
+=for see_also L<Glib::version>
+=cut
+
+=for apidoc
+=for signature (MAJOR, MINOR, MICRO) = Pango->GET_VERSION_INFO
+Fetch as a list the version of pango with which the Perl module was built.
+=cut
+void
+GET_VERSION_INFO (class)
+    PPCODE:
+	EXTEND (SP, 3);
+	PUSHs (sv_2mortal (newSViv (PANGO_MAJOR_VERSION)));
+	PUSHs (sv_2mortal (newSViv (PANGO_MINOR_VERSION)));
+	PUSHs (sv_2mortal (newSViv (PANGO_MICRO_VERSION)));
+	PERL_UNUSED_VAR (ax);
+
+bool
+PANGO_CHECK_VERSION (class, int major, int minor, int micro)
+    C_ARGS:
+	major, minor, micro

Added: trunk/xs/PangoAttributes.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoAttributes.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,1026 @@
+/*
+ * Copyright (c) 2005-2006 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA  02111-1307  USA.
+ *
+ * $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/PangoAttributes.xs,v 1.8 2008/01/07 20:23:29 kaffeetisch Exp $
+ */
+
+#include "pango-perl.h"
+#include "pango-perl-private.h"
+
+/* ------------------------------------------------------------------------- */
+
+static GPerlBoxedWrapperClass pango_color_wrapper_class;
+
+static SV *
+pango_color_wrap (GType gtype,
+                  const char * package,
+                  gpointer boxed,
+		  gboolean own)
+{
+	PangoColor *color = boxed;
+	AV *av;
+
+	if (!color)
+		return &PL_sv_undef;
+
+	av = newAV ();
+
+	av_push (av, newSVuv (color->red));
+	av_push (av, newSVuv (color->green));
+	av_push (av, newSVuv (color->blue));
+
+	if (own)
+		pango_color_free (color);
+
+	return sv_bless (newRV_noinc ((SV *) av),
+	       		 gv_stashpv ("Pango::Color", TRUE));
+}
+
+/* This uses gperl_alloc_temp so make sure you don't hold on to pointers
+ * returned by SvPangoColor for too long. */
+static gpointer
+pango_color_unwrap (GType gtype,
+		    const char * package,
+		    SV * sv)
+{
+	PangoColor *color;
+	AV * av;
+	SV ** v;
+
+	if (!gperl_sv_is_defined (sv))
+		return NULL;
+
+	if (!gperl_sv_is_array_ref (sv))
+		croak ("a PangoColor must be an array reference with three values: "
+		       "red, green, and blue");
+
+	color = gperl_alloc_temp (sizeof (PangoColor));
+
+	av = (AV *) SvRV (sv);
+
+	v = av_fetch (av, 0, 0);
+	if (v && gperl_sv_is_defined (*v))
+		color->red = SvUV (*v);
+
+	v = av_fetch (av, 1, 0);
+	if (v && gperl_sv_is_defined (*v))
+		color->green = SvUV (*v);
+
+	v = av_fetch (av, 2, 0);
+	if (v && gperl_sv_is_defined (*v))
+		color->blue = SvUV (*v);
+
+	return color;
+}
+
+static void
+pango_color_destroy (SV * sv)
+{
+	/* We allocated nothing in wrap, so do nothing here. */
+}
+
+/* ------------------------------------------------------------------------- */
+
+GType
+gtk2perl_pango_attribute_get_type (void)
+{
+	static GType t = 0;
+	if (!t)
+		t = g_boxed_type_register_static ("PangoAttribute",
+		      (GBoxedCopyFunc) pango_attribute_copy,
+		      (GBoxedFreeFunc) pango_attribute_destroy);
+	return t;
+}
+
+static GHashTable *gtk2perl_pango_attribute_table = NULL;
+
+/* Exported (gtk2perl-private.h) for GdkPango.xs. */
+void
+gtk2perl_pango_attribute_register_custom_type (PangoAttrType type,
+					       const char *package)
+{
+	if (!gtk2perl_pango_attribute_table)
+		gtk2perl_pango_attribute_table =
+			g_hash_table_new (g_direct_hash, g_direct_equal);
+	g_hash_table_insert (gtk2perl_pango_attribute_table,
+			     GINT_TO_POINTER (type), (gpointer) package);
+}
+
+static const char *
+gtk2perl_pango_attribute_lookup_custom_type (PangoAttrType type)
+{
+	return g_hash_table_lookup (gtk2perl_pango_attribute_table,
+	       			    GINT_TO_POINTER (type));
+}
+
+static const char *
+gtk2perl_pango_attribute_get_package (PangoAttribute * attr)
+{
+	/* the interface is designed to allow extensibility by registering
+	 * new PangoAttrType values, but pango doesn't allow us to query
+	 * those.  but we have hacks in place, so we can try anyway. */
+	switch (attr->klass->type) {
+	    case PANGO_ATTR_INVALID:
+		croak ("invalid PangoAttribute encountered; should not happen");
+		return NULL;
+	    case PANGO_ATTR_LANGUAGE:
+		return "Pango::AttrLanguage";
+	    case PANGO_ATTR_FAMILY:
+		return "Pango::AttrFamily";
+	    case PANGO_ATTR_STYLE:
+	    	return "Pango::AttrStyle";
+	    case PANGO_ATTR_WEIGHT:
+		return "Pango::AttrWeight";
+	    case PANGO_ATTR_VARIANT:
+		return "Pango::AttrVariant";
+	    case PANGO_ATTR_STRETCH:
+		return "Pango::AttrStretch";
+	    case PANGO_ATTR_SIZE:
+#if PANGO_CHECK_VERSION (1, 8, 0)
+	    case PANGO_ATTR_ABSOLUTE_SIZE:
+#endif
+		return "Pango::AttrSize";
+	    case PANGO_ATTR_FONT_DESC:
+		return "Pango::AttrFontDesc";
+	    case PANGO_ATTR_FOREGROUND:
+		return "Pango::AttrForeground";
+	    case PANGO_ATTR_BACKGROUND:
+		return "Pango::AttrBackground";
+	    case PANGO_ATTR_UNDERLINE:
+		return "Pango::AttrUnderline";
+	    case PANGO_ATTR_STRIKETHROUGH:
+		return "Pango::AttrStrikethrough";
+	    case PANGO_ATTR_RISE:
+		return "Pango::AttrRise";
+	    case PANGO_ATTR_SHAPE:
+		return "Pango::AttrShape";
+	    case PANGO_ATTR_SCALE:
+		return "Pango::AttrScale";
+#if PANGO_CHECK_VERSION (1, 4, 0)
+	    case PANGO_ATTR_FALLBACK:
+		return "Pango::AttrFallback";
+#endif
+#if PANGO_CHECK_VERSION (1, 6, 0)
+	    case PANGO_ATTR_LETTER_SPACING:
+		return "Pango::AttrLetterSpacing";
+#endif
+#if PANGO_CHECK_VERSION (1, 8, 0)
+	    case PANGO_ATTR_UNDERLINE_COLOR:
+		return "Pango::AttrUnderlineColor";
+	    case PANGO_ATTR_STRIKETHROUGH_COLOR:
+		return "Pango::AttrStrikethroughColor";
+#endif
+#if PANGO_CHECK_VERSION (1, 16, 0)
+	    case PANGO_ATTR_GRAVITY:
+		return "Pango::AttrGravity";
+	    case PANGO_ATTR_GRAVITY_HINT:
+		return "Pango::AttrGravityHint";
+#endif
+	    default:
+	    {
+		const char *package =
+			gtk2perl_pango_attribute_lookup_custom_type
+				(attr->klass->type);
+		if (package)
+			return package;
+		return "Pango::Attribute";
+	    }
+	}
+}
+
+static GPerlBoxedWrapperClass   gtk2perl_pango_attribute_wrapper_class;
+static GPerlBoxedWrapperClass * default_wrapper_class;
+
+static SV *
+gtk2perl_pango_attribute_wrap (GType gtype,
+                      	       const char * package,
+                      	       gpointer boxed,
+		      	       gboolean own)
+{
+	PangoAttribute * attr = boxed;
+	HV * stash;
+	SV * sv;
+
+	sv = default_wrapper_class->wrap (gtype, package, boxed, own);
+
+	/* Override the default package */
+	package = gtk2perl_pango_attribute_get_package (attr);
+	stash = gv_stashpv (package, TRUE);
+	return sv_bless (sv, stash);
+}
+
+static gpointer
+gtk2perl_pango_attribute_unwrap (GType gtype,
+				 const char * package,
+				 SV * sv)
+{
+	PangoAttribute * attr = default_wrapper_class->unwrap (gtype, package, sv);
+
+	/* Override the default package */
+	package = gtk2perl_pango_attribute_get_package (attr);
+
+	if (!sv_derived_from (sv, package))
+		croak ("%s is not of type %s",
+		       gperl_format_variable_for_output (sv),
+		       package);
+
+	return attr;
+}
+
+/* ------------------------------------------------------------------------- */
+
+GType
+gtk2perl_pango_attr_iterator_get_type (void)
+{
+	static GType t = 0;
+	if (!t)
+		t = g_boxed_type_register_static ("PangoAttrIterator",
+		      (GBoxedCopyFunc) pango_attr_iterator_copy,
+		      (GBoxedFreeFunc) pango_attr_iterator_destroy);
+	return t;
+}
+
+/* ------------------------------------------------------------------------- */
+
+#if PANGO_CHECK_VERSION (1, 2, 0)
+
+static GPerlCallback *
+gtk2perl_pango_attr_filter_func_create (SV * func, SV * data)
+{
+	GType param_types [1];
+	param_types[0] = PANGO_TYPE_ATTRIBUTE;
+	return gperl_callback_new (func, data, G_N_ELEMENTS (param_types),
+				   param_types, G_TYPE_BOOLEAN);
+}
+
+static gboolean
+gtk2perl_pango_attr_filter_func (PangoAttribute *attribute,
+			      	 gpointer data)
+{
+	GPerlCallback * callback = (GPerlCallback*)data;
+	GValue value = {0,};
+	gboolean retval;
+
+	g_value_init (&value, callback->return_type);
+	gperl_callback_invoke (callback, &value, attribute);
+	retval = g_value_get_boolean (&value);
+	g_value_unset (&value);
+
+	return retval;
+}
+
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+MODULE = Pango::Attributes	PACKAGE = Pango::Color	PREFIX = pango_color_
+
+BOOT:
+	PERL_UNUSED_VAR (file);
+	pango_color_wrapper_class.wrap = pango_color_wrap;
+	pango_color_wrapper_class.unwrap = pango_color_unwrap;
+	pango_color_wrapper_class.destroy = pango_color_destroy;
+	gperl_register_boxed (PANGO_TYPE_COLOR, "Pango::Color",
+	                      &pango_color_wrapper_class);
+
+##gboolean pango_color_parse (PangoColor *color, const char *spec);
+PangoColor *
+pango_color_parse (class, const gchar * spec)
+    PREINIT:
+	PangoColor color;
+    CODE:
+	if (! pango_color_parse (&color, spec))
+		XSRETURN_UNDEF;
+	RETVAL = &color;
+    OUTPUT:
+	RETVAL
+
+#if PANGO_CHECK_VERSION (1, 16, 0)
+
+=for apidoc
+=for signature string = $color->to_string
+=cut
+##gchar *pango_color_to_string(const PangoColor *color);
+gchar_own *
+pango_color_to_string (...)
+    CODE:
+	if (items == 1)
+		RETVAL = pango_color_to_string (SvPangoColor (ST (0)));
+	else if (items == 2)
+		RETVAL = pango_color_to_string (SvPangoColor (ST (1)));
+	else
+		croak ("Usage: Pango::Color::to_string($color)");
+    OUTPUT:
+	RETVAL
+
+#endif
+
+# --------------------------------------------------------------------------- #
+# First, the base class of all attributes
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::Attribute	PREFIX = pango_attribute_
+
+BOOT:
+	default_wrapper_class = gperl_default_boxed_wrapper_class ();
+	gtk2perl_pango_attribute_wrapper_class = * default_wrapper_class;
+	gtk2perl_pango_attribute_wrapper_class.wrap = gtk2perl_pango_attribute_wrap;
+	gtk2perl_pango_attribute_wrapper_class.unwrap = gtk2perl_pango_attribute_unwrap;
+	gperl_register_boxed (PANGO_TYPE_ATTRIBUTE, "Pango::Attribute",
+	                      &gtk2perl_pango_attribute_wrapper_class);
+
+guint
+start_index (PangoAttribute * attr, ...)
+    ALIAS:
+	end_index = 1
+    CODE:
+	RETVAL = ix == 0 ? attr->start_index : attr->end_index;
+	if (items > 1) {
+		guint new_index = SvIV (ST (1));
+		if (ix == 0)
+			attr->start_index = new_index;
+		else
+			attr->end_index = new_index;
+	}
+    OUTPUT:
+	RETVAL
+
+gboolean pango_attribute_equal (PangoAttribute * attr1, PangoAttribute * attr2);
+
+# --------------------------------------------------------------------------- #
+# Then, a few abstract base classes
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrString
+
+BOOT:
+	gperl_set_isa ("Pango::AttrString", "Pango::Attribute");
+
+gchar_own *
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = g_strdup (((PangoAttrString*)attr)->value);
+	if (items > 1) {
+		/* this feels evil... */
+		if (((PangoAttrString*)attr)->value)
+			g_free (((PangoAttrString*)attr)->value);
+		((PangoAttrString*)attr)->value = g_strdup (SvGChar (ST (1)));
+	}
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrInt
+
+BOOT:
+	gperl_set_isa ("Pango::AttrInt", "Pango::Attribute");
+
+int
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrInt*)attr)->value;
+	if (items > 1)
+		((PangoAttrInt*)attr)->value = SvIV (ST (1));
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrColor
+
+BOOT:
+	gperl_set_isa ("Pango::AttrColor", "Pango::Attribute");
+
+##
+## the PangoAttrColor holds an actual color, not a pointer...
+## how can we make it editable from perl?  you can replace it,
+## but you get a copy back and editing it does nothing...
+##
+PangoColor *
+value (PangoAttribute * attr, ...)
+    PREINIT:
+	PangoColor copy;
+    CODE:
+	copy = ((PangoAttrColor*)attr)->color;
+	RETVAL = &copy;
+	if (items > 1) {
+		PangoColor * color = SvPangoColor (ST (1));
+		((PangoAttrColor*)attr)->color = *color;
+	}
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+# And finally, the special-purpose attributes
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrLanguage	PREFIX = pango_attr_language_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrLanguage", "Pango::Attribute");
+
+=for apidoc
+C<Pango::AttrLanguage> doesn't take a reference and doesn't copy the
+C<Pango::Language> object, but demands its validity nonetheless.  So make
+sure the language object stays alive at least as long as the attribute.
+=cut
+PangoAttribute_own * pango_attr_language_new (class, PangoLanguage *language, ...);
+    C_ARGS:
+	language
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+PangoLanguage *
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrLanguage*)attr)->value;
+	if (items > 1) {
+		/* from the pango source, this is all we need to do. */
+		((PangoAttrLanguage*)attr)->value = SvPangoLanguage (ST (1));
+	}
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrFamily	PREFIX = pango_attr_family_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrFamily", "Pango::AttrString");
+
+PangoAttribute_own * pango_attr_family_new (class, const char *family, ...);
+    C_ARGS:
+	family
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrForeground	PREFIX = pango_attr_foreground_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrForeground", "Pango::AttrColor");
+
+PangoAttribute_own * pango_attr_foreground_new (class, guint16 red, guint green, guint16 blue, ...);
+    C_ARGS:
+	red, green, blue
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (4, RETVAL);
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrBackground	PREFIX = pango_attr_background_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrBackground", "Pango::AttrColor");
+
+PangoAttribute_own * pango_attr_background_new (class, guint16 red, guint green, guint16 blue, ...);
+    C_ARGS:
+	red, green, blue
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (4, RETVAL);
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrSize	PREFIX = pango_attr_size_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrSize", "Pango::AttrInt");
+
+PangoAttribute_own * pango_attr_size_new (class, int size, ...)
+    C_ARGS:
+	size
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+#if PANGO_CHECK_VERSION (1, 8, 0)
+
+PangoAttribute_own * pango_attr_size_new_absolute (class, int size, ...)
+    C_ARGS:
+	size
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+#endif
+
+# Later versions of pango use PangoAttrSize rather than PangoAttrInt, but
+# they're compatible with respect to the value field.  So we can safely use the
+# value accessor of Pango::AttrInt.
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrStyle	PREFIX = pango_attr_style_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrStyle", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_style_new (class, PangoStyle style, ...)
+    C_ARGS:
+	style
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+PangoStyle
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrInt*) attr)->value;
+	if (items > 1)
+		((PangoAttrInt*) attr)->value = SvPangoStyle (ST (1));
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrWeight	PREFIX = pango_attr_weight_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrWeight", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_weight_new (class, PangoWeight weight, ...);
+    C_ARGS:
+	weight
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+PangoWeight
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrInt*) attr)->value;
+	if (items > 1)
+		((PangoAttrInt*) attr)->value = SvPangoWeight (ST (1));
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrVariant	PREFIX = pango_attr_variant_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrVariant", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_variant_new (class, PangoVariant variant, ...)
+    C_ARGS:
+	variant
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+PangoVariant
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrInt*) attr)->value;
+	if (items > 1)
+		((PangoAttrInt*) attr)->value = SvPangoVariant (ST (1));
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrStretch	PREFIX = pango_attr_stretch_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrStretch", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_stretch_new (class, PangoStretch stretch, ...)
+    C_ARGS:
+	stretch
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+PangoStretch
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrInt*) attr)->value;
+	if (items > 1)
+		((PangoAttrInt*) attr)->value = SvPangoStretch (ST (1));
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrUnderline	PREFIX = pango_attr_underline_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrUnderline", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_underline_new (class, PangoUnderline underline, ...)
+    C_ARGS:
+	underline
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+PangoUnderline
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrInt*) attr)->value;
+	if (items > 1)
+		((PangoAttrInt*) attr)->value = SvPangoUnderline (ST (1));
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrStrikethrough	PREFIX = pango_attr_strikethrough_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrStrikethrough", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_strikethrough_new (class, gboolean strikethrough, ...)
+    C_ARGS:
+	strikethrough
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+gboolean
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrInt*) attr)->value;
+	if (items > 1)
+		((PangoAttrInt*) attr)->value = SvTRUE (ST (1));
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrFontDesc	PREFIX = pango_attr_font_desc_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrFontDesc", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_font_desc_new (class, PangoFontDescription * font_desc, ...)
+    C_ARGS:
+	font_desc
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+PangoFontDescription_own *
+desc (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = pango_font_description_copy (((PangoAttrFontDesc*) attr)->desc);
+	if (items > 1) {
+		if (((PangoAttrFontDesc*) attr)->desc)
+			pango_font_description_free (((PangoAttrFontDesc*) attr)->desc);
+		((PangoAttrFontDesc*) attr)->desc =
+			pango_font_description_copy (SvPangoFontDescription (ST (1)));
+	}
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrScale	PREFIX = pango_attr_scale_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrScale", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_scale_new (class, float scale, ...)
+    C_ARGS:
+	scale
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+double
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrFloat*) attr)->value;
+	if (items > 1)
+		((PangoAttrFloat*) attr)->value = SvNV (ST (1));
+    OUTPUT:
+	RETVAL
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrRise	PREFIX = pango_attr_rise_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrRise", "Pango::AttrInt");
+
+PangoAttribute_own * pango_attr_rise_new (class, int rise, ...)
+    C_ARGS:
+	rise
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrShape	PREFIX = pango_attr_shape_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrShape", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_shape_new (class, PangoRectangle *ink_rect, PangoRectangle *logical_rect, ...)
+    C_ARGS:
+	ink_rect, logical_rect
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (3, RETVAL);
+
+PangoRectangle *
+ink_rect (PangoAttribute * attr, ...)
+    ALIAS:
+	logical_rect = 1
+    PREINIT:
+	PangoAttrShape * attrshape;
+    CODE:
+	attrshape = (PangoAttrShape *) attr;
+	RETVAL = ix == 0 ? &(attrshape->ink_rect) : &(attrshape->logical_rect);
+	if (items > 1) {
+		PangoRectangle * rect = SvPangoRectangle (ST (1));
+		if (ix == 0)
+			attrshape->ink_rect = *rect;
+		else
+			attrshape->logical_rect = *rect;
+	}
+    OUTPUT:
+	RETVAL
+
+# FIXME: Needed?
+# PangoAttribute * pango_attr_shape_new_with_data (const PangoRectangle  *ink_rect, const PangoRectangle *logical_rect, gpointer data, PangoAttrDataCopyFunc copy_func, GDestroyNotify destroy_func)
+
+# --------------------------------------------------------------------------- #
+
+#if PANGO_CHECK_VERSION (1, 4, 0)
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrFallback	PREFIX = pango_attr_fallback_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrFallback", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_fallback_new (class, gboolean enable_fallback, ...)
+    C_ARGS:
+	enable_fallback
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+gboolean
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrInt*) attr)->value;
+	if (items > 1)
+		((PangoAttrInt*) attr)->value = SvTRUE (ST (1));
+    OUTPUT:
+	RETVAL
+
+#endif
+
+# --------------------------------------------------------------------------- #
+
+#if PANGO_CHECK_VERSION (1, 6, 0)
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrLetterSpacing	PREFIX = pango_attr_letter_spacing_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrLetterSpacing", "Pango::AttrInt");
+
+PangoAttribute_own * pango_attr_letter_spacing_new (class, int letter_spacing, ...)
+    C_ARGS:
+	letter_spacing
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+#endif
+
+# --------------------------------------------------------------------------- #
+
+#if PANGO_CHECK_VERSION (1, 8, 0)
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrUnderlineColor	PREFIX = pango_attr_underline_color_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrUnderlineColor", "Pango::AttrColor");
+
+PangoAttribute_own * pango_attr_underline_color_new (class, guint16 red, guint16 green, guint16 blue, ...)
+    C_ARGS:
+	red, green, blue
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (4, RETVAL);
+
+#endif
+
+# --------------------------------------------------------------------------- #
+
+#if PANGO_CHECK_VERSION (1, 8, 0)
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrStrikethroughColor	PREFIX = pango_attr_strikethrough_color_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrStrikethroughColor", "Pango::AttrColor");
+
+PangoAttribute_own * pango_attr_strikethrough_color_new (class, guint16 red, guint16 green, guint16 blue, ...)
+    C_ARGS:
+	red, green, blue
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (4, RETVAL);
+
+#endif
+
+# --------------------------------------------------------------------------- #
+
+#if PANGO_CHECK_VERSION (1, 16, 0)
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrGravity	PREFIX = pango_attr_gravity_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrGravity", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_gravity_new (class, PangoGravity gravity, ...)
+    C_ARGS:
+	gravity
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+PangoGravity
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrInt*)attr)->value;
+	if (items > 1)
+		((PangoAttrInt*)attr)->value = SvPangoGravity (ST (1));
+    OUTPUT:
+	RETVAL
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrGravityHint	PREFIX = pango_attr_gravity_hint_
+
+BOOT:
+	gperl_set_isa ("Pango::AttrGravityHint", "Pango::Attribute");
+
+PangoAttribute_own * pango_attr_gravity_hint_new (class, PangoGravityHint hint, ...)
+    C_ARGS:
+	hint
+    POSTCALL:
+	GTK2PERL_PANGO_ATTR_STORE_INDICES (2, RETVAL);
+
+PangoGravityHint
+value (PangoAttribute * attr, ...)
+    CODE:
+	RETVAL = ((PangoAttrInt*)attr)->value;
+	if (items > 1)
+		((PangoAttrInt*)attr)->value = SvPangoGravityHint (ST (1));
+    OUTPUT:
+	RETVAL
+
+#endif
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrList	PREFIX = pango_attr_list_
+
+=for position DESCRIPTION
+
+=head1 DESCRIPTION
+
+Pango::AttrList is a collection of Pango::Attributes.  These
+attributes annotate text with styles.
+
+=cut
+
+PangoAttrList_own * pango_attr_list_new (class)
+    C_ARGS:
+	/*void*/
+
+# The various insert functions assume ownership of the attribute, so we have to
+# hand them a copy.
+
+void pango_attr_list_insert (PangoAttrList *list, PangoAttribute *attr)
+    C_ARGS:
+	list, pango_attribute_copy (attr)
+
+void pango_attr_list_insert_before (PangoAttrList *list, PangoAttribute *attr)
+    C_ARGS:
+	list, pango_attribute_copy (attr)
+
+void pango_attr_list_change (PangoAttrList *list, PangoAttribute *attr)
+    C_ARGS:
+	list, pango_attribute_copy (attr)
+
+void pango_attr_list_splice (PangoAttrList *list, PangoAttrList *other, gint pos, gint len);
+
+#if PANGO_CHECK_VERSION (1, 2, 0)
+
+##PangoAttrList *pango_attr_list_filter (PangoAttrList *list, PangoAttrFilterFunc  func, gpointer data);
+PangoAttrList_own_ornull *
+pango_attr_list_filter (PangoAttrList *list, SV *func, SV *data = NULL)
+    PREINIT:
+	GPerlCallback *callback;
+    CODE:
+	callback = gtk2perl_pango_attr_filter_func_create (func, data);
+	RETVAL = pango_attr_list_filter (
+	       	   list, gtk2perl_pango_attr_filter_func, callback);
+	gperl_callback_destroy (callback);
+    OUTPUT:
+	RETVAL
+
+#endif
+
+PangoAttrIterator *pango_attr_list_get_iterator (PangoAttrList *list);
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango::AttrIterator	PREFIX = pango_attr_iterator_
+
+void pango_attr_iterator_range (PangoAttrIterator *iterator, OUTLIST gint start, OUTLIST gint end);
+
+gboolean pango_attr_iterator_next (PangoAttrIterator *iterator);
+
+PangoAttribute_ornull *pango_attr_iterator_get (PangoAttrIterator *iterator, PangoAttrType type);
+
+##void pango_attr_iterator_get_font (PangoAttrIterator *iterator, PangoFontDescription *desc, PangoLanguage **language, GSList **extra_attrs);
+=for apidoc
+=for signature ($desc, $lang, $extra_attrs) = $iterator->get_font
+=cut
+void
+pango_attr_iterator_get_font (PangoAttrIterator *iterator)
+    PREINIT:
+	PangoFontDescription *desc;
+	PangoLanguage *language;
+	GSList *extra_attrs, *i;
+    PPCODE:
+	desc = pango_font_description_new ();
+	language = NULL;
+	extra_attrs = NULL;
+	pango_attr_iterator_get_font (iterator, desc, &language, &extra_attrs);
+	XPUSHs (sv_2mortal (newSVPangoFontDescription_copy (desc)));
+	XPUSHs (sv_2mortal (newSVPangoLanguage_ornull (language)));
+	for (i = extra_attrs; i != NULL; i = i->next)
+		XPUSHs (sv_2mortal (newSVPangoAttribute_own (i->data)));
+	if (extra_attrs)
+		g_slist_free (extra_attrs);
+
+#if PANGO_CHECK_VERSION (1, 2, 0)
+
+##GSList * pango_attr_iterator_get_attrs (PangoAttrIterator *iterator);
+void
+pango_attr_iterator_get_attrs (PangoAttrIterator *iterator)
+    PREINIT:
+	GSList *result, *i;
+    PPCODE:
+	result = pango_attr_iterator_get_attrs (iterator);
+	for (i = result; i != NULL; i = i->next)
+		XPUSHs (sv_2mortal (newSVPangoAttribute_own (i->data)));
+	g_slist_free (result);
+
+#endif
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Attributes	PACKAGE = Pango	PREFIX = pango_
+
+# don't clobber the pod for Pango!
+=for object Pango::AttrList
+=cut
+
+##gboolean pango_parse_markup (const char                 *markup_text,
+##                             int                         length,
+##                             gunichar                    accel_marker,
+##                             PangoAttrList             **attr_list,
+##                             char                      **text,
+##                             gunichar                   *accel_char,
+##                             GError                    **error);
+##
+=for apidoc __gerror__
+=for signature ($attr_list, $text, $accel_char) = Pango->parse_markup ($markup_text, $accel_marker)
+Parses marked-up text to create a plaintext string and an attribute list.
+
+If I<$accel_marker> is supplied and nonzero, the given character will mark the
+character following it as an accelerator.  For example, the accel marker might
+be an ampersand or underscore.  All characters marked as an acclerator will
+receive a PANGO_UNDERLINE_LOW attribute, and the first character so marked will
+be returned in I<$accel_char>.  Two I<$accel_marker> characters following each
+other reduce to a single literal I<$accel_marker> character.
+=cut
+void
+pango_parse_markup (class, const gchar_length * markup_text, int length(markup_text), gunichar accel_marker=0)
+    PREINIT:
+	PangoAttrList * attr_list;
+	char * text;
+	gunichar accel_char;
+	GError * error = NULL;
+    PPCODE:
+	if (! pango_parse_markup (markup_text, XSauto_length_of_markup_text,
+				  accel_marker, &attr_list, &text,
+				  &accel_char, &error))
+		gperl_croak_gerror (NULL, error);
+	EXTEND (SP, 3);
+	PUSHs (sv_2mortal (newSVPangoAttrList (attr_list)));
+	PUSHs (sv_2mortal (newSVGChar (text)));
+	g_free (text);
+	if (accel_char) {
+		/* adapted from Glib/typemap */
+		gchar temp[6];
+		gint length = g_unichar_to_utf8 (accel_char, temp);
+		PUSHs (sv_2mortal (newSVpv (temp, length)));
+		SvUTF8_on (ST (2));
+	}

Added: trunk/xs/PangoCairo.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoCairo.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,232 @@
+/*
+ * Copyright (c) 2005 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * Licensed under the LGPL, see LICENSE file for more information.
+ *
+ * $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/PangoCairo.xs,v 1.13 2008/01/07 19:54:50 kaffeetisch Exp $
+ */
+
+#include "pango-perl.h"
+#include <cairo-perl.h>
+#include <gperl_marshal.h>
+
+/* ------------------------------------------------------------------------- */
+
+#if PANGO_CHECK_VERSION (1, 17, 0)
+
+static void
+gtk2perl_pango_cairo_shape_renderer_func (cairo_t        *cr,
+					  PangoAttrShape *attr,
+					  gboolean        do_path,
+					  gpointer        data)
+{
+	GPerlCallback *callback = (GPerlCallback *) data;
+	dGPERL_CALLBACK_MARSHAL_SP;
+
+	GPERL_CALLBACK_MARSHAL_INIT (callback);
+
+	ENTER;
+	SAVETMPS;
+
+	PUSHMARK (SP);
+
+	EXTEND (SP, 3);
+	PUSHs (sv_2mortal (newSVCairo (cr)));
+	PUSHs (sv_2mortal (newSVPangoAttribute (attr)));
+	PUSHs (sv_2mortal (newSVuv (do_path)));
+	if (callback->data)
+		XPUSHs (sv_2mortal (newSVsv (callback->data)));
+
+	PUTBACK;
+
+	call_sv (callback->func, G_DISCARD);
+
+	FREETMPS;
+	LEAVE;
+}
+
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+MODULE = Pango::Cairo	PACKAGE = Pango::Cairo::FontMap	PREFIX = pango_cairo_font_map_
+
+# PangoFontMap *pango_cairo_font_map_new (void);
+PangoFontMap_noinc * pango_cairo_font_map_new (class)
+    C_ARGS:
+	/* void */
+
+# PangoFontMap *pango_cairo_font_map_get_default (void);
+PangoFontMap * pango_cairo_font_map_get_default (class)
+    C_ARGS:
+	/* void */
+
+void pango_cairo_font_map_set_resolution (PangoCairoFontMap *fontmap, double dpi);
+
+double pango_cairo_font_map_get_resolution (PangoCairoFontMap *fontmap);
+
+# PangoContext *pango_cairo_font_map_create_context (PangoCairoFontMap *fontmap);
+SV *
+pango_cairo_font_map_create_context (PangoCairoFontMap *fontmap)
+    PREINIT:
+	PangoContext *context;
+	HV *stash;
+    CODE:
+	context = pango_cairo_font_map_create_context (fontmap);
+	if (!context)
+		XSRETURN_UNDEF;
+	RETVAL = newSVPangoContext (context);
+	stash = gv_stashpv ("Pango::Cairo::Context", TRUE);
+	sv_bless (RETVAL, stash);
+    OUTPUT:
+	RETVAL
+
+#if PANGO_CHECK_VERSION (1, 18, 0)
+
+# PangoFontMap *pango_cairo_font_map_new_for_font_type (cairo_font_type_t fonttype);
+PangoFontMap_noinc * pango_cairo_font_map_new_for_font_type (class, cairo_font_type_t fonttype)
+    C_ARGS:
+	fonttype
+
+cairo_font_type_t pango_cairo_font_map_get_font_type (PangoCairoFontMap *fontmap);
+
+#endif
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Cairo	PACKAGE = Pango::Cairo::Font	PREFIX = pango_cairo_font_
+
+#if PANGO_CHECK_VERSION (1, 18, 0)
+
+cairo_scaled_font_t *pango_cairo_font_get_scaled_font (PangoCairoFont *font);
+
+#endif
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Cairo	PACKAGE = Pango::Cairo	PREFIX = pango_cairo_
+
+=for position DESCRIPTION
+I<Pango::Cairo> contains a few functions that help integrate pango and
+cairo.  Since they aren't methods of a particular object, they are bound as
+plain functions.
+=cut
+
+=for apidoc __function__
+=cut
+void pango_cairo_update_context (cairo_t *cr, PangoContext *context);
+
+=for apidoc __function__
+=cut
+PangoLayout *pango_cairo_create_layout (cairo_t *cr);
+
+=for apidoc __function__
+=cut
+void pango_cairo_update_layout (cairo_t *cr, PangoLayout *layout);
+
+=for apidoc __function__
+=cut
+void pango_cairo_show_glyph_string (cairo_t *cr, PangoFont *font, PangoGlyphString *glyphs);
+
+=for apidoc __function__
+=cut
+void pango_cairo_show_layout_line (cairo_t *cr, PangoLayoutLine *line);
+
+=for apidoc __function__
+=cut
+void pango_cairo_show_layout (cairo_t *cr, PangoLayout *layout);
+
+=for apidoc __function__
+=cut
+void pango_cairo_glyph_string_path (cairo_t *cr, PangoFont *font, PangoGlyphString *glyphs);
+
+=for apidoc __function__
+=cut
+void pango_cairo_layout_line_path (cairo_t *cr, PangoLayoutLine *line);
+
+=for apidoc __function__
+=cut
+void pango_cairo_layout_path (cairo_t *cr, PangoLayout *layout);
+
+#if PANGO_CHECK_VERSION (1, 14, 0)
+
+=for apidoc __function__
+=cut
+void pango_cairo_show_error_underline (cairo_t *cr, double x, double y, double width, double height);
+
+=for apidoc __function__
+=cut
+void pango_cairo_error_underline_path (cairo_t *cr, double x, double y, double width, double height);
+
+#endif
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Cairo	PACKAGE = Pango::Cairo::Context	PREFIX = pango_cairo_context_
+
+BOOT:
+	gperl_set_isa ("Pango::Cairo::Context", "Pango::Context");
+
+=for position post_hierarchy
+
+=head1 HIERARCHY
+
+  Glib::Object
+  +----Pango::Context
+       +----Pango::Cairo::Context
+
+=cut
+
+=for apidoc __function__
+=cut
+void pango_cairo_context_set_font_options (PangoContext *context, const cairo_font_options_t *options);
+
+=for apidoc __function__
+=cut
+# const cairo_font_options_t *pango_cairo_context_get_font_options (PangoContext *context);
+const cairo_font_options_t *pango_cairo_context_get_font_options (PangoContext *context);
+    CODE:
+	RETVAL = cairo_font_options_copy (
+			pango_cairo_context_get_font_options (context));
+    OUTPUT:
+	RETVAL
+
+=for apidoc __function__
+=cut
+void pango_cairo_context_set_resolution (PangoContext *context, double dpi);
+
+=for apidoc __function__
+=cut
+double pango_cairo_context_get_resolution (PangoContext *context);
+
+#if PANGO_CHECK_VERSION (1, 18, 0)
+
+=for apidoc __function__
+=cut
+# void pango_cairo_context_set_shape_renderer (PangoContext *context, PangoCairoShapeRendererFunc func, gpointer data, GDestroyNotify dnotify)
+void
+pango_cairo_context_set_shape_renderer (PangoContext *context, SV *func=NULL, SV *data=NULL)
+    PREINIT:
+	GPerlCallback *callback;
+	GDestroyNotify dnotify;
+    CODE:
+	if (gperl_sv_is_defined (func)) {
+		callback = gperl_callback_new (func, data, 0, NULL, 0);
+		dnotify = (GDestroyNotify) gperl_callback_destroy;
+	} else {
+		callback = NULL;
+		dnotify = NULL;
+	}
+	pango_cairo_context_set_shape_renderer (
+		context,
+		gtk2perl_pango_cairo_shape_renderer_func,
+		callback,
+		dnotify);
+
+# Is this useful?  You can't use it to store away the old renderer while you
+# temporarily install your own, since when you call set_shape_renderer(), the
+# old renderer's destruction notification is executed.  So the stuff you got
+# from get_shape_renderer() is now garbage.
+# PangoCairoShapeRendererFunc pango_cairo_context_get_shape_renderer (PangoContext *context, gpointer *data)
+
+#endif

Added: trunk/xs/PangoContext.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoContext.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2003-2004 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
+ * Boston, MA  02111-1307  USA.
+ *
+ * $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/PangoContext.xs,v 1.16 2007/06/17 12:55:57 kaffeetisch Exp $
+ */
+#include "pango-perl.h"
+
+MODULE = Pango::Context	PACKAGE = Pango::Context	PREFIX = pango_context_
+
+ ## applications have no cause to use pango_context_new() -- it is intended
+ ## to be used by backends.  i seriously doubt anyone would want to write a
+ ## pango backend in Perl, unless they want something that's really slow.
+ ## higher-level APIs are used to create contexts appropriate for the desired
+ ## backend, e.g. $gtkwidget->create_pango_context.
+##  PangoContext *pango_context_new (void) 
+
+ ## same thing goes for pango_context_set_font_map.
+##  void pango_context_set_font_map (PangoContext *context, PangoFontMap *font_map) 
+
+#if PANGO_CHECK_VERSION (1, 6, 0)
+
+##  PangoFontMap *pango_context_get_font_map (PangoContext *context)
+PangoFontMap *
+pango_context_get_font_map (context)
+	PangoContext *context
+
+#endif
+
+###  void pango_context_list_families (PangoContext *context, PangoFontFamily ***families, int *n_families) 
+=for apidoc
+=for signature @families = $context->list_families
+=cut
+void
+pango_context_list_families (context)
+	PangoContext *context
+    PREINIT:
+	PangoFontFamily **families = NULL;
+	int n_families;
+    PPCODE:
+	pango_context_list_families (context, &families, &n_families);
+	if (n_families > 0) {
+		int i;
+		EXTEND (SP, n_families);
+		for (i = 0 ; i < n_families ; i++)
+			PUSHs (sv_2mortal (newSVPangoFontFamily (families[i])));
+		g_free (families);
+	}
+
+##  PangoFont * pango_context_load_font (PangoContext *context, const PangoFontDescription *desc) 
+### may return NULL....
+PangoFont_noinc *
+pango_context_load_font (context, desc)
+	PangoContext *context
+	PangoFontDescription_ornull *desc
+    CODE:
+	RETVAL = pango_context_load_font (context, desc);
+	if (!RETVAL)
+		XSRETURN_UNDEF;
+    OUTPUT:
+	RETVAL
+
+##  PangoFontset *pango_context_load_fontset (PangoContext *context, const PangoFontDescription *desc, PangoLanguage *language) 
+PangoFontset_noinc *
+pango_context_load_fontset (context, desc, language)
+	PangoContext *context
+	PangoFontDescription *desc
+	PangoLanguage_ornull *language
+    CODE:
+	RETVAL = pango_context_load_fontset (context, desc, language);
+	if (!RETVAL)
+		XSRETURN_UNDEF;
+    OUTPUT:
+	RETVAL
+
+##  PangoFontMetrics *pango_context_get_metrics (PangoContext *context, const PangoFontDescription *desc, PangoLanguage *language) 
+PangoFontMetrics_own *
+pango_context_get_metrics (context, desc, language)
+	PangoContext *context
+	PangoFontDescription *desc
+	PangoLanguage_ornull *language
+
+##  void pango_context_set_font_description (PangoContext *context, const PangoFontDescription *desc) 
+void
+pango_context_set_font_description (context, desc)
+	PangoContext *context
+	PangoFontDescription *desc
+
+##  PangoFontDescription * pango_context_get_font_description (PangoContext *context) 
+## caller must not alter the returned value!  should use use a copy instead?
+PangoFontDescription *
+pango_context_get_font_description (context)
+	PangoContext *context
+
+##  PangoLanguage *pango_context_get_language (PangoContext *context) 
+PangoLanguage *
+pango_context_get_language (context)
+	PangoContext *context
+
+##  void pango_context_set_language (PangoContext *context, PangoLanguage *language) 
+void
+pango_context_set_language (context, language)
+	PangoContext *context
+	PangoLanguage *language
+
+##  void pango_context_set_base_dir (PangoContext *context, PangoDirection direction) 
+void
+pango_context_set_base_dir (context, direction)
+	PangoContext *context
+	PangoDirection direction
+
+##  PangoDirection pango_context_get_base_dir (PangoContext *context) 
+PangoDirection
+pango_context_get_base_dir (context)
+	PangoContext *context
+
+# FIXME
+###  GList *pango_itemize (PangoContext *context, const char *text, int start_index, int length, PangoAttrList *attrs, PangoAttrIterator *cached_iter) 
+#GList *
+#pango_itemize (context, text, start_index, length, attrs, cached_iter)
+#	PangoContext *context
+#	const char *text
+#	int start_index
+#	int length
+#	PangoAttrList *attrs
+#	PangoAttrIterator *cached_iter
+
+#if PANGO_CHECK_VERSION (1, 6, 0)
+
+##  PangoMatrix * pango_context_get_matrix (PangoContext *context)
+const PangoMatrix_ornull *
+pango_context_get_matrix (context)
+	PangoContext *context
+
+##  void pango_context_set_matrix (PangoContext *context, PangoMatrix *matrix)
+void
+pango_context_set_matrix (context, matrix)
+	PangoContext *context
+	PangoMatrix_ornull *matrix
+
+#endif
+
+#if PANGO_CHECK_VERSION (1, 16, 0)
+
+void pango_context_set_base_gravity (PangoContext *context, PangoGravity gravity);
+
+PangoGravity pango_context_get_base_gravity (PangoContext *context);
+
+PangoGravity pango_context_get_gravity (PangoContext *context);
+
+void pango_context_set_gravity_hint (PangoContext *context, PangoGravityHint hint);
+
+PangoGravityHint pango_context_get_gravity_hint (PangoContext *context);
+
+#endif

Added: trunk/xs/PangoFont.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoFont.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,404 @@
+/*
+ * Copyright (c) 2003-2005 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
+ * Boston, MA  02111-1307  USA.
+ *
+ * $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/PangoFont.xs,v 1.31 2007/09/15 14:33:03 kaffeetisch Exp $
+ */
+
+#include "pango-perl.h"
+
+MODULE = Pango::Font	PACKAGE = Pango
+
+=for object Pango::FontDescription
+=cut
+
+### some constants...
+double
+scale (class)
+    ALIAS:
+	Pango::scale_xx_small = 1
+	Pango::scale_x_small  = 2
+	Pango::scale_small    = 3
+	Pango::scale_medium   = 4
+	Pango::scale_large    = 5
+	Pango::scale_x_large  = 6
+	Pango::scale_xx_large = 7
+    CODE:
+	switch (ix) {
+		case 0: RETVAL = (double)PANGO_SCALE; break;
+		case 1: RETVAL = PANGO_SCALE_XX_SMALL; break;
+		case 2: RETVAL = PANGO_SCALE_X_SMALL; break;
+		case 3: RETVAL = PANGO_SCALE_SMALL; break;
+		case 4: RETVAL = PANGO_SCALE_MEDIUM; break;
+		case 5: RETVAL = PANGO_SCALE_LARGE; break;
+		case 6: RETVAL = PANGO_SCALE_X_LARGE; break;
+		case 7: RETVAL = PANGO_SCALE_XX_LARGE; break;
+		default:
+			RETVAL = 0.0;
+			g_assert_not_reached ();
+	}
+    OUTPUT:
+	RETVAL
+
+double
+PANGO_PIXELS (class, d)
+	double d
+    ALIAS:
+	Pango::pixels = 1
+    C_ARGS:
+	d
+    CLEANUP:
+	PERL_UNUSED_VAR (ix);
+
+MODULE = Pango::Font	PACKAGE = Pango::FontDescription	PREFIX = pango_font_description_
+
+##PangoFontDescription* pango_font_description_new (void)
+PangoFontDescription_own *
+pango_font_description_new (class)
+    C_ARGS:
+	/* void */
+
+## guint pango_font_description_hash (const PangoFontDescription *desc)
+guint
+pango_font_description_hash (desc)
+	PangoFontDescription *desc
+
+## gboolean pango_font_description_equal (const PangoFontDescription *desc1, const PangoFontDescription *desc2)
+gboolean
+pango_font_description_equal (desc1, desc2)
+	PangoFontDescription *desc1
+	PangoFontDescription *desc2
+
+# should be taken care of automagically
+## void pango_font_description_free (PangoFontDescription *desc)
+## void pango_font_descriptions_free (PangoFontDescription **descs, int n_descs)
+
+## void pango_font_description_set_family (PangoFontDescription *desc, const char *family)
+void
+pango_font_description_set_family (desc, family)
+	PangoFontDescription *desc
+	const char *family
+
+## void pango_font_description_set_family_static (PangoFontDescription *desc, const char *family)
+void
+pango_font_description_set_family_static (desc, family)
+	PangoFontDescription *desc
+	const char *family
+
+## void pango_font_description_get_family (PangoFontDescription *desc, )
+const char *
+pango_font_description_get_family (desc)
+	PangoFontDescription *desc
+
+## void pango_font_description_set_style (PangoFontDescription *desc, PangoStyle style)
+void
+pango_font_description_set_style (desc, style)
+	PangoFontDescription *desc
+	PangoStyle style
+
+## PangoStyle pango_font_description_get_style (const PangoFontDescription *desc)
+PangoStyle
+pango_font_description_get_style (desc)
+	PangoFontDescription *desc
+
+## void pango_font_description_set_variant (PangoFontDescription *desc, PangoVariant variant)
+void
+pango_font_description_set_variant (desc, variant)
+	PangoFontDescription *desc
+	PangoVariant variant
+
+## PangoVariant pango_font_description_get_variant (const PangoFontDescription *desc)
+PangoVariant
+pango_font_description_get_variant (desc)
+	PangoFontDescription *desc
+
+## void pango_font_description_set_weight (PangoFontDescription *desc, PangoWeight weight)
+void
+pango_font_description_set_weight (desc, weight)
+	PangoFontDescription *desc
+	PangoWeight weight
+
+## PangoWeight pango_font_description_get_weight (const PangoFontDescription *desc)
+PangoWeight
+pango_font_description_get_weight (desc)
+	PangoFontDescription *desc
+
+## void pango_font_description_set_stretch (PangoFontDescription *desc, PangoStretch stretch)
+void
+pango_font_description_set_stretch (desc, stretch)
+	PangoFontDescription *desc
+	PangoStretch stretch
+
+## PangoStretch pango_font_description_get_stretch (const PangoFontDescription *desc)
+PangoStretch
+pango_font_description_get_stretch (desc)
+	PangoFontDescription *desc
+
+## void pango_font_description_set_size (PangoFontDescription *desc, gint size)
+void
+pango_font_description_set_size (desc, size)
+	PangoFontDescription *desc
+	gint size
+
+## gint pango_font_description_get_size (const PangoFontDescription *desc)
+gint
+pango_font_description_get_size (desc)
+	PangoFontDescription *desc
+
+## PangoFontMask pango_font_description_get_set_fields (const PangoFontDescription *desc)
+PangoFontMask
+pango_font_description_get_set_fields (desc)
+	PangoFontDescription *desc
+
+## void pango_font_description_unset_fields (PangoFontDescription *desc, PangoFontMask to_unset)
+void
+pango_font_description_unset_fields (desc, to_unset)
+	PangoFontDescription *desc
+	PangoFontMask to_unset
+
+## void pango_font_description_merge (PangoFontDescription *desc, const PangoFontDescription *desc_to_merge, gboolean replace_existing)
+void
+pango_font_description_merge (desc, desc_to_merge, replace_existing)
+	PangoFontDescription *desc
+	PangoFontDescription *desc_to_merge
+	gboolean replace_existing
+
+## void pango_font_description_merge_static (PangoFontDescription *desc, const PangoFontDescription *desc_to_merge, gboolean replace_existing)
+void
+pango_font_description_merge_static (desc, desc_to_merge, replace_existing)
+	PangoFontDescription *desc
+	PangoFontDescription *desc_to_merge
+	gboolean replace_existing
+
+## gboolean pango_font_description_better_match (const PangoFontDescription *desc, const PangoFontDescription *old_match, const PangoFontDescription *new_match)
+gboolean
+pango_font_description_better_match (desc, old_match, new_match)
+	PangoFontDescription *desc
+	PangoFontDescription_ornull *old_match
+	PangoFontDescription *new_match
+
+
+##PangoFontDescription *pango_font_description_from_string (const char *str)
+PangoFontDescription_own *
+pango_font_description_from_string (class, str)
+	const char * str
+    C_ARGS:
+	str
+
+## char * pango_font_description_to_string (const PangoFontDescription *desc)
+char *
+pango_font_description_to_string (desc)
+	PangoFontDescription *desc
+    CLEANUP:
+	g_free (RETVAL);
+
+## char * pango_font_description_to_filename (const PangoFontDescription *desc)
+char *
+pango_font_description_to_filename (desc)
+	PangoFontDescription *desc
+    CLEANUP:
+	g_free (RETVAL);
+
+#if PANGO_CHECK_VERSION (1, 8, 0)
+
+void pango_font_description_set_absolute_size (PangoFontDescription *desc, double size);
+
+gboolean pango_font_description_get_size_is_absolute (const PangoFontDescription *desc);
+
+#endif
+
+#if PANGO_CHECK_VERSION (1, 16, 0)
+
+void pango_font_description_set_gravity (PangoFontDescription *desc, PangoGravity gravity);
+
+PangoGravity pango_font_description_get_gravity (const PangoFontDescription *desc);
+
+#endif
+
+MODULE = Pango::Font	PACKAGE = Pango::FontMetrics	PREFIX = pango_font_metrics_
+
+# should happen automagicly
+## void pango_font_metrics_unref (PangoFontMetrics *metrics)
+
+## int pango_font_metrics_get_ascent (PangoFontMetrics *metrics)
+int
+pango_font_metrics_get_ascent (metrics)
+	PangoFontMetrics *metrics
+
+## int pango_font_metrics_get_descent (PangoFontMetrics *metrics)
+int
+pango_font_metrics_get_descent (metrics)
+	PangoFontMetrics *metrics
+
+## int pango_font_metrics_get_approximate_char_width (PangoFontMetrics *metrics)
+int
+pango_font_metrics_get_approximate_char_width (metrics)
+	PangoFontMetrics *metrics
+
+## int pango_font_metrics_get_approximate_digit_width (PangoFontMetrics *metrics)
+int
+pango_font_metrics_get_approximate_digit_width (metrics)
+	PangoFontMetrics *metrics
+
+#if PANGO_CHECK_VERSION (1, 6, 0)
+
+## int pango_font_metrics_get_underline_position (PangoFontMetrics *metrics)
+int
+pango_font_metrics_get_underline_position (metrics)
+	PangoFontMetrics *metrics
+
+## int pango_font_metrics_get_underline_thickness (PangoFontMetrics *metrics)
+int
+pango_font_metrics_get_underline_thickness (metrics)
+	PangoFontMetrics *metrics
+
+## int pango_font_metrics_get_strikethrough_position (PangoFontMetrics *metrics)
+int
+pango_font_metrics_get_strikethrough_position (metrics)
+	PangoFontMetrics *metrics
+
+## int pango_font_metrics_get_strikethrough_thickness (PangoFontMetrics *metrics)
+int
+pango_font_metrics_get_strikethrough_thickness (metrics)
+	PangoFontMetrics *metrics
+
+#endif
+
+MODULE = Pango::Font	PACKAGE = Pango::FontFamily	PREFIX = pango_font_family_
+
+BOOT:
+	gperl_object_set_no_warn_unreg_subclass (PANGO_TYPE_FONT_FAMILY, TRUE);
+
+## void pango_font_family_list_faces (PangoFontFamily *family, PangoFontFace ***faces, int *n_faces)
+=for apidoc
+=for apidoc @faces = $family->list_faces
+Lists the different font faces that make up family. The faces in a family
+share a common design, but differ in slant, weight, width and other aspects.
+=cut
+void
+pango_font_family_list_faces (family)
+	PangoFontFamily *family
+    PREINIT:
+	PangoFontFace ** faces = NULL;
+	int n_faces;
+    PPCODE:
+	pango_font_family_list_faces(family, &faces, &n_faces);
+	if (n_faces > 0) {
+		int i;
+		EXTEND(SP,n_faces);
+		for (i = 0 ; i < n_faces ; i++)
+			PUSHs(sv_2mortal(newSVPangoFontFace(faces[i])));
+		g_free (faces);
+	}
+
+
+const char * pango_font_family_get_name (PangoFontFamily * family)
+
+#if PANGO_CHECK_VERSION(1, 4, 0)
+
+gboolean pango_font_family_is_monospace (PangoFontFamily * family)
+
+#endif
+
+MODULE = Pango::Font	PACKAGE = Pango::FontFace	PREFIX = pango_font_face_
+
+#
+# PangoFontFace
+#
+
+BOOT:
+	gperl_object_set_no_warn_unreg_subclass (PANGO_TYPE_FONT_FACE, TRUE);
+
+ ## PangoFontDescription *pango_font_face_describe (PangoFontFace *face);
+PangoFontDescription_own * pango_font_face_describe (PangoFontFace *face);
+
+ ## G_CONST_RETURN char *pango_font_face_get_face_name (PangoFontFace *face);
+const char *pango_font_face_get_face_name (PangoFontFace *face);
+
+#if PANGO_CHECK_VERSION(1, 4, 0)
+
+ ## void pango_font_face_list_sizes (PangoFontFace  *face, int **sizes, int *n_sizes);
+=for apidoc
+=for signature @sizes = $face->list_sizes
+List the sizes available for a bitmapped font.  For scalable fonts, this will
+return an empty list.
+=cut
+void
+pango_font_face_list_sizes (PangoFontFace *face)
+    PREINIT:
+	int *sizes=NULL, n_sizes, i;
+    PPCODE:
+	pango_font_face_list_sizes (face, &sizes, &n_sizes);
+	if (n_sizes > 0) {
+		EXTEND (SP, n_sizes);
+		for (i = 0 ; i < n_sizes ; i++)
+			PUSHs (sv_2mortal (newSViv (sizes[i])));
+		g_free (sizes);
+	}
+
+#endif
+
+#if PANGO_CHECK_VERSION(1, 18, 0)
+
+gboolean pango_font_face_is_synthesized (PangoFontFace *face);
+
+#endif
+
+MODULE = Pango::Font	PACKAGE = Pango::Font	PREFIX = pango_font_
+
+## PangoFontMetrics * pango_font_get_metrics (PangoFont *font, PangoLanguage *language)
+PangoFontMetrics *
+pango_font_get_metrics (font, language)
+	PangoFont *font
+	PangoLanguage *language
+
+## PangoFontDescription* pango_font_describe (PangoFont *font)
+PangoFontDescription_own *
+pango_font_describe (font)
+	PangoFont *font
+
+#if PANGO_CHECK_VERSION(1, 14, 0)
+
+ ## PangoFontDescription *pango_font_describe_with_absolute_size (PangoFont *font);
+PangoFontDescription_own *pango_font_describe_with_absolute_size (PangoFont *font);
+
+#endif
+
+## void pango_font_get_glyph_extents (PangoFont *font, PangoGlyph glyph, PangoRectangle *ink_rect, PangoRectangle *logical_rect)
+void
+pango_font_get_glyph_extents (font, glyph)
+	PangoFont *font
+	PangoGlyph glyph
+    PREINIT:
+	PangoRectangle ink_rect;
+	PangoRectangle logical_rect;
+    PPCODE:
+	pango_font_get_glyph_extents (font, glyph, &ink_rect, &logical_rect);
+	EXTEND (sp, 2);
+	PUSHs (sv_2mortal (newSVPangoRectangle (&ink_rect)));
+	PUSHs (sv_2mortal (newSVPangoRectangle (&logical_rect)));
+
+#if PANGO_CHECK_VERSION(1, 10, 0)
+
+PangoFontMap * pango_font_get_font_map (PangoFont *font);
+
+#endif
+
+### no typemaps for this stuff.
+### it looks like it would only be useful from C, though.
+### PangoCoverage * pango_font_get_coverage (PangoFont *font, PangoLanguage *language)
+### PangoEngineShape * pango_font_find_shaper (PangoFont *font, PangoLanguage *language, guint32 ch)

Added: trunk/xs/PangoFontMap.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoFontMap.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2004 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
+ * Boston, MA  02111-1307  USA.
+ *
+ * $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/PangoFontMap.xs,v 1.2 2007/07/07 17:22:06 kaffeetisch Exp $
+ */
+
+#include "pango-perl.h"
+
+MODULE = Pango::FontMap	PACKAGE = Pango::FontMap	PREFIX = pango_font_map_
+
+##  PangoFont * pango_font_map_load_font (PangoFontMap *fontmap, PangoContext *context, const PangoFontDescription *desc)
+PangoFont_ornull *
+pango_font_map_load_font (fontmap, context, desc)
+	PangoFontMap *fontmap
+	PangoContext *context
+	const PangoFontDescription *desc
+
+##  PangoFontset * pango_font_map_load_fontset (PangoFontMap *fontmap, PangoContext *context, const PangoFontDescription *desc, PangoLanguage *language)
+PangoFontset_ornull *
+pango_font_map_load_fontset (fontmap, context, desc, language)
+	PangoFontMap *fontmap
+	PangoContext *context
+	const PangoFontDescription *desc
+	PangoLanguage *language
+
+##  void pango_font_map_list_families (PangoFontMap *fontmap, PangoFontFamily ***families, int *n_families)
+void
+pango_font_map_list_families (fontmap)
+	PangoFontMap *fontmap
+    PREINIT:
+	PangoFontFamily **families = NULL;
+	int n_families = 0, i;
+    PPCODE:
+	pango_font_map_list_families (fontmap, &families, &n_families);
+	if (families) {
+		EXTEND (sp, n_families);
+		for (i = 0; i < n_families; i++)
+			PUSHs (sv_2mortal (newSVPangoFontFamily (families[i])));
+		g_free (families);
+	}

Added: trunk/xs/PangoFontset.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoFontset.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2003 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * Licensed under the LGPL, see LICENSE file for more information.
+ *
+ * $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/PangoFontset.xs,v 1.2 2004/06/04 20:45:00 muppetman Exp $
+ */
+
+#include "pango-perl.h"
+
+#if PANGO_CHECK_VERSION (1, 4, 0)
+
+static GPerlCallback *
+gtk2perl_pango_fontset_foreach_func_create (SV *func, SV *data)
+{
+	GType param_types[2];
+	param_types[0] = PANGO_TYPE_FONTSET;
+	param_types[1] = PANGO_TYPE_FONT;
+	return gperl_callback_new (func, data, G_N_ELEMENTS (param_types),
+	                           param_types, G_TYPE_BOOLEAN);
+}
+
+static gboolean
+gtk2perl_pango_fontset_foreach_func (PangoFontset *fontset, PangoFont *font, GPerlCallback *callback)
+{
+	GValue value = {0,};
+	gboolean retval;
+
+	g_value_init (&value, callback->return_type);
+	gperl_callback_invoke (callback, &value, fontset, font);
+	retval = g_value_get_boolean (&value);
+	g_value_unset (&value);
+
+	return retval;
+}
+
+#endif /* 1.4.0 */
+
+MODULE = Pango::Fontset	PACKAGE = Pango::Fontset	PREFIX = pango_fontset_
+
+BOOT:
+	gperl_object_set_no_warn_unreg_subclass (PANGO_TYPE_FONTSET, TRUE);
+
+##  PangoFont * pango_fontset_get_font (PangoFontset *fontset, guint wc) 
+PangoFont *
+pango_fontset_get_font (fontset, wc)
+	PangoFontset *fontset
+	guint wc
+
+##  PangoFontMetrics *pango_fontset_get_metrics (PangoFontset *fontset) 
+PangoFontMetrics *
+pango_fontset_get_metrics (fontset)
+	PangoFontset *fontset
+
+#if PANGO_CHECK_VERSION (1, 4, 0)
+
+##  void pango_fontset_foreach (PangoFontset *fontset, PangoFontsetForeachFunc func, gpointer data) 
+void
+pango_fontset_foreach (fontset, func, data=NULL)
+	PangoFontset *fontset
+	SV *func
+	SV *data
+    PREINIT:
+	GPerlCallback *callback;
+    CODE:
+	callback = gtk2perl_pango_fontset_foreach_func_create (func, data);
+	pango_fontset_foreach (fontset,
+	                       (PangoFontsetForeachFunc)
+	                         gtk2perl_pango_fontset_foreach_func,
+	                       callback);
+	gperl_callback_destroy (callback);
+
+#endif /* 1.4.0 */

Added: trunk/xs/PangoGravity.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoGravity.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2007 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
+ * Boston, MA  02111-1307  USA.
+ *
+ * $Id: PangoGravity.xs,v 1.1 2007/02/25 14:47:57 kaffeetisch Exp $
+ */
+
+#include "pango-perl.h"
+
+MODULE = Pango::Gravity	PACKAGE = Pango::Gravity	PREFIX = pango_gravity_
+
+=for apidoc __function__
+=cut
+gboolean
+is_vertical (PangoGravity gravity)
+    CODE:
+	RETVAL = PANGO_GRAVITY_IS_VERTICAL (gravity);
+    OUTPUT:
+	RETVAL
+
+=for apidoc __function__
+=cut
+double pango_gravity_to_rotation (PangoGravity gravity);
+
+=for apidoc __function__
+=cut
+PangoGravity pango_gravity_get_for_matrix (const PangoMatrix *matrix);
+
+=for apidoc __function__
+=cut
+PangoGravity pango_gravity_get_for_script (PangoScript script, PangoGravity base_gravity, PangoGravityHint hint);

Added: trunk/xs/PangoLayout.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoLayout.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,716 @@
+/*
+ * Copyright (c) 2003-2005 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
+ * Boston, MA  02111-1307  USA.
+ *
+ * $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/PangoLayout.xs,v 1.39 2008/03/10 20:54:37 kaffeetisch Exp $
+ */
+
+#include "pango-perl.h"
+
+/* ------------------------------------------------------------------------- */
+
+#if !PANGO_CHECK_VERSION (1, 20, 0)
+
+static gpointer
+gtk2perl_pango_layout_iter_copy (gpointer boxed)
+{
+	croak ("Can't copy a PangoLayoutIter");
+	return boxed;
+}
+
+#endif
+
+GType
+gtk2perl_pango_layout_iter_get_type (void)
+{
+	static GType t = 0;
+	if (!t)
+		t = g_boxed_type_register_static ("PangoLayoutIter",
+#if PANGO_CHECK_VERSION (1, 20, 0)
+		      (GBoxedCopyFunc) pango_layout_iter_copy,
+#else
+		      (GBoxedCopyFunc) gtk2perl_pango_layout_iter_copy,
+#endif
+		      (GBoxedFreeFunc) pango_layout_iter_free);
+	return t;
+}
+
+/* ------------------------------------------------------------------------- */
+
+GType
+gtk2perl_pango_layout_line_get_type (void)
+{
+	static GType t = 0;
+	if (!t)
+		t = g_boxed_type_register_static ("PangoLayoutLine",
+		      (GBoxedCopyFunc) pango_layout_line_ref,
+		      (GBoxedFreeFunc) pango_layout_line_unref);
+	return t;
+}
+
+/* ------------------------------------------------------------------------- */
+
+SV *
+newSVPangoRectangle (PangoRectangle * rectangle)
+{
+	HV * hv;
+
+	if (!rectangle)
+		return &PL_sv_undef;
+
+	hv = newHV ();
+
+	hv_store (hv, "x", 1, newSViv (rectangle->x), 0);
+	hv_store (hv, "y", 1, newSViv (rectangle->y), 0);
+	hv_store (hv, "width", 5, newSViv (rectangle->width), 0);
+	hv_store (hv, "height", 6, newSViv (rectangle->height), 0);
+
+	return newRV_noinc ((SV *) hv);
+}
+
+PangoRectangle *
+SvPangoRectangle (SV * sv)
+{
+	PangoRectangle *rectangle;
+	SV ** v;
+
+	if (!gperl_sv_is_defined (sv))
+		return NULL;
+
+	rectangle = gperl_alloc_temp (sizeof (PangoRectangle));
+
+	if (gperl_sv_is_hash_ref (sv)) {
+		HV * hv = (HV *) SvRV (sv);
+
+		v = hv_fetch (hv, "x", 1, 0);
+		if (v && gperl_sv_is_defined (*v))
+			rectangle->x = SvIV (*v);
+
+		v = hv_fetch (hv, "y", 1, 0);
+		if (v && gperl_sv_is_defined (*v))
+			rectangle->y = SvIV (*v);
+
+		v = hv_fetch (hv, "width", 5, 0);
+		if (v && gperl_sv_is_defined (*v))
+			rectangle->width = SvIV (*v);
+
+		v = hv_fetch (hv, "height", 6, 0);
+		if (v && gperl_sv_is_defined (*v))
+			rectangle->height = SvIV (*v);
+	} else if (gperl_sv_is_array_ref (sv)) {
+		AV * av = (AV *) SvRV (sv);
+
+		v = av_fetch (av, 0, 0);
+		if (v && gperl_sv_is_defined (*v))
+			rectangle->x = SvIV (*v);
+
+		v = av_fetch (av, 1, 0);
+		if (v && gperl_sv_is_defined (*v))
+			rectangle->y = SvIV (*v);
+
+		v = av_fetch (av, 2, 0);
+		if (v && gperl_sv_is_defined (*v))
+			rectangle->width = SvIV (*v);
+
+		v = av_fetch (av, 3, 0);
+		if (v && gperl_sv_is_defined (*v))
+			rectangle->height = SvIV (*v);
+	} else {
+		croak ("a PangoRectangle must be a reference to a hash "
+		       "or a reference to an array");
+	}
+
+	return rectangle;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static SV *
+newSVPangoLogAttr (PangoLogAttr * logattr)
+{
+	HV * hv = newHV ();
+
+#define STORE_BIT(key) \
+	hv_store (hv, #key, sizeof (#key) - 1, newSVuv (logattr->key), 0)
+
+	STORE_BIT (is_line_break);
+	STORE_BIT (is_mandatory_break);
+	STORE_BIT (is_char_break);
+	STORE_BIT (is_white);
+	STORE_BIT (is_cursor_position);
+	STORE_BIT (is_word_start);
+	STORE_BIT (is_word_end);
+	STORE_BIT (is_sentence_boundary);
+	STORE_BIT (is_sentence_start);
+	STORE_BIT (is_sentence_end);
+#if PANGO_CHECK_VERSION (1, 4, 0)
+	STORE_BIT (backspace_deletes_character);
+#endif
+#if PANGO_CHECK_VERSION (1, 18, 0)
+	STORE_BIT (is_expandable_space);
+#endif
+
+#undef STORE_BIT
+
+	return newRV_noinc ((SV*) hv);
+}
+
+MODULE = Pango::Layout	PACKAGE = Pango::Layout	PREFIX = pango_layout_
+
+##  PangoLayout *pango_layout_new (PangoContext *context) 
+PangoLayout_noinc *
+pango_layout_new (class, context)
+	PangoContext * context
+    C_ARGS:
+	context
+
+##  PangoLayout *pango_layout_copy (PangoLayout *src) 
+PangoLayout_noinc *
+pango_layout_copy (src)
+	PangoLayout *src
+
+##  PangoContext *pango_layout_get_context (PangoLayout *layout) 
+PangoContext *
+pango_layout_get_context (layout)
+	PangoLayout *layout
+
+##  void pango_layout_set_attributes (PangoLayout *layout, PangoAttrList *attrs) 
+void
+pango_layout_set_attributes (layout, attrs)
+	PangoLayout *layout
+	PangoAttrList *attrs
+
+##  PangoAttrList *pango_layout_get_attributes (PangoLayout *layout) 
+PangoAttrList *
+pango_layout_get_attributes (layout)
+	PangoLayout *layout
+
+##  void pango_layout_set_text (PangoLayout *layout, const char *text, int length) 
+void
+pango_layout_set_text (PangoLayout *layout, const gchar_length *text, int length(text))
+
+##  const char * pango_layout_get_text (PangoLayout *layout);
+const gchar *
+pango_layout_get_text (layout)
+	PangoLayout * layout
+
+##  void pango_layout_set_markup (PangoLayout *layout, const char *markup, int length) 
+void
+pango_layout_set_markup (PangoLayout * layout, const gchar_length * markup, int length(markup))
+
+##  void pango_layout_set_markup_with_accel (PangoLayout *layout, const char *markup, int length, gunichar accel_marker, gunichar *accel_char) 
+void
+pango_layout_set_markup_with_accel (PangoLayout * layout, const char * markup, int length(markup), gunichar accel_marker, OUTLIST gunichar accel_char)
+
+##  void pango_layout_set_font_description (PangoLayout *layout, const PangoFontDescription *desc) 
+void
+pango_layout_set_font_description (layout, desc)
+	PangoLayout *layout
+	PangoFontDescription_ornull *desc
+
+#if PANGO_CHECK_VERSION (1, 8, 0)
+
+const PangoFontDescription_ornull * pango_layout_get_font_description (PangoLayout *layout);
+
+#endif
+
+##  int pango_layout_get_width (PangoLayout *layout) 
+##  int pango_layout_get_indent (PangoLayout *layout) 
+##  int pango_layout_get_spacing (PangoLayout *layout) 
+##  gboolean pango_layout_get_justify (PangoLayout *layout) 
+##  gboolean pango_layout_get_single_paragraph_mode (PangoLayout *layout) 
+int
+pango_layout_get_width (layout)
+	PangoLayout * layout
+    ALIAS:
+	Pango::Layout::get_indent = 1
+	Pango::Layout::get_spacing = 2
+	Pango::Layout::get_justify = 3
+	Pango::Layout::get_single_paragraph_mode = 4
+    CODE:
+	switch (ix) {
+		case 0: RETVAL = pango_layout_get_width (layout); break;
+		case 1: RETVAL = pango_layout_get_indent (layout); break;
+		case 2: RETVAL = pango_layout_get_spacing (layout); break;
+		case 3: RETVAL = pango_layout_get_justify (layout); break;
+		case 4: RETVAL = pango_layout_get_single_paragraph_mode (layout); break;
+		default:
+			RETVAL = 0;
+			g_assert_not_reached ();
+	}
+   OUTPUT:
+	RETVAL
+
+##  void pango_layout_set_width (PangoLayout *layout, int width) 
+##  void pango_layout_set_indent (PangoLayout *layout, int indent) 
+##  void pango_layout_set_spacing (PangoLayout *layout, int spacing) 
+##  void pango_layout_set_justify (PangoLayout *layout, gboolean justify) 
+##  void pango_layout_set_single_paragraph_mode (PangoLayout *layout, gboolean setting) 
+void
+pango_layout_set_width (layout, newval)
+	PangoLayout * layout
+	int newval
+    ALIAS:
+	Pango::Layout::set_indent = 1
+	Pango::Layout::set_spacing = 2
+	Pango::Layout::set_justify = 3
+	Pango::Layout::set_single_paragraph_mode = 4
+    CODE:
+	switch (ix) {
+		case 0: pango_layout_set_width (layout, newval); break;
+		case 1: pango_layout_set_indent (layout, newval); break;
+		case 2: pango_layout_set_spacing (layout, newval); break;
+		case 3: pango_layout_set_justify (layout, newval); break;
+		case 4: pango_layout_set_single_paragraph_mode (layout, newval); break;
+		default:
+			g_assert_not_reached ();
+	}
+
+
+##  void pango_layout_set_wrap (PangoLayout *layout, PangoWrapMode wrap) 
+void
+pango_layout_set_wrap (layout, wrap)
+	PangoLayout *layout
+	PangoWrapMode wrap
+
+##  PangoWrapMode pango_layout_get_wrap (PangoLayout *layout) 
+PangoWrapMode
+pango_layout_get_wrap (layout)
+	PangoLayout *layout
+
+#if PANGO_CHECK_VERSION (1, 6, 0)
+
+##  void pango_layout_set_ellipsize (PangoLayout *layout, PangoEllipsizeMode ellipsize)
+void
+pango_layout_set_ellipsize (layout, ellipsize)
+	PangoLayout *layout
+	PangoEllipsizeMode ellipsize
+
+##  PangoEllipsizeMode pango_layout_get_ellipsize (PangoLayout *layout)
+PangoEllipsizeMode
+pango_layout_get_ellipsize (layout)
+	PangoLayout *layout
+
+#endif
+
+#if PANGO_CHECK_VERSION (1, 4, 0)
+
+##  void pango_layout_set_auto_dir (PangoLayout *layout, gboolean auto_dir)
+void
+pango_layout_set_auto_dir (layout, auto_dir)
+	PangoLayout *layout
+	gboolean auto_dir
+
+##  gboolean pango_layout_get_auto_dir (PangoLayout *layout)
+gboolean
+pango_layout_get_auto_dir (layout)
+	PangoLayout *layout
+
+#endif
+
+##  void pango_layout_set_alignment (PangoLayout *layout, PangoAlignment alignment) 
+void
+pango_layout_set_alignment (layout, alignment)
+	PangoLayout *layout
+	PangoAlignment alignment
+
+##  PangoAlignment pango_layout_get_alignment (PangoLayout *layout) 
+PangoAlignment
+pango_layout_get_alignment (layout)
+	PangoLayout *layout
+
+##  void pango_layout_set_tabs (PangoLayout *layout, PangoTabArray *tabs) 
+void
+pango_layout_set_tabs (layout, tabs)
+	PangoLayout *layout
+	PangoTabArray_ornull *tabs
+
+##  PangoTabArray* pango_layout_get_tabs (PangoLayout *layout) 
+PangoTabArray_own_ornull *
+pango_layout_get_tabs (layout)
+	PangoLayout *layout
+
+
+##  void pango_layout_context_changed (PangoLayout *layout) 
+void
+pango_layout_context_changed (layout)
+	PangoLayout *layout
+
+##  void pango_layout_get_log_attrs (PangoLayout *layout, PangoLogAttr **attrs, gint *n_attrs) 
+=for apidoc
+Returns a list of Pango::LogAttr's
+=cut
+void
+pango_layout_get_log_attrs (layout)
+	PangoLayout * layout
+    PREINIT:
+	PangoLogAttr * attrs = NULL;
+	gint n_attrs;
+    PPCODE:
+	pango_layout_get_log_attrs (layout, &attrs, &n_attrs);
+	if (n_attrs) {
+		int i;
+		EXTEND (SP, n_attrs);
+		for (i = 0 ; i < n_attrs; i++)
+			PUSHs (sv_2mortal (newSVPangoLogAttr (attrs+i)));
+		g_free (attrs);
+	}
+
+##  void pango_layout_index_to_pos (PangoLayout *layout, int index_, PangoRectangle *pos) 
+PangoRectangle *
+pango_layout_index_to_pos (layout, index_) 
+	PangoLayout *layout
+	int index_
+    PREINIT:
+	PangoRectangle pos;
+    CODE:
+	pango_layout_index_to_pos (layout, index_, &pos);
+	RETVAL = &pos;
+    OUTPUT:
+	RETVAL
+
+##  void pango_layout_get_cursor_pos (PangoLayout *layout, int index_, PangoRectangle *strong_pos, PangoRectangle *weak_pos) 
+=for apidoc
+=for signature (strong_pos, weak_pos) = $layout->get_cursor_pos ($index)
+=cut
+void
+pango_layout_get_cursor_pos (layout, index_) 
+	PangoLayout *layout
+	int index_
+    PREINIT:
+	PangoRectangle strong_pos;
+	PangoRectangle weak_pos;
+    PPCODE:
+	pango_layout_get_cursor_pos (layout, index_, &strong_pos, &weak_pos);
+	EXTEND (sp, 2);
+	PUSHs (sv_2mortal (newSVPangoRectangle (&strong_pos)));
+	PUSHs (sv_2mortal (newSVPangoRectangle (&weak_pos)));
+
+##  void pango_layout_move_cursor_visually (PangoLayout *layout, gboolean strong, int old_index, int old_trailing, int direction, int *new_index, int *new_trailing) 
+void pango_layout_move_cursor_visually (PangoLayout *layout, gboolean strong, int old_index, int old_trailing, int direction, OUTLIST int new_index, OUTLIST int new_trailing) 
+
+##  gboolean pango_layout_xy_to_index (PangoLayout *layout, int x, int y, int *index_, int *trailing) 
+=for apidoc
+=for signature (index, trailing) = $layout->xy_to_index ($x, $y)
+=cut
+void
+pango_layout_xy_to_index (layout, x, y)
+	PangoLayout *layout
+	int x
+	int y
+    PREINIT:
+	int index_;
+	int trailing;
+    PPCODE:
+	if (pango_layout_xy_to_index (layout, x, y, &index_, &trailing)) {
+		EXTEND (SP, 2);
+		PUSHs (sv_2mortal (newSViv (index_)));
+		PUSHs (sv_2mortal (newSViv (trailing)));
+	}
+
+##  void pango_layout_get_extents (PangoLayout *layout, PangoRectangle *ink_rect, PangoRectangle *logical_rect) 
+=for apidoc
+=for signature (ink_rect, logical_rect) = $layout->get_extents
+=for signature (ink_rect, logical_rect) = $layout->get_pixel_extents
+=cut
+void
+pango_layout_get_extents (layout) 
+	PangoLayout *layout
+    ALIAS:
+	Pango::Layout::get_pixel_extents = 1
+    PREINIT:
+	PangoRectangle ink_rect;
+	PangoRectangle logical_rect;
+    PPCODE:
+	switch (ix) {
+		case 0:
+			pango_layout_get_extents (layout, &ink_rect, &logical_rect);
+			break;
+		case 1:
+			pango_layout_get_pixel_extents (layout, &ink_rect, &logical_rect);
+			break;
+		default:
+			g_assert_not_reached ();
+	}
+	EXTEND (sp, 2);
+	PUSHs (sv_2mortal (newSVPangoRectangle (&ink_rect)));
+	PUSHs (sv_2mortal (newSVPangoRectangle (&logical_rect)));
+
+##  void pango_layout_get_size (PangoLayout *layout, int *width, int *height) 
+void pango_layout_get_size (PangoLayout *layout, OUTLIST int width, OUTLIST int height) 
+
+##  void pango_layout_get_pixel_size (PangoLayout *layout, int *width, int *height) 
+void pango_layout_get_pixel_size (PangoLayout *layout, OUTLIST int width, OUTLIST int height) 
+
+##  int pango_layout_get_line_count (PangoLayout *layout) 
+int
+pango_layout_get_line_count (layout)
+	PangoLayout *layout
+
+##  PangoLayoutLine *pango_layout_get_line (PangoLayout *layout, int line) 
+PangoLayoutLine_ornull *
+pango_layout_get_line (layout, line)
+	PangoLayout *layout
+	int line
+
+##  GSList * pango_layout_get_lines (PangoLayout *layout) 
+void
+pango_layout_get_lines (layout)
+	PangoLayout *layout
+    PREINIT:
+	GSList * lines, * i;
+    PPCODE:
+	lines = pango_layout_get_lines (layout);
+	for (i = lines ; i != NULL ; i = i->next)
+		XPUSHs (sv_2mortal (newSVPangoLayoutLine (i->data)));
+	/* the list is owned by the layout. */
+
+#if PANGO_CHECK_VERSION (1, 16, 0)
+
+##  PangoLayoutLine *pango_layout_get_line_readonly (PangoLayout *layout, int line) 
+PangoLayoutLine_ornull *
+pango_layout_get_line_readonly (layout, line)
+	PangoLayout *layout
+	int line
+
+##  GSList * pango_layout_get_lines_readonly (PangoLayout *layout) 
+void
+pango_layout_get_lines_readonly (layout)
+	PangoLayout *layout
+    PREINIT:
+	GSList * lines, * i;
+    PPCODE:
+	lines = pango_layout_get_lines_readonly (layout);
+	for (i = lines ; i != NULL ; i = i->next)
+		XPUSHs (sv_2mortal (newSVPangoLayoutLine (i->data)));
+	/* the list is owned by the layout. */
+
+#endif
+
+##  PangoLayoutIter *pango_layout_get_iter (PangoLayout *layout)
+PangoLayoutIter_own *
+pango_layout_get_iter (layout)
+	PangoLayout *layout
+
+#if PANGO_CHECK_VERSION (1, 16, 0)
+
+gboolean pango_layout_is_wrapped (PangoLayout *layout);
+
+gboolean pango_layout_is_ellipsized (PangoLayout *layout);
+
+int pango_layout_get_unknown_glyphs_count (PangoLayout *layout);
+
+#endif
+
+#if PANGO_CHECK_VERSION (1, 20, 0)
+
+void pango_layout_set_height (PangoLayout *layout, int height);
+
+int pango_layout_get_height (PangoLayout *layout);
+
+#endif
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Layout	PACKAGE = Pango::LayoutLine	PREFIX = pango_layout_line_
+
+##  gboolean pango_layout_line_x_to_index (PangoLayoutLine *line, int x_pos, int *index_, int *trailing)
+void
+pango_layout_line_x_to_index (PangoLayoutLine *line, int x_pos)
+    PREINIT:
+	gboolean retval;
+	int index_;
+	int trailing;
+    PPCODE:
+	retval = pango_layout_line_x_to_index (line, x_pos, &index_, &trailing);
+	EXTEND (SP, 3);
+	PUSHs (sv_2mortal (boolSV (retval)));
+	PUSHs (sv_2mortal (newSViv (index_)));
+	PUSHs (sv_2mortal (newSViv (trailing)));
+
+##  void pango_layout_line_index_to_x (PangoLayoutLine *line, int index_, gboolean trailing, int *x_pos)
+void pango_layout_line_index_to_x (PangoLayoutLine *line, int index_, gboolean trailing, OUTLIST int x_pos);
+
+##  void pango_layout_line_get_x_ranges (PangoLayoutLine *line, int start_index, int end_index, int **ranges, int *n_ranges)
+void
+pango_layout_line_get_x_ranges (line, start_index, end_index)
+	PangoLayoutLine *line
+	int start_index
+	int end_index
+    PREINIT:
+	int *ranges;
+	int n_ranges, i;
+    PPCODE:
+	pango_layout_line_get_x_ranges (line, start_index, end_index, &ranges, &n_ranges);
+	EXTEND (SP, n_ranges);
+	for (i = 0; i < 2*n_ranges; i += 2) {
+		AV *av = newAV ();
+		av_push (av, newSViv (ranges[i]));
+		av_push (av, newSViv (ranges[i + 1]));
+		PUSHs (sv_2mortal (newRV_noinc ((SV *) av)));
+	}
+	g_free (ranges);
+
+
+####  void pango_layout_line_get_extents (PangoLayoutLine *line, PangoRectangle *ink_rect, PangoRectangle *logical_rect)
+####  void pango_layout_line_get_pixel_extents (PangoLayoutLine *layout_line, PangoRectangle *ink_rect, PangoRectangle *logical_rect)
+=for apidoc
+=for signature (ink_rect, logical_rect) = $line->get_extents
+=for signature (ink_rect, logical_rect) = $line->get_pixel_extents
+=cut
+void
+pango_layout_line_get_extents (line)
+	PangoLayoutLine *line
+    ALIAS:
+	Pango::LayoutLine::get_pixel_extents = 1
+    PREINIT:
+	PangoRectangle ink_rect;
+	PangoRectangle logical_rect;
+    PPCODE:
+	switch (ix) {
+		case 0:
+			pango_layout_line_get_extents (line, &ink_rect, &logical_rect);
+			break;
+		case 1:
+			pango_layout_line_get_pixel_extents (line, &ink_rect, &logical_rect);
+			break;
+		default:
+			g_assert_not_reached ();
+	}
+	EXTEND (sp, 2);
+	PUSHs (sv_2mortal (newSVPangoRectangle (&ink_rect)));
+	PUSHs (sv_2mortal (newSVPangoRectangle (&logical_rect)));
+
+# --------------------------------------------------------------------------- #
+
+MODULE = Pango::Layout	PACKAGE = Pango::LayoutIter	PREFIX = pango_layout_iter_
+
+##  void pango_layout_iter_free (PangoLayoutIter *iter) 
+
+##  int pango_layout_iter_get_index (PangoLayoutIter *iter) 
+int
+pango_layout_iter_get_index (iter)
+	PangoLayoutIter *iter
+
+# FIXME: no typemap for PangoLayoutRun / PangoGlyphItem.
+# ##  PangoLayoutRun *pango_layout_iter_get_run (PangoLayoutIter *iter) 
+# PangoLayoutRun *
+# pango_layout_iter_get_run (iter)
+# 	PangoLayoutIter *iter
+
+##  PangoLayoutLine *pango_layout_iter_get_line (PangoLayoutIter *iter) 
+PangoLayoutLine *
+pango_layout_iter_get_line (iter)
+	PangoLayoutIter *iter
+
+#if PANGO_CHECK_VERSION (1, 16, 0)
+
+# FIXME: no typemap for PangoLayoutRun / PangoGlyphItem.
+# ##  PangoLayoutRun *pango_layout_iter_get_run_readonly (PangoLayoutIter *iter) 
+# PangoLayoutRun *
+# pango_layout_iter_get_run_readonly (iter)
+# 	PangoLayoutIter *iter
+
+##  PangoLayoutLine *pango_layout_iter_get_line_readonly (PangoLayoutIter *iter) 
+PangoLayoutLine *
+pango_layout_iter_get_line_readonly (iter)
+	PangoLayoutIter *iter
+
+#endif
+
+##  gboolean pango_layout_iter_at_last_line (PangoLayoutIter *iter) 
+gboolean
+pango_layout_iter_at_last_line (iter)
+	PangoLayoutIter *iter
+
+##  gboolean pango_layout_iter_next_char (PangoLayoutIter *iter) 
+gboolean
+pango_layout_iter_next_char (iter)
+	PangoLayoutIter *iter
+
+##  gboolean pango_layout_iter_next_cluster (PangoLayoutIter *iter) 
+gboolean
+pango_layout_iter_next_cluster (iter)
+	PangoLayoutIter *iter
+
+##  gboolean pango_layout_iter_next_run (PangoLayoutIter *iter) 
+gboolean
+pango_layout_iter_next_run (iter)
+	PangoLayoutIter *iter
+
+##  gboolean pango_layout_iter_next_line (PangoLayoutIter *iter) 
+gboolean
+pango_layout_iter_next_line (iter)
+	PangoLayoutIter *iter
+
+##  void pango_layout_iter_get_char_extents (PangoLayoutIter *iter, PangoRectangle *logical_rect) 
+PangoRectangle *
+pango_layout_iter_get_char_extents (iter)
+	PangoLayoutIter *iter
+    PREINIT:
+	PangoRectangle logical_rect;
+    CODE:
+	pango_layout_iter_get_char_extents (iter, &logical_rect);
+	RETVAL = &logical_rect;
+    OUTPUT:
+	RETVAL
+
+##  void pango_layout_iter_get_cluster_extents (PangoLayoutIter *iter, PangoRectangle *ink_rect, PangoRectangle *logical_rect) 
+void
+pango_layout_iter_get_cluster_extents (iter)
+	PangoLayoutIter *iter
+    ALIAS:
+	Pango::LayoutIter::get_run_extents = 1
+	Pango::LayoutIter::get_line_extents = 2
+	Pango::LayoutIter::get_layout_extents = 3
+    PREINIT:
+	PangoRectangle ink_rect;
+	PangoRectangle logical_rect;
+    PPCODE:
+	switch (ix) {
+		case 0:
+			pango_layout_iter_get_cluster_extents (iter, &ink_rect, &logical_rect);
+			break;
+		case 1:
+			pango_layout_iter_get_run_extents (iter, &ink_rect, &logical_rect);
+			break;
+		case 2:
+			pango_layout_iter_get_line_extents (iter, &ink_rect, &logical_rect);
+			break;
+		case 3:
+			pango_layout_iter_get_layout_extents (iter, &ink_rect, &logical_rect);
+			break;
+		default:
+			g_assert_not_reached ();
+	}
+	EXTEND (sp, 2);
+	PUSHs (sv_2mortal (newSVPangoRectangle (&ink_rect)));
+	PUSHs (sv_2mortal (newSVPangoRectangle (&logical_rect)));
+
+##  void pango_layout_iter_get_line_yrange (PangoLayoutIter *iter, int *y0_, int *y1_) 
+void pango_layout_iter_get_line_yrange (PangoLayoutIter *iter, OUTLIST int y0_, OUTLIST int y1_)
+
+##  int pango_layout_iter_get_baseline (PangoLayoutIter *iter) 
+int
+pango_layout_iter_get_baseline (iter)
+	PangoLayoutIter *iter
+
+#if PANGO_CHECK_VERSION (1, 20, 0)
+
+PangoLayout * pango_layout_iter_get_layout (PangoLayoutIter *iter);
+
+#endif

Added: trunk/xs/PangoMatrix.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoMatrix.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2007 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
+ * Boston, MA  02111-1307  USA.
+ *
+ * $Id: PangoMatrix.xs,v 1.3 2007/07/22 21:14:29 kaffeetisch Exp $
+ */
+
+#include "pango-perl.h"
+
+MODULE = Pango::Matrix	PACKAGE = Pango::Matrix	PREFIX = pango_matrix_
+
+double
+xx (matrix, new = 0)
+	PangoMatrix *matrix
+	double new
+    ALIAS:
+	Pango::Matrix::xy = 1
+	Pango::Matrix::yx = 2
+	Pango::Matrix::yy = 3
+	Pango::Matrix::x0 = 4
+	Pango::Matrix::y0 = 5
+    CODE:
+	RETVAL = 0.0;
+
+	switch (ix) {
+		case 0: RETVAL = matrix->xx; break;
+		case 1: RETVAL = matrix->xy; break;
+		case 2: RETVAL = matrix->yx; break;
+		case 3: RETVAL = matrix->yy; break;
+		case 4: RETVAL = matrix->x0; break;
+		case 5: RETVAL = matrix->y0; break;
+		default: g_assert_not_reached ();
+	}
+
+	if (items == 2) {
+		switch (ix) {
+			case 0: matrix->xx = new; break;
+			case 1: matrix->xy = new; break;
+			case 2: matrix->yx = new; break;
+			case 3: matrix->yy = new; break;
+			case 4: matrix->x0 = new; break;
+			case 5: matrix->y0 = new; break;
+			default: g_assert_not_reached ();
+		}
+	}
+    OUTPUT:
+	RETVAL
+
+PangoMatrix_own *
+pango_matrix_new (class, xx = 1., xy = 0., yx = 0., yy = 1., x0 = 0., y0 = 0.)
+	double xx
+	double xy
+	double yx
+	double yy
+	double x0
+	double y0
+    CODE:
+#if PANGO_CHECK_VERSION (1, 12, 0)
+	RETVAL = g_slice_new0 (PangoMatrix);
+#else
+	RETVAL = g_new0 (PangoMatrix, 1);
+#endif
+	RETVAL->xx = xx;
+	RETVAL->xy = xy;
+	RETVAL->yx = yx;
+	RETVAL->yy = yy;
+	RETVAL->x0 = x0;
+	RETVAL->y0 = y0;
+    OUTPUT:
+	RETVAL
+
+##  void pango_matrix_translate (PangoMatrix *matrix, double tx, double ty)
+void
+pango_matrix_translate (matrix, tx, ty)
+	PangoMatrix *matrix
+	double tx
+	double ty
+
+##  void pango_matrix_scale (PangoMatrix *matrix, double scale_x, double scale_y)
+void
+pango_matrix_scale (matrix, scale_x, scale_y)
+	PangoMatrix *matrix
+	double scale_x
+	double scale_y
+
+##  void pango_matrix_rotate (PangoMatrix *matrix, double degrees)
+void
+pango_matrix_rotate (matrix, degrees)
+	PangoMatrix *matrix
+	double degrees
+
+##  void pango_matrix_concat (PangoMatrix *matrix, PangoMatrix *new_matrix)
+void
+pango_matrix_concat (matrix, new_matrix)
+	PangoMatrix *matrix
+	PangoMatrix *new_matrix
+
+#if PANGO_CHECK_VERSION (1, 16, 0)
+
+void pango_matrix_transform_distance (const PangoMatrix *matrix, IN_OUTLIST double dx, IN_OUTLIST double dy);
+
+void pango_matrix_transform_point (const PangoMatrix *matrix, IN_OUTLIST double x, IN_OUTLIST double y);
+
+# void pango_matrix_transform_rectangle (const PangoMatrix *matrix, PangoRectangle *rect)
+PangoRectangle *
+pango_matrix_transform_rectangle (const PangoMatrix *matrix, PangoRectangle *rect)
+    ALIAS:
+	transform_pixel_rectangle = 1
+    CODE:
+	switch (ix) {
+		case 0: pango_matrix_transform_rectangle (matrix, rect); break;
+		case 1: pango_matrix_transform_pixel_rectangle (matrix, rect); break;
+		default: g_assert_not_reached ();
+	}
+	RETVAL = rect;
+    OUTPUT:
+	RETVAL
+
+#endif

Added: trunk/xs/PangoRenderer.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoRenderer.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2004 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
+ * Boston, MA  02111-1307  USA.
+ *
+ * $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/PangoRenderer.xs,v 1.5 2008/03/10 20:54:37 kaffeetisch Exp $
+ */
+
+#include "pango-perl.h"
+
+MODULE = Pango::Renderer	PACKAGE = Pango::Renderer	PREFIX = pango_renderer_
+
+BOOT:
+	PERL_UNUSED_VAR (file);
+
+#if PANGO_CHECK_VERSION (1, 8, 0)
+
+void pango_renderer_draw_layout (PangoRenderer *renderer, PangoLayout *layout, int x, int y);
+
+void pango_renderer_draw_layout_line (PangoRenderer *renderer, PangoLayoutLine *line, int x, int y);
+
+# FIXME: We do have typemaps for PangoGlyphString, but no way to actually get
+#        one.  pango_shape() would be about the only function that returns one,
+#        AFAICT.
+# void pango_renderer_draw_glyphs (PangoRenderer *renderer, PangoFont *font, PangoGlyphString *glyphs, int x, int y);
+
+void pango_renderer_draw_rectangle (PangoRenderer *renderer, PangoRenderPart part, int x, int y, int width, int height);
+
+void pango_renderer_draw_error_underline (PangoRenderer *renderer, int x, int y, int width, int height);
+
+void pango_renderer_draw_trapezoid (PangoRenderer *renderer, PangoRenderPart part, double y1_, double x11, double x21, double y2, double x12, double x22);
+
+void pango_renderer_draw_glyph (PangoRenderer *renderer, PangoFont *font, PangoGlyph glyph, double x, double y);
+
+void pango_renderer_activate (PangoRenderer *renderer);
+
+void pango_renderer_deactivate (PangoRenderer *renderer);
+
+void pango_renderer_part_changed (PangoRenderer *renderer, PangoRenderPart part);
+
+void pango_renderer_set_color (PangoRenderer *renderer, PangoRenderPart part, const PangoColor_ornull *color);
+
+PangoColor_ornull *pango_renderer_get_color (PangoRenderer *renderer, PangoRenderPart part);
+
+void pango_renderer_set_matrix (PangoRenderer *renderer, const PangoMatrix_ornull *matrix);
+
+const PangoMatrix_ornull *pango_renderer_get_matrix (PangoRenderer *renderer);
+
+#endif /* 1.8.0 */
+
+#if PANGO_CHECK_VERSION (1, 20, 0)
+
+PangoLayout * pango_renderer_get_layout (PangoRenderer *renderer);
+
+PangoLayoutLine * pango_renderer_get_layout_line (PangoRenderer *renderer);
+
+#endif

Added: trunk/xs/PangoScript.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoScript.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2004 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
+ * Boston, MA  02111-1307  USA.
+ *
+ * $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/PangoScript.xs,v 1.3 2005/07/11 22:39:21 kaffeetisch Exp $
+ */
+
+#include "pango-perl.h"
+
+/* ------------------------------------------------------------------------- */
+
+#if PANGO_CHECK_VERSION (1, 4, 0)
+
+static gpointer
+gtk2perl_pango_script_iter_copy (gpointer boxed)
+{
+	croak ("Can't copy a PangoScriptIter");
+	return boxed;
+}
+
+GType
+gtk2perl_pango_script_iter_get_type (void)
+{
+	static GType t = 0;
+	if (!t)
+		t = g_boxed_type_register_static ("PangoScriptIter",
+		      (GBoxedCopyFunc) gtk2perl_pango_script_iter_copy,
+		      (GBoxedFreeFunc) pango_script_iter_free);
+	return t;
+}
+
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+MODULE = Pango::Script	PACKAGE = Pango::Script	PREFIX = pango_script_
+
+BOOT:
+	PERL_UNUSED_VAR (file);
+
+#if PANGO_CHECK_VERSION (1, 4, 0)
+
+##  PangoScript pango_script_for_unichar (gunichar ch)
+PangoScript
+pango_script_for_unichar (class, ch)
+	gunichar ch
+    C_ARGS:
+	ch
+
+##  PangoLanguage * pango_script_get_sample_language (PangoScript script)
+PangoLanguage_ornull *
+pango_script_get_sample_language (class, script)
+	PangoScript script
+    C_ARGS:
+	script
+
+MODULE = Pango::Script	PACKAGE = Pango::ScriptIter	PREFIX = pango_script_iter_
+
+##  Using gchar instead of char here all over the place to enforce utf8.
+
+##  PangoScriptIter * pango_script_iter_new (const char *text, int length)
+PangoScriptIter *
+pango_script_iter_new (class, text)
+	const gchar *text
+    CODE:
+	RETVAL = pango_script_iter_new (text, strlen (text));
+    OUTPUT:
+	RETVAL
+
+=for apidoc
+
+Returns the bounds and the script for the region pointed to by I<$iter>.
+
+=cut
+##  void pango_script_iter_get_range (PangoScriptIter *iter, G_CONST_RETURN char **start, G_CONST_RETURN char **end, PangoScript *script)
+void
+pango_script_iter_get_range (iter)
+	PangoScriptIter *iter
+    PREINIT:
+	gchar *start = NULL;
+	gchar *end = NULL;
+	PangoScript script;
+    PPCODE:
+	pango_script_iter_get_range (iter,
+	                             (const char **) &start,
+	                             (const char **) &end,
+	                             &script);
+	EXTEND (sp, 3);
+	PUSHs (sv_2mortal (newSVGChar (start)));
+	PUSHs (sv_2mortal (newSVGChar (end)));
+	PUSHs (sv_2mortal (newSVPangoScript (script)));
+
+##  gboolean pango_script_iter_next (PangoScriptIter *iter)
+gboolean
+pango_script_iter_next (iter)
+	PangoScriptIter *iter
+
+##  void pango_script_iter_free (PangoScriptIter *iter)
+
+MODULE = Pango::Script	PACKAGE = Pango::Language	PREFIX = pango_language_
+
+##  gboolean pango_language_includes_script (PangoLanguage *language, PangoScript script)
+gboolean
+pango_language_includes_script (language, script)
+	PangoLanguage *language
+	PangoScript script
+
+#endif /* 1.4.0 */

Added: trunk/xs/PangoTabs.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoTabs.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2003 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * Licensed under the LGPL, see LICENSE file for more information.
+ *
+ * $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/PangoTabs.xs,v 1.11 2007/12/16 18:31:16 kaffeetisch Exp $
+ */
+#include "pango-perl.h"
+
+MODULE = Pango::TabArray	PACKAGE = Pango::TabArray	PREFIX = pango_tab_array_
+
+##  PangoTabArray *pango_tab_array_new (gint initial_size, gboolean positions_in_pixels) 
+###  PangoTabArray *pango_tab_array_new_with_positions (gint size, gboolean positions_in_pixels, PangoTabAlign first_alignment, gint first_position, ...) 
+
+=for apidoc Pango::TabArray::new
+=for arg ... pairs of Pango::TabAlign's and integers, the alignments and positions of the tab stops.
+=cut
+
+=for apidoc new_with_positions
+=for arg ... pairs of Pango::TabAlign's and integers, the alignments and positions of the tab stops.
+Alias for L<new|tabarray = Pango::TabArray-E<gt>new ($initial_size, $positions_in_pixels, ...)>.
+=cut
+
+PangoTabArray_own *
+pango_tab_array_new (class, initial_size, positions_in_pixels, ...)
+	gint initial_size
+	gboolean positions_in_pixels
+    ALIAS:
+	new_with_positions = 1
+    CODE:
+	PERL_UNUSED_VAR (ix);
+	RETVAL = pango_tab_array_new (initial_size, positions_in_pixels);
+	if (items > 3) {
+		int i;
+		for (i = 3 ; i < items ; i += 2) {
+			pango_tab_array_set_tab (RETVAL, (i - 3) / 2,
+			                         SvPangoTabAlign (ST (i)),
+						 SvIV (ST (i+1)));
+		}
+	}
+    OUTPUT:
+	RETVAL
+
+
+ ## see Glib::Boxed
+##  PangoTabArray *pango_tab_array_copy (PangoTabArray *src) 
+##  void pango_tab_array_free (PangoTabArray *tab_array) 
+
+##  gint pango_tab_array_get_size (PangoTabArray *tab_array) 
+gint
+pango_tab_array_get_size (tab_array)
+	PangoTabArray *tab_array
+
+##  void pango_tab_array_resize (PangoTabArray *tab_array, gint new_size) 
+void
+pango_tab_array_resize (tab_array, new_size)
+	PangoTabArray *tab_array
+	gint new_size
+
+##  void pango_tab_array_set_tab (PangoTabArray *tab_array, gint tab_index, PangoTabAlign alignment, gint location) 
+void
+pango_tab_array_set_tab (tab_array, tab_index, alignment, location)
+	PangoTabArray *tab_array
+	gint tab_index
+	PangoTabAlign alignment
+	gint location
+
+##  void pango_tab_array_get_tab (PangoTabArray *tab_array, gint tab_index, PangoTabAlign *alignment, gint *location) 
+void
+pango_tab_array_get_tab (PangoTabArray *tab_array, gint tab_index) 
+    PREINIT:
+	PangoTabAlign alignment;
+	gint location;
+    PPCODE:
+	pango_tab_array_get_tab (tab_array, tab_index, &alignment, &location);
+	EXTEND (SP, 2);
+	PUSHs (sv_2mortal (newSVPangoTabAlign (alignment)));
+	PUSHs (sv_2mortal (newSViv (location)));
+
+##  void pango_tab_array_get_tabs (PangoTabArray *tab_array, PangoTabAlign **alignments, gint **locations) 
+=for apidoc
+Returns a list of Pango::TabAlign's, alignments, and integers, locations. 
+Even elemtents are alignments and odd elements are locations, so 0 is the first
+alignment and 1 is the first location, 2 the second alignment, 3 the second 
+location, etc.
+=cut
+void
+pango_tab_array_get_tabs (tab_array)
+	PangoTabArray *tab_array
+    PREINIT:
+	PangoTabAlign *alignments = NULL;
+	gint *locations = NULL, i, n;
+    PPCODE:
+	pango_tab_array_get_tabs (tab_array, &alignments, &locations);
+	n = pango_tab_array_get_size (tab_array);
+	EXTEND (SP, 2 * n);
+	for (i = 0 ; i < n ; i++) {
+		PUSHs (sv_2mortal (newSVPangoTabAlign (alignments[i])));
+		PUSHs (sv_2mortal (newSViv (locations[i])));
+	}
+	g_free (alignments);
+	g_free (locations);
+
+##  gboolean pango_tab_array_get_positions_in_pixels (PangoTabArray *tab_array) 
+gboolean
+pango_tab_array_get_positions_in_pixels (tab_array)
+	PangoTabArray *tab_array
+

Added: trunk/xs/PangoTypes.xs
==============================================================================
--- (empty file)
+++ trunk/xs/PangoTypes.xs	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2004 by the gtk2-perl team (see the file AUTHORS)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
+ * Boston, MA  02111-1307  USA.
+ *
+ * $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/xs/PangoTypes.xs,v 1.11 2008/02/09 20:13:18 kaffeetisch Exp $
+ */
+
+#include "pango-perl.h"
+
+MODULE = Pango::Types	PACKAGE = Pango	PREFIX = pango_
+
+#if PANGO_CHECK_VERSION (1, 4, 0)
+
+=for object Pango::Language
+=cut
+
+##  PangoDirection pango_find_base_dir (const gchar *text, gint length)
+PangoDirection
+pango_find_base_dir (class, text)
+	const gchar *text
+    C_ARGS:
+	text, strlen (text)
+
+#endif
+
+#if PANGO_CHECK_VERSION (1, 16, 0)
+
+=for object Pango::Font
+=cut
+
+=for apidoc __function__
+=cut
+int pango_units_from_double (double d);
+
+=for apidoc __function__
+=cut
+double pango_units_to_double (int i);
+
+=for apidoc __function__
+=cut
+##  void pango_extents_to_pixels (PangoRectangle *inclusive, PangoRectangle *nearest)
+void
+pango_extents_to_pixels (PangoRectangle *inclusive, PangoRectangle *nearest)
+    PPCODE:
+	pango_extents_to_pixels (inclusive, nearest);
+	EXTEND (SP, 2);
+	PUSHs (sv_2mortal (newSVPangoRectangle (inclusive)));
+	PUSHs (sv_2mortal (newSVPangoRectangle (nearest)));
+
+#endif
+
+MODULE = Pango::Types	PACKAGE = Pango::Language	PREFIX = pango_language_
+
+##  PangoLanguage * pango_language_from_string (const char *language)
+PangoLanguage *
+pango_language_from_string (class, language)
+	const char *language
+    CODE:
+	RETVAL = pango_language_from_string (language);
+    OUTPUT:
+	RETVAL
+
+##  const char * pango_language_to_string (PangoLanguage *language)
+const char *
+pango_language_to_string (language)
+	PangoLanguage *language
+
+# FIXME: WTF is the Gnome2::Pango::Language::matches alias doing here?  It's
+# totally bogus, but has been in a stable release already ...
+##  gboolean pango_language_matches (PangoLanguage *language, const char *range_list)
+gboolean
+pango_language_matches (language, range_list)
+	PangoLanguage *language
+	const char *range_list
+    ALIAS:
+	Gnome2::Pango::Language::matches = 0
+    CLEANUP:
+	PERL_UNUSED_VAR (ix);
+
+#if PANGO_CHECK_VERSION (1, 16, 0)
+
+##  PangoLanguage * pango_language_get_default (void)
+PangoLanguage *
+pango_language_get_default (class)
+    C_ARGS:
+	/* void */
+
+#endif

Added: trunk/xs_files-1.0
==============================================================================
--- (empty file)
+++ trunk/xs_files-1.0	Sun Nov  2 12:33:26 2008
@@ -0,0 +1,11 @@
+xs/Pango.xs
+xs/PangoAttributes.xs
+xs/PangoContext.xs
+xs/PangoFont.xs
+xs/PangoFontset.xs
+xs/PangoFontMap.xs
+xs/PangoLayout.xs
+xs/PangoRenderer.xs
+xs/PangoScript.xs
+xs/PangoTabs.xs
+xs/PangoTypes.xs

Added: trunk/xs_files-1.10
==============================================================================
--- (empty file)
+++ trunk/xs_files-1.10	Sun Nov  2 12:33:26 2008
@@ -0,0 +1 @@
+xs/PangoCairo.xs

Added: trunk/xs_files-1.16
==============================================================================
--- (empty file)
+++ trunk/xs_files-1.16	Sun Nov  2 12:33:26 2008
@@ -0,0 +1 @@
+xs/PangoGravity.xs

Added: trunk/xs_files-1.6
==============================================================================
--- (empty file)
+++ trunk/xs_files-1.6	Sun Nov  2 12:33:26 2008
@@ -0,0 +1 @@
+xs/PangoMatrix.xs



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]