(***************************************************************************)
(* *)
(* ftoutln.h *)
(* *)
(* Support for the FT_Outline type used to store glyph shapes of *)
(* most scalable font formats (specification). *)
(* *)
(* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007 by *)
(* David Turner, Robert Wilhelm, and Werner Lemberg. *)
(* *)
(* This file is part of the FreeType project, and may only be used, *)
(* modified, and distributed under the terms of the FreeType project *)
(* license, LICENSE.TXT. By continuing to use, modify, or distribute *)
(* this file you indicate that you have read the license and *)
(* understand and accept it fully. *)
(* *)
(***************************************************************************)
(***************************************************************************)
(* Pascal port by the UltraStar Deluxe Team *)
(***************************************************************************)
(*************************************************************************)
(* *)
(* <Section> *)
(* outline_processing *)
(* *)
(* <Title> *)
(* Outline Processing *)
(* *)
(* <Abstract> *)
(* Functions to create, transform, and render vectorial glyph images. *)
(* *)
(* <Description> *)
(* This section contains routines used to create and destroy scalable *)
(* glyph images known as `outlines'. These can also be measured, *)
(* transformed, and converted into bitmaps and pixmaps. *)
(* *)
(* <Order> *)
(* FT_Outline *)
(* FT_OUTLINE_FLAGS *)
(* FT_Outline_New *)
(* FT_Outline_Done *)
(* FT_Outline_Copy *)
(* FT_Outline_Translate *)
(* FT_Outline_Transform *)
(* FT_Outline_Embolden *)
(* FT_Outline_Reverse *)
(* FT_Outline_Check *)
(* *)
(* FT_Outline_Get_CBox *)
(* FT_Outline_Get_BBox *)
(* *)
(* FT_Outline_Get_Bitmap *)
(* FT_Outline_Render *)
(* *)
(* FT_Outline_Decompose *)
(* FT_Outline_Funcs *)
(* FT_Outline_MoveTo_Func *)
(* FT_Outline_LineTo_Func *)
(* FT_Outline_ConicTo_Func *)
(* FT_Outline_CubicTo_Func *)
(* *)
(*************************************************************************)
{$IFNDEF TYPE_DECL}
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_Decompose *)
(* *)
(* <Description> *)
(* Walks over an outline's structure to decompose it into individual *)
(* segments and Bézier arcs. This function is also able to emit *)
(* `move to' and `close to' operations to indicate the start and end *)
(* of new contours in the outline. *)
(* *)
(* <Input> *)
(* outline :: A pointer to the source target. *)
(* *)
(* func_interface :: A table of `emitters', i.e,. function pointers *)
(* called during decomposition to indicate path *)
(* operations. *)
(* *)
(* <InOut> *)
(* user :: A typeless pointer which is passed to each *)
(* emitter during the decomposition. It can be *)
(* used to store the state during the *)
(* decomposition. *)
(* *)
(* <Return> *)
(* FreeType error code. 0 means success. *)
(* *)
function FT_Outline_Decompose(
outline: PFT_Outline;
func_interface: {const} PFT_Outline_Funcs;
user: Pointer): FT_Error;
cdecl; external ft_lib name 'FT_Outline_Decompose';
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_New *)
(* *)
(* <Description> *)
(* Creates a new outline of a given size. *)
(* *)
(* <Input> *)
(* library :: A handle to the library object from where the *)
(* outline is allocated. Note however that the new *)
(* outline will *not* necessarily be *freed*, when *)
(* destroying the library, by @FT_Done_FreeType. *)
(* *)
(* numPoints :: The maximal number of points within the outline. *)
(* *)
(* numContours :: The maximal number of contours within the outline. *)
(* *)
(* <Output> *)
(* anoutline :: A handle to the new outline. NULL in case of *)
(* error. *)
(* *)
(* <Return> *)
(* FreeType error code. 0 means success. *)
(* *)
(* <Note> *)
(* The reason why this function takes a `library' parameter is simply *)
(* to use the library's memory allocator. *)
(* *)
function FT_Outline_New(
library_: FT_Library;
numPoints: FT_UInt;
numContours: FT_Int;
anoutline: PFT_Outline): FT_Error;
cdecl; external ft_lib name 'FT_Outline_New';
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_Done *)
(* *)
(* <Description> *)
(* Destroys an outline created with @FT_Outline_New. *)
(* *)
(* <Input> *)
(* library :: A handle of the library object used to allocate the *)
(* outline. *)
(* *)
(* outline :: A pointer to the outline object to be discarded. *)
(* *)
(* <Return> *)
(* FreeType error code. 0 means success. *)
(* *)
(* <Note> *)
(* If the outline's `owner' field is not set, only the outline *)
(* descriptor will be released. *)
(* *)
(* The reason why this function takes an `library' parameter is *)
(* simply to use ft_mem_free(). *)
(* *)
function FT_Outline_Done(library_: FT_Library;
outline: PFT_Outline): FT_Error;
cdecl; external ft_lib name 'FT_Outline_Done';
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_Check *)
(* *)
(* <Description> *)
(* Check the contents of an outline descriptor. *)
(* *)
(* <Input> *)
(* outline :: A handle to a source outline. *)
(* *)
(* <Return> *)
(* FreeType error code. 0 means success. *)
(* *)
function FT_Outline_Check( outline: PFT_Outline ): FT_Error;
cdecl; external ft_lib name 'FT_Outline_Check';
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_Get_CBox *)
(* *)
(* <Description> *)
(* Returns an outline's `control box'. The control box encloses all *)
(* the outline's points, including Bézier control points. Though it *)
(* coincides with the exact bounding box for most glyphs, it can be *)
(* slightly larger in some situations (like when rotating an outline *)
(* which contains Bézier outside arcs). *)
(* *)
(* Computing the control box is very fast, while getting the bounding *)
(* box can take much more time as it needs to walk over all segments *)
(* and arcs in the outline. To get the latter, you can use the *)
(* `ftbbox' component which is dedicated to this single task. *)
(* *)
(* <Input> *)
(* outline :: A pointer to the source outline descriptor. *)
(* *)
(* <Output> *)
(* acbox :: The outline's control box. *)
(* *)
procedure FT_Outline_Get_CBox(
outline: {const} PFT_Outline;
acbox: PFT_BBox);
cdecl; external ft_lib name 'FT_Outline_Get_CBox';
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_Translate *)
(* *)
(* <Description> *)
(* Applies a simple translation to the points of an outline. *)
(* *)
(* <InOut> *)
(* outline :: A pointer to the target outline descriptor. *)
(* *)
(* <Input> *)
(* xOffset :: The horizontal offset. *)
(* *)
(* yOffset :: The vertical offset. *)
(* *)
procedure FT_Outline_Translate(
outline: {const} PFT_Outline;
xOffset: FT_Pos;
yOffset: FT_Pos);
cdecl; external ft_lib name 'FT_Outline_Translate';
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_Copy *)
(* *)
(* <Description> *)
(* Copies an outline into another one. Both objects must have the *)
(* same sizes (number of points & number of contours) when this *)
(* function is called. *)
(* *)
(* <Input> *)
(* source :: A handle to the source outline. *)
(* *)
(* <Output> *)
(* target :: A handle to the target outline. *)
(* *)
(* <Return> *)
(* FreeType error code. 0 means success. *)
(* *)
function FT_Outline_Copy(
source: {const} PFT_Outline;
target: PFT_Outline): FT_Error;
cdecl; external ft_lib name 'FT_Outline_Copy';
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_Transform *)
(* *)
(* <Description> *)
(* Applies a simple 2x2 matrix to all of an outline's points. Useful *)
(* for applying rotations, slanting, flipping, etc. *)
(* *)
(* <InOut> *)
(* outline :: A pointer to the target outline descriptor. *)
(* *)
(* <Input> *)
(* matrix :: A pointer to the transformation matrix. *)
(* *)
(* <Note> *)
(* You can use @FT_Outline_Translate if you need to translate the *)
(* outline's points. *)
(* *)
procedure FT_Outline_Transform(
outline: {const} PFT_Outline;
matrix: {const} PFT_Matrix);
cdecl; external ft_lib name 'FT_Outline_Transform';
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_Embolden *)
(* *)
(* <Description> *)
(* Emboldens an outline. The new outline will be at most 4 times *)
(* `strength' pixels wider and higher. You may think of the left and *)
(* bottom borders as unchanged. *)
(* *)
(* Negative `strength' values to reduce the outline thickness are *)
(* possible also. *)
(* *)
(* <InOut> *)
(* outline :: A handle to the target outline. *)
(* *)
(* <Input> *)
(* strength :: How strong the glyph is emboldened. Expressed in *)
(* 26.6 pixel format. *)
(* *)
(* <Return> *)
(* FreeType error code. 0 means success. *)
(* *)
(* <Note> *)
(* The used algorithm to increase or decrease the thickness of the *)
(* glyph doesn't change the number of points; this means that certain *)
(* situations like acute angles or intersections are sometimes *)
(* handled incorrectly. *)
(* *)
(* Example call: *)
(* *)
(* { *)
(* FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); *)
(* if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) *)
(* FT_Outline_Embolden( &face->slot->outline, strength ); *)
(* } *)
(* *)
function FT_Outline_Embolden(
outline: PFT_Outline;
strength: FT_Pos): FT_Error;
cdecl; external ft_lib name 'FT_Outline_Embolden';
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_Reverse *)
(* *)
(* <Description> *)
(* Reverses the drawing direction of an outline. This is used to *)
(* ensure consistent fill conventions for mirrored glyphs. *)
(* *)
(* <InOut> *)
(* outline :: A pointer to the target outline descriptor. *)
(* *)
(* <Note> *)
(* This functions toggles the bit flag @FT_OUTLINE_REVERSE_FILL in *)
(* the outline's `flags' field. *)
(* *)
(* It shouldn't be used by a normal client application, unless it *)
(* knows what it is doing. *)
(* *)
procedure FT_Outline_Reverse( outline: PFT_Outline );
cdecl; external ft_lib name 'FT_Outline_Reverse';
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_Get_Bitmap *)
(* *)
(* <Description> *)
(* Renders an outline within a bitmap. The outline's image is simply *)
(* OR-ed to the target bitmap. *)
(* *)
(* <Input> *)
(* library :: A handle to a FreeType library object. *)
(* *)
(* outline :: A pointer to the source outline descriptor. *)
(* *)
(* <InOut> *)
(* abitmap :: A pointer to the target bitmap descriptor. *)
(* *)
(* <Return> *)
(* FreeType error code. 0 means success. *)
(* *)
(* <Note> *)
(* This function does NOT CREATE the bitmap, it only renders an *)
(* outline image within the one you pass to it! *)
(* *)
(* It will use the raster corresponding to the default glyph format. *)
(* *)
function FT_Outline_Get_Bitmap(
library_: FT_Library;
outline: PFT_Outline;
abitmap: {const} PFT_Bitmap): FT_Error;
cdecl; external ft_lib name 'FT_Outline_Get_Bitmap';
(*************************************************************************)
(* *)
(* <Function> *)
(* FT_Outline_Render *)
(* *)
(* <Description> *)
(* Renders an outline within a bitmap using the current scan-convert. *)
(* This functions uses an @FT_Raster_Params structure as an argument, *)
(* allowing advanced features like direct composition, translucency, *)
(* etc. *)
(* *)
(* <Input> *)
(* library :: A handle to a FreeType library object. *)
(* *)
(* outline :: A pointer to the source outline descriptor. *)
(* *)
(* <InOut> *)
(* params :: A pointer to an @FT_Raster_Params structure used to *)
(* describe the rendering operation. *)
(* *)
(* <Return> *)
(* FreeType error code. 0 means success. *)
(* *)
(* <Note> *)
(* You should know what you are doing and how @FT_Raster_Params works *)
(* to use this function. *)
(* *)
(* The field `params.source' will be set to `outline' before the scan *)
(* converter is called, which means that the value you give to it is *)
(* actually ignored. *)
(* *)
function FT_Outline_Render(
library_: FT_Library;
outline: PFT_Outline;
params: PFT_Raster_Params): FT_Error;
cdecl; external ft_lib name 'FT_Outline_Render';
{$ENDIF TYPE_DECL}
(**************************************************************************
*
* @enum:
* FT_Orientation
*
* @description:
* A list of values used to describe an outline's contour orientation.
*
* The TrueType and Postscript specifications use different conventions
* to determine whether outline contours should be filled or unfilled.
*
* @values:
* FT_ORIENTATION_TRUETYPE ::
* According to the TrueType specification, clockwise contours must
* be filled, and counter-clockwise ones must be unfilled.
*
* FT_ORIENTATION_POSTSCRIPT ::
* According to the Postscript specification, counter-clockwise contours
* must be filled, and clockwise ones must be unfilled.
*
* FT_ORIENTATION_FILL_RIGHT ::
* This is identical to @FT_ORIENTATION_TRUETYPE, but is used to
* remember that in TrueType, everything that is to the right of
* the drawing direction of a contour must be filled.
*
* FT_ORIENTATION_FILL_LEFT ::
* This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to
* remember that in Postscript, everything that is to the left of
* the drawing direction of a contour must be filled.
*
* FT_ORIENTATION_NONE ::
* The orientation cannot be determined. That is, different parts of
* the glyph have different orientation.
*
*)
{$IFDEF TYPE_DECL}
FT_Orientation = cint;
{$ELSE TYPE_DECL}
const
FT_ORIENTATION_TRUETYPE = 0;
FT_ORIENTATION_POSTSCRIPT = 1;
FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE;
FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT;
FT_ORIENTATION_NONE = FT_ORIENTATION_FILL_LEFT+1;
(**************************************************************************
*
* @function:
* FT_Outline_Get_Orientation
*
* @description:
* This function analyzes a glyph outline and tries to compute its
* fill orientation (see @FT_Orientation). This is done by computing
* the direction of each global horizontal and/or vertical extrema
* within the outline.
*
* Note that this will return @FT_ORIENTATION_TRUETYPE for empty
* outlines.
*
* @input:
* outline ::
* A handle to the source outline.
*
* @return:
* The orientation.
*
*)
function FT_Outline_Get_Orientation( outline: PFT_Outline ): FT_Orientation;
cdecl; external ft_lib name 'FT_Outline_Get_Orientation';
{$ENDIF TYPE_DECL}