This package was Debianized by Christoph Lameter <clameter@waterf.org> on
Thu, 7 Nov 1996 11:51:45 -0800.  It was then picked up by
Anthony Fok <foka@debian.org> on Mon, 11 Aug 1997 08:10:02 -0600

It was downloaded from
    ftp://ftp.freetype.org/pub/freetype2/
	freetype-2.0.4.tar.bz2
	ft2demos-2.0.4.tar.bz2
	ftdocs-2.0.4.tar.bz2

Home Page:
    http://www.freetype.org/

Upstream Authors:

    The FreeType Project
        David Turner    <david.turner@freetype.org>
        Robert Wilhelm  <robert.wilhelm@freetype.org>
        Werner Lemberg  <werner.lemberg@freetype.org>

    The FreeType 2 auto-hinter
	Designed and implemented by David Turner under contract
	for Catharon Productions, Inc.  http://www.catharon.com/

Copyright:

FreeType comes with two licenses from which you can choose the one which
fits your needs best:

  . The FreeType License, in file `FTL.txt'.

  . The GNU General Public License, in file `/usr/share/common-licenses/GPL'.

The FreeType 2 auto-hinter was initially designed and implemented under
contract for Catharon Productions, Inc. which gladly accepted to release
it under an open-source license compatible with the FreeType one:

  . The Catharon Open Source License, in file 'CatharonLicense.txt'.

The FreeType License and the Catharon Open Source License are listed below:


                    The FreeType Project LICENSE
                    ----------------------------

                            2000-Feb-08

                       Copyright 1996-2000 by
          David Turner, Robert Wilhelm, and Werner Lemberg



Introduction
============

  The FreeType  Project is distributed in  several archive packages;
  some of them may contain, in addition to the FreeType font engine,
  various tools and  contributions which rely on, or  relate to, the
  FreeType Project.

  This  license applies  to all  files found  in such  packages, and
  which do not  fall under their own explicit  license.  The license
  affects  thus  the  FreeType   font  engine,  the  test  programs,
  documentation and makefiles, at the very least.

  This  license   was  inspired  by  the  BSD,   Artistic,  and  IJG
  (Independent JPEG  Group) licenses, which  all encourage inclusion
  and  use of  free  software in  commercial  and freeware  products
  alike.  As a consequence, its main points are that:

    o We don't promise that this software works. However, we will be
      interested in any kind of bug reports. (`as is' distribution)

    o You can  use this software for whatever you  want, in parts or
      full form, without having to pay us. (`royalty-free' usage)

    o You may not pretend that  you wrote this software.  If you use
      it, or  only parts of it,  in a program,  you must acknowledge
      somewhere  in  your  documentation  that  you  have  used  the
      FreeType code. (`credits')

  We  specifically  permit  and  encourage  the  inclusion  of  this
  software, with  or without modifications,  in commercial products.
  We  disclaim  all warranties  covering  The  FreeType Project  and
  assume no liability related to The FreeType Project.


Legal Terms
===========

0. Definitions
--------------

  Throughout this license,  the terms `package', `FreeType Project',
  and  `FreeType  archive' refer  to  the  set  of files  originally
  distributed  by the  authors  (David Turner,  Robert Wilhelm,  and
  Werner Lemberg) as the `FreeType Project', be they named as alpha,
  beta or final release.

  `You' refers to  the licensee, or person using  the project, where
  `using' is a generic term including compiling the project's source
  code as  well as linking it  to form a  `program' or `executable'.
  This  program is  referred to  as  `a program  using the  FreeType
  engine'.

  This  license applies  to all  files distributed  in  the original
  FreeType  Project,   including  all  source   code,  binaries  and
  documentation,  unless  otherwise  stated   in  the  file  in  its
  original, unmodified form as  distributed in the original archive.
  If you are  unsure whether or not a particular  file is covered by
  this license, you must contact us to verify this.

  The FreeType  Project is copyright (C) 1996-2000  by David Turner,
  Robert Wilhelm, and Werner Lemberg.  All rights reserved except as
  specified below.

1. No Warranty
--------------

  THE FREETYPE PROJECT  IS PROVIDED `AS IS' WITHOUT  WARRANTY OF ANY
  KIND, EITHER  EXPRESS OR IMPLIED,  INCLUDING, BUT NOT  LIMITED TO,
  WARRANTIES  OF  MERCHANTABILITY   AND  FITNESS  FOR  A  PARTICULAR
  PURPOSE.  IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS
  BE LIABLE  FOR ANY DAMAGES CAUSED  BY THE USE OR  THE INABILITY TO
  USE, OF THE FREETYPE PROJECT.

2. Redistribution
-----------------

  This  license  grants  a  worldwide, royalty-free,  perpetual  and
  irrevocable right  and license to use,  execute, perform, compile,
  display,  copy,   create  derivative  works   of,  distribute  and
  sublicense the  FreeType Project (in  both source and  object code
  forms)  and  derivative works  thereof  for  any  purpose; and  to
  authorize others  to exercise  some or all  of the  rights granted
  herein, subject to the following conditions:

    o Redistribution  of source code  must retain this  license file
      (`LICENSE.TXT') unaltered; any additions, deletions or changes
      to   the  original   files  must   be  clearly   indicated  in
      accompanying  documentation.   The  copyright notices  of  the
      unaltered, original  files must be preserved in  all copies of
      source files.

    o Redistribution in binary form must provide a  disclaimer  that
      states  that  the software is based in part of the work of the
      FreeType Team,  in  the  distribution  documentation.  We also
      encourage you to put an URL to the FreeType web page  in  your
      documentation, though this isn't mandatory.

  These conditions  apply to any  software derived from or  based on
  the FreeType Project,  not just the unmodified files.   If you use
  our work, you  must acknowledge us.  However, no  fee need be paid
  to us.

3. Advertising
--------------

  Neither the  FreeType authors and  contributors nor you  shall use
  the name of the  other for commercial, advertising, or promotional
  purposes without specific prior written permission.

  We suggest,  but do not require, that  you use one or  more of the
  following phrases to refer  to this software in your documentation
  or advertising  materials: `FreeType Project',  `FreeType Engine',
  `FreeType library', or `FreeType Distribution'.

  As  you have  not signed  this license,  you are  not  required to
  accept  it.   However,  as  the FreeType  Project  is  copyrighted
  material, only  this license, or  another one contracted  with the
  authors, grants you  the right to use, distribute,  and modify it.
  Therefore,  by  using,  distributing,  or modifying  the  FreeType
  Project, you indicate that you understand and accept all the terms
  of this license.

4. Contacts
-----------

  There are two mailing lists related to FreeType:

    o freetype@freetype.org

      Discusses general use and applications of FreeType, as well as
      future and  wanted additions to the  library and distribution.
      If  you are looking  for support,  start in  this list  if you
      haven't found anything to help you in the documentation.

    o devel@freetype.org

      Discusses bugs,  as well  as engine internals,  design issues,
      specific licenses, porting, etc.

    o http://www.freetype.org

      Holds the current  FreeType web page, which will  allow you to
      download  our  latest  development  version  and  read  online
      documentation.

  You can also contact us individually at:

    David Turner      <david.turner@freetype.org>
    Robert Wilhelm    <robert.wilhelm@freetype.org>
    Werner Lemberg    <werner.lemberg@freetype.org>


--- end of LICENSE.TXT ---


                  The Catharon Open Source LICENSE
                    ----------------------------

                            2000-Jul-04

          Copyright (C) 2000 by Catharon Productions, Inc.



Introduction
============

  This  license  applies to  source  files  distributed by  Catharon
  Productions,  Inc.  in  several  archive packages.   This  license
  applies  to all files  found in  such packages  which do  not fall
  under their own explicit license.

  This  license   was  inspired  by  the  BSD,   Artistic,  and  IJG
  (Independent JPEG  Group) licenses, which  all encourage inclusion
  and  use of  free  software in  commercial  and freeware  products
  alike.  As a consequence, its main points are that:

    o We  don't promise that  this software works.  However,  we are
      interested in any kind of bug reports. (`as is' distribution)

    o You can  use this software for whatever you  want, in parts or
      full form, without having to pay us. (`royalty-free' usage)

    o You may not pretend that  you wrote this software.  If you use
      it, or  only parts of it,  in a program,  you must acknowledge
      somewhere  in  your  documentation  that  you  have  used  the
      Catharon Code. (`credits')

  We  specifically  permit  and  encourage  the  inclusion  of  this
  software, with  or without modifications,  in commercial products.
  We disclaim  all warranties  covering the packages  distributed by
  Catharon  Productions, Inc.  and  assume no  liability related  to
  their use.


Legal Terms
===========

0. Definitions
--------------

  Throughout this license,  the terms `Catharon Package', `package',
  and  `Catharon  Code'  refer   to  the  set  of  files  originally
  distributed by Catharon Productions, Inc.

  `You' refers to  the licensee, or person using  the project, where
  `using' is a generic term including compiling the project's source
  code as  well as linking it  to form a  `program' or `executable'.
  This  program  is referred  to  as `a  program  using  one of  the
  Catharon Packages'.

  This  license applies  to all  files distributed  in  the original
  Catharon  Package(s),  including  all  source code,  binaries  and
  documentation,  unless  otherwise  stated   in  the  file  in  its
  original, unmodified form as  distributed in the original archive.
  If you are  unsure whether or not a particular  file is covered by
  this license, you must contact us to verify this.

  The  Catharon   Packages  are  copyright  (C)   2000  by  Catharon
  Productions, Inc.  All rights reserved except as specified below.

1. No Warranty
--------------

  THE CATHARON PACKAGES ARE PROVIDED `AS IS' WITHOUT WARRANTY OF ANY
  KIND, EITHER  EXPRESS OR IMPLIED,  INCLUDING, BUT NOT  LIMITED TO,
  WARRANTIES  OF  MERCHANTABILITY   AND  FITNESS  FOR  A  PARTICULAR
  PURPOSE.  IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS
  BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OF OR THE INABILITY TO
  USE THE CATHARON PACKAGE.

2. Redistribution
-----------------

  This  license  grants  a  worldwide, royalty-free,  perpetual  and
  irrevocable right  and license to use,  execute, perform, compile,
  display,  copy,   create  derivative  works   of,  distribute  and
  sublicense the  Catharon Packages (in both source  and object code
  forms)  and  derivative works  thereof  for  any  purpose; and  to
  authorize others  to exercise  some or all  of the  rights granted
  herein, subject to the following conditions:

    o Redistribution  of source code  must retain this  license file
      (`license.txt') unaltered; any additions, deletions or changes
      to   the  original   files  must   be  clearly   indicated  in
      accompanying  documentation.   The  copyright notices  of  the
      unaltered, original  files must be preserved in  all copies of
      source files.

    o Redistribution  in binary form must provide  a disclaimer that
      states  that the  software is  based in  part on  the  work of
      Catharon Productions, Inc. in the distribution documentation.

  These conditions  apply to any  software derived from or  based on
  the Catharon Packages, not just  the unmodified files.  If you use
  our work, you  must acknowledge us.  However, no  fee need be paid
  to us.

3. Advertising
--------------

  Neither Catharon Productions, Inc.  and contributors nor you shall
  use  the  name  of  the  other  for  commercial,  advertising,  or
  promotional purposes without specific prior written permission.

  We suggest, but do not  require, that you use the following phrase
  to refer to this software in your documentation: 'this software is
  based in part on the Catharon Typography Project'.

  As  you have  not signed  this license,  you are  not  required to
  accept  it.  However,  as  the Catharon  Packages are  copyrighted
  material, only  this license, or  another one contracted  with the
  authors, grants you  the right to use, distribute,  and modify it.
  Therefore,  by  using,  distributing,  or modifying  the  Catharon
  Packages,  you indicate  that you  understand and  accept  all the
  terms of this license.

--- end of license.txt ---
