/**************************************************************************** * * ftoutln.h * * Support for the FT_Outline type used to store glyph shapes of * most scalable font formats (specification). * * Copyright (C) 1996-2020 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. * */ #ifndef FTOUTLN_H_ #define FTOUTLN_H_ #include #include FT_FREETYPE_H #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" #error "Please fix the directory search order for header files" #error "so that freetype.h of FreeType 2 is found first." #endif FT_BEGIN_HEADER /************************************************************************** * * @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_New * FT_Outline_Done * FT_Outline_Copy * FT_Outline_Translate * FT_Outline_Transform * FT_Outline_Embolden * FT_Outline_EmboldenXY * 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_MoveToFunc * FT_Outline_LineToFunc * FT_Outline_ConicToFunc * FT_Outline_CubicToFunc * * FT_Orientation * FT_Outline_Get_Orientation * * FT_OUTLINE_XXX * */ /************************************************************************** * * @function: * FT_Outline_Decompose * * @description: * Walk over an outline's structure to decompose it into individual * segments and Bezier arcs. This function also emits 'move to' * operations to indicate the start 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 that 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. * * @note: * A contour that contains a single point only is represented by a 'move * to' operation followed by 'line to' to the same point. In most cases, * it is best to filter this out before using the outline for stroking * purposes (otherwise it would result in a visible dot when round caps * are used). * * Similarly, the function returns success for an empty outline also * (doing nothing, this is, not calling any emitter); if necessary, you * should filter this out, too. */ FT_EXPORT( FT_Error ) FT_Outline_Decompose( FT_Outline* outline, const FT_Outline_Funcs* func_interface, void* user ); /************************************************************************** * * @function: * FT_Outline_New * * @description: * Create 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 maximum number of points within the outline. Must be smaller * than or equal to 0xFFFF (65535). * * numContours :: * The maximum number of contours within the outline. This value must * be in the range 0 to `numPoints`. * * @output: * anoutline :: * A handle to the new outline. * * @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. */ FT_EXPORT( FT_Error ) FT_Outline_New( FT_Library library, FT_UInt numPoints, FT_Int numContours, FT_Outline *anoutline ); /************************************************************************** * * @function: * FT_Outline_Done * * @description: * Destroy 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. */ FT_EXPORT( FT_Error ) FT_Outline_Done( FT_Library library, FT_Outline* outline ); /************************************************************************** * * @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. * * @note: * An empty outline, or an outline with a single point only is also * valid. */ FT_EXPORT( FT_Error ) FT_Outline_Check( FT_Outline* outline ); /************************************************************************** * * @function: * FT_Outline_Get_CBox * * @description: * Return an outline's 'control box'. The control box encloses all the * outline's points, including Bezier 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 that * contains Bezier 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. * * @note: * See @FT_Glyph_Get_CBox for a discussion of tricky fonts. */ FT_EXPORT( void ) FT_Outline_Get_CBox( const FT_Outline* outline, FT_BBox *acbox ); /************************************************************************** * * @function: * FT_Outline_Translate * * @description: * Apply 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. */ FT_EXPORT( void ) FT_Outline_Translate( const FT_Outline* outline, FT_Pos xOffset, FT_Pos yOffset ); /************************************************************************** * * @function: * FT_Outline_Copy * * @description: * Copy 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. */ FT_EXPORT( FT_Error ) FT_Outline_Copy( const FT_Outline* source, FT_Outline *target ); /************************************************************************** * * @function: * FT_Outline_Transform * * @description: * Apply 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. */ FT_EXPORT( void ) FT_Outline_Transform( const FT_Outline* outline, const FT_Matrix* matrix ); /************************************************************************** * * @function: * FT_Outline_Embolden * * @description: * Embolden 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. * * If you need 'better' metrics values you should call * @FT_Outline_Get_CBox or @FT_Outline_Get_BBox. * * To get meaningful results, font scaling values must be set with * functions like @FT_Set_Char_Size before calling FT_Render_Glyph. * * @example: * ``` * FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); * * if ( face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) * FT_Outline_Embolden( &face->glyph->outline, strength ); * ``` * */ FT_EXPORT( FT_Error ) FT_Outline_Embolden( FT_Outline* outline, FT_Pos strength ); /************************************************************************** * * @function: * FT_Outline_EmboldenXY * * @description: * Embolden an outline. The new outline will be `xstrength` pixels wider * and `ystrength` pixels higher. Otherwise, it is similar to * @FT_Outline_Embolden, which uses the same strength in both directions. * * @since: * 2.4.10 */ FT_EXPORT( FT_Error ) FT_Outline_EmboldenXY( FT_Outline* outline, FT_Pos xstrength, FT_Pos ystrength ); /************************************************************************** * * @function: * FT_Outline_Reverse * * @description: * Reverse 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 function 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. */ FT_EXPORT( void ) FT_Outline_Reverse( FT_Outline* outline ); /************************************************************************** * * @function: * FT_Outline_Get_Bitmap * * @description: * Render 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! Consequently, the * various fields in `abitmap` should be set accordingly. * * It will use the raster corresponding to the default glyph format. * * The value of the `num_grays` field in `abitmap` is ignored. If you * select the gray-level rasterizer, and you want less than 256 gray * levels, you have to use @FT_Outline_Render directly. */ FT_EXPORT( FT_Error ) FT_Outline_Get_Bitmap( FT_Library library, FT_Outline* outline, const FT_Bitmap *abitmap ); /************************************************************************** * * @function: * FT_Outline_Render * * @description: * Render an outline within a bitmap using the current scan-convert. * * @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: * This advanced function uses @FT_Raster_Params as an argument, * allowing FreeType rasterizer to be used for direct composition, * translucency, etc. You should know how to set up @FT_Raster_Params * for this function to work. * * 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. * * The gray-level rasterizer always uses 256 gray levels. If you want * less gray levels, you have to provide your own span callback. See the * @FT_RASTER_FLAG_DIRECT value of the `flags` field in the * @FT_Raster_Params structure for more details. */ FT_EXPORT( FT_Error ) FT_Outline_Render( FT_Library library, FT_Outline* outline, FT_Raster_Params* params ); /************************************************************************** * * @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. * */ typedef enum FT_Orientation_ { 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; /************************************************************************** * * @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 integrating the * total area covered by the outline. The positive integral corresponds * to the clockwise orientation and @FT_ORIENTATION_POSTSCRIPT is * returned. The negative integral corresponds to the counter-clockwise * orientation and @FT_ORIENTATION_TRUETYPE is returned. * * Note that this will return @FT_ORIENTATION_TRUETYPE for empty * outlines. * * @input: * outline :: * A handle to the source outline. * * @return: * The orientation. * */ FT_EXPORT( FT_Orientation ) FT_Outline_Get_Orientation( FT_Outline* outline ); /* */ FT_END_HEADER #endif /* FTOUTLN_H_ */ /* END */ /* Local Variables: */ /* coding: utf-8 */ /* End: */