freetype2/include/freetype/ftimage.h

1285 lines
41 KiB
C
Raw Normal View History

/****************************************************************************
*
* ftimage.h
*
* FreeType glyph image formats and default raster interface
* (specification).
*
2024-01-27 17:11:22 +01:00
* Copyright (C) 1996-2024 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.
*
*/
/**************************************************************************
*
* Note: A 'raster' is simply a scan-line converter, used to render
* `FT_Outline`s into `FT_Bitmap`s.
*
*/
2000-07-10 16:24:26 +02:00
#ifndef FTIMAGE_H_
#define FTIMAGE_H_
1999-12-17 00:11:37 +01:00
FT_BEGIN_HEADER
/**************************************************************************
*
* @section:
* basic_types
*
*/
/**************************************************************************
*
* @type:
* FT_Pos
*
* @description:
* The type FT_Pos is used to store vectorial coordinates. Depending on
* the context, these can represent distances in integer font units, or
* 16.16, or 26.6 fixed-point pixel coordinates.
*/
1999-12-17 00:11:37 +01:00
typedef signed long FT_Pos;
/**************************************************************************
*
* @struct:
* FT_Vector
*
* @description:
* A simple structure used to store a 2D vector; coordinates are of the
* FT_Pos type.
*
* @fields:
* x ::
* The horizontal coordinate.
* y ::
* The vertical coordinate.
*/
1999-12-17 00:11:37 +01:00
typedef struct FT_Vector_
{
FT_Pos x;
FT_Pos y;
} FT_Vector;
/**************************************************************************
*
* @struct:
* FT_BBox
*
* @description:
* A structure used to hold an outline's bounding box, i.e., the
* coordinates of its extrema in the horizontal and vertical directions.
*
* @fields:
* xMin ::
* The horizontal minimum (left-most).
*
* yMin ::
* The vertical minimum (bottom-most).
*
* xMax ::
* The horizontal maximum (right-most).
*
* yMax ::
* The vertical maximum (top-most).
*
* @note:
* The bounding box is specified with the coordinates of the lower left
* and the upper right corner. In PostScript, those values are often
* called (llx,lly) and (urx,ury), respectively.
*
* If `yMin` is negative, this value gives the glyph's descender.
* Otherwise, the glyph doesn't descend below the baseline. Similarly,
* if `ymax` is positive, this value gives the glyph's ascender.
*
* `xMin` gives the horizontal distance from the glyph's origin to the
* left edge of the glyph's bounding box. If `xMin` is negative, the
* glyph extends to the left of the origin.
*/
typedef struct FT_BBox_
{
FT_Pos xMin, yMin;
FT_Pos xMax, yMax;
} FT_BBox;
/**************************************************************************
*
* @enum:
* FT_Pixel_Mode
*
* @description:
* An enumeration type used to describe the format of pixels in a given
* bitmap. Note that additional formats may be added in the future.
*
* @values:
* FT_PIXEL_MODE_NONE ::
* Value~0 is reserved.
*
* FT_PIXEL_MODE_MONO ::
* A monochrome bitmap, using 1~bit per pixel. Note that pixels are
* stored in most-significant order (MSB), which means that the
* left-most pixel in a byte has value 128.
*
* FT_PIXEL_MODE_GRAY ::
* An 8-bit bitmap, generally used to represent anti-aliased glyph
* images. Each pixel is stored in one byte. Note that the number of
* 'gray' levels is stored in the `num_grays` field of the @FT_Bitmap
* structure (it generally is 256).
*
* FT_PIXEL_MODE_GRAY2 ::
* A 2-bit per pixel bitmap, used to represent embedded anti-aliased
* bitmaps in font files according to the OpenType specification. We
* haven't found a single font using this format, however.
*
* FT_PIXEL_MODE_GRAY4 ::
* A 4-bit per pixel bitmap, representing embedded anti-aliased bitmaps
* in font files according to the OpenType specification. We haven't
* found a single font using this format, however.
*
* FT_PIXEL_MODE_LCD ::
* An 8-bit bitmap, representing RGB or BGR decimated glyph images used
* for display on LCD displays; the bitmap is three times wider than
* the original glyph image. See also @FT_RENDER_MODE_LCD.
*
* FT_PIXEL_MODE_LCD_V ::
* An 8-bit bitmap, representing RGB or BGR decimated glyph images used
* for display on rotated LCD displays; the bitmap is three times
* taller than the original glyph image. See also
* @FT_RENDER_MODE_LCD_V.
*
* FT_PIXEL_MODE_BGRA ::
* [Since 2.5] An image with four 8-bit channels per pixel,
* representing a color image (such as emoticons) with alpha channel.
* For each pixel, the format is BGRA, which means, the blue channel
* comes first in memory. The color channels are pre-multiplied and in
* the sRGB colorspace. For example, full red at half-translucent
* opacity will be represented as '00,00,80,80', not '00,00,FF,80'.
* See also @FT_LOAD_COLOR.
*/
2000-07-10 16:24:26 +02:00
typedef enum FT_Pixel_Mode_
1999-12-17 00:11:37 +01:00
{
FT_PIXEL_MODE_NONE = 0,
FT_PIXEL_MODE_MONO,
FT_PIXEL_MODE_GRAY,
FT_PIXEL_MODE_GRAY2,
FT_PIXEL_MODE_GRAY4,
FT_PIXEL_MODE_LCD,
FT_PIXEL_MODE_LCD_V,
Add support for color embedded bitmaps (eg. color emoji). A new load flag, FT_LOAD_COLOR, makes FreeType load color embedded-bitmaps, following this draft specification https://color-emoji.googlecode.com/git/specification/v1.html which defines two new SFNT tables, `CBDT' and `CBLC' (named and modeled after `EBDT' and `EBLC', respectively). The color bitmaps are stored in the new FT_PIXEL_MODE_BGRA format to represent BGRA pre-multiplied sRGB images. If PNG support is available, PNG color images as defined in the same proposed specification are supported also. Note that color bitmaps are converted to grayscale if client didn't ask for color. * builds/unix/configure.raw: Search for libpng. Add `--without-png' option. * devel/ftoption.h, include/freetype/config/ftoption.h (FT_CONFIG_OPTION_USE_PNG): New macro. * include/freetype/freetype.h (FT_LOAD_COLOR): New load flag. * include/freetype/ftimage.h (FT_Pixel_Mode): Add `FT_PIXEL_MODE_BGRA'. * include/freetype/tttags.h (TTAG_CBDT, TTAG_CBLC): New tags. * src/base/ftbitmap.c (FT_Bitmap_Embolden): Updated. (ft_gray_for_premultiplied_srgb_bgra): New function. (FT_Bitmap_Convert): Handle FT_PIXEL_MODE_BGRA. * src/sfnt/pngshim.c, src/sfnt/pngshim.h: New files. * src/sfnt/sfnt.c: Include `pngshim.c'. * src/sfnt/ttsbit.c: Include FT_BITMAP_H and `pngshim.h' (tt_face_load_eblc): Load `CBLC'. (tt_sbit_decoder_init): Load `CBDT'. (tt_sbit_decoder_alloc_bitmap): Pass load flags to select between color and grayscale bitmaps. Set `num_grays'. This is used by `ftview' to choose the blending algorithm. (tt_sbit_decoder_load_byte_aligned, tt_sbit_decoder_load_bit_aligned, tt_sbit_decoder_load_compound, tt_sbit_decoder_load_image): Pass load flag. s/write/pwrite/. Don't call `tt_sbit_decoder_alloc_bitmap'. Updated. (tt_sbit_decoder_load_png) [FT_CONFIG_OPTION_USE_PNG]: New function. (tt_sbit_decoder_load_bitmap): Pass load flag. Handle new glyph formats 17, 18, and 19. Call `tt_sbit_decoder_alloc_bitmap'. Flatten color bitmaps if necessary. (tt_face_load_sbit_image): Updated. * src/sfnt/rules.mk (SFNT_DRV_SRC): Add `pngshim.c'. * docs/CHANGES: Updated.
2013-05-29 11:36:18 +02:00
FT_PIXEL_MODE_BGRA,
FT_PIXEL_MODE_MAX /* do not remove */
1999-12-17 00:11:37 +01:00
} FT_Pixel_Mode;
/* these constants are deprecated; use the corresponding `FT_Pixel_Mode` */
/* values instead. */
#define ft_pixel_mode_none FT_PIXEL_MODE_NONE
#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO
#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY
#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2
#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4
/* */
/* For debugging, the @FT_Pixel_Mode enumeration must stay in sync */
/* with the `pixel_modes` array in file `ftobjs.c`. */
/**************************************************************************
*
* @struct:
* FT_Bitmap
*
* @description:
* A structure used to describe a bitmap or pixmap to the raster. Note
* that we now manage pixmaps of various depths through the `pixel_mode`
* field.
*
* @fields:
* rows ::
* The number of bitmap rows.
*
* width ::
* The number of pixels in bitmap row.
*
* pitch ::
* The pitch's absolute value is the number of bytes taken by one
* bitmap row, including padding. However, the pitch is positive when
* the bitmap has a 'down' flow, and negative when it has an 'up' flow.
* In all cases, the pitch is an offset to add to a bitmap pointer in
* order to go down one row.
*
* Note that 'padding' means the alignment of a bitmap to a byte
* border, and FreeType functions normally align to the smallest
* possible integer value.
*
* For the B/W rasterizer, `pitch` is always an even number.
*
* To change the pitch of a bitmap (say, to make it a multiple of 4),
* use @FT_Bitmap_Convert. Alternatively, you might use callback
* functions to directly render to the application's surface; see the
* file `example2.cpp` in the tutorial for a demonstration.
*
* buffer ::
* A typeless pointer to the bitmap buffer. This value should be
* aligned on 32-bit boundaries in most cases.
*
* num_grays ::
* This field is only used with @FT_PIXEL_MODE_GRAY; it gives the
* number of gray levels used in the bitmap.
*
* pixel_mode ::
* The pixel mode, i.e., how pixel bits are stored. See @FT_Pixel_Mode
* for possible values.
*
* palette_mode ::
* This field is intended for paletted pixel modes; it indicates how
* the palette is stored. Not used currently.
*
* palette ::
* A typeless pointer to the bitmap palette; this field is intended for
* paletted pixel modes. Not used currently.
*
* @note:
* `width` and `rows` refer to the *physical* size of the bitmap, not the
* *logical* one. For example, if @FT_Pixel_Mode is set to
* `FT_PIXEL_MODE_LCD`, the logical width is a just a third of the
* physical one.
*/
2000-07-10 16:24:26 +02:00
typedef struct FT_Bitmap_
1999-12-17 00:11:37 +01:00
{
unsigned int rows;
unsigned int width;
int pitch;
unsigned char* buffer;
unsigned short num_grays;
unsigned char pixel_mode;
unsigned char palette_mode;
void* palette;
1999-12-17 00:11:37 +01:00
} FT_Bitmap;
/**************************************************************************
*
* @section:
* outline_processing
*
*/
/**************************************************************************
*
* @struct:
* FT_Outline
*
* @description:
* This structure is used to describe an outline to the scan-line
* converter.
*
* @fields:
* n_contours ::
* The number of contours in the outline.
*
* n_points ::
* The number of points in the outline.
*
* points ::
* A pointer to an array of `n_points` @FT_Vector elements, giving the
* outline's point coordinates.
*
* tags ::
* A pointer to an array of `n_points` chars, giving each outline
* point's type.
*
* If bit~0 is unset, the point is 'off' the curve, i.e., a Bezier
* control point, while it is 'on' if set.
*
* Bit~1 is meaningful for 'off' points only. If set, it indicates a
* third-order Bezier arc control point; and a second-order control
* point if unset.
*
* If bit~2 is set, bits 5-7 contain the drop-out mode (as defined in
* the OpenType specification; the value is the same as the argument to
* the 'SCANTYPE' instruction).
*
* Bits 3 and~4 are reserved for internal purposes.
*
* contours ::
* An array of `n_contours` shorts, giving the end point of each
* contour within the outline. For example, the first contour is
* defined by the points '0' to `contours[0]`, the second one is
* defined by the points `contours[0]+1` to `contours[1]`, etc.
*
* flags ::
* A set of bit flags used to characterize the outline and give hints
* to the scan-converter and hinter on how to convert/grid-fit it. See
* @FT_OUTLINE_XXX.
*
* @note:
* The B/W rasterizer only checks bit~2 in the `tags` array for the first
* point of each contour. The drop-out mode as given with
* @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and
* @FT_OUTLINE_INCLUDE_STUBS in `flags` is then overridden.
*/
1999-12-17 00:11:37 +01:00
typedef struct FT_Outline_
{
short n_contours; /* number of contours in glyph */
short n_points; /* number of points in the glyph */
FT_Vector* points; /* the outline's points */
char* tags; /* the points flags */
1999-12-17 00:11:37 +01:00
short* contours; /* the contour end points */
int flags; /* outline masks */
} FT_Outline;
1999-12-17 00:11:37 +01:00
/* */
/* Following limits must be consistent with */
/* FT_Outline.{n_contours,n_points} */
#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX
#define FT_OUTLINE_POINTS_MAX SHRT_MAX
- MAJOR INTERNAL REDESIGN: A lot of internal modifications have been performed lately on the source in order to provide the following enhancements: - more generic module support: The FT_Module type is now defined to represent a handle to a given module. The file <freetype/ftmodule.h> contains the FT_Module_Class definition, as well as the module-loading public API The FT_Driver type is still defined, and still represents a pointer to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module, FT_Get_Driver by FT_Get_Module, etc.. - support for generic glyph image types: The FT_Renderer type is a pointer to a module used to perform various operations on glyph image. Each renderer is capable of handling images in a single format (e.g. ft_glyph_format_outline). Its functions are used to: - transform an glyph image - render a glyph image into a bitmap - return the control box (dimensions) of a given glyph image The scan converters "ftraster.c" and "ftgrays.c" have been moved to the new directory "src/renderer", and are used to provide two default renderer modules. One corresponds to the "standard" scan-converter, the other to the "smooth" one. The current renderer can be set through the new function FT_Set_Renderer. The old raster-related function FT_Set_Raster, FT_Get_Raster and FT_Set_Raster_Mode have now disappeared, in favor of the new: FT_Get_Renderer FT_Set_Renderer see the file <freetype/ftrender.h> for more details.. These changes were necessary to properly support different scalable formats in the future, like bi-color glyphs, etc.. - glyph loader object: A new internal object, called a 'glyph loader' has been introduced in the base layer. It is used by all scalable format font drivers to load glyphs and composites. This object has been created to reduce the code size of each driver, as each one of them basically re-implemented its functionality. See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for more information.. - FT_GlyphSlot had new fields: In order to support extended features (see below), the FT_GlyphSlot structure has a few new fields: linearHoriAdvance: this field gives the linearly scaled (i.e. scaled but unhinted) advance width for the glyph, expressed as a 16.16 fixed pixel value. This is useful to perform WYSIWYG text. linearVertAdvance: this field gives the linearly scaled advance height for the glyph (relevant in vertical glyph layouts only). This is useful to perform WYSIWYG text. Note that the two above field replace the removed "metrics2" field in the glyph slot. advance: this field is a vector that gives the transformed advance for the glyph. By default, it corresponds to the advance width, unless FT_LOAD_VERTICAL_LAYOUT was specified when calling FT_Load_Glyph or FT_Load_Char bitmap_left: this field gives the distance in integer pixels from the current pen position to the left-most pixel of a glyph image WHEN IT IS A BITMAP. It is only valid when the "format" field is set to "ft_glyph_format_bitmap", for example, after calling the new function FT_Render_Glyph. bitmap_top: this field gives the distance in integer pixels from the current pen position (located on the baseline) to the top-most pixel of the glyph image WHEN IT IS A BITMAP. Positive values correspond to upwards Y. loader: this is a new private field for the glyph slot. Client applications should not touch it.. - support for transforms and direct rendering in FT_Load_Glyph: Most of the functionality found in <freetype/ftglyph.h> has been moved to the core library. Hence, the following: - a transform can be specified for a face through FT_Set_Transform. this transform is applied by FT_Load_Glyph to scalable glyph images (i.e. NOT TO BITMAPS) before the function returns, unless the bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags.. - once a glyph image has been loaded, it can be directly converted to a bitmap by using the new FT_Render_Glyph function. Note that this function takes the glyph image from the glyph slot, and converts it to a bitmap whose properties are returned in "face.glyph.bitmap", "face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original native image might be lost after the conversion. - when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph and FT_Load_Char functions will call FT_Render_Glyph automatically when needed.
2000-06-22 02:17:42 +02:00
/**************************************************************************
*
* @enum:
* FT_OUTLINE_XXX
*
* @description:
* A list of bit-field constants used for the flags in an outline's
* `flags` field.
*
* @values:
* FT_OUTLINE_NONE ::
* Value~0 is reserved.
*
* FT_OUTLINE_OWNER ::
* If set, this flag indicates that the outline's field arrays (i.e.,
* `points`, `flags`, and `contours`) are 'owned' by the outline
* object, and should thus be freed when it is destroyed.
*
* FT_OUTLINE_EVEN_ODD_FILL ::
* By default, outlines are filled using the non-zero winding rule. If
* set to 1, the outline will be filled using the even-odd fill rule
* (only works with the smooth rasterizer).
*
* FT_OUTLINE_REVERSE_FILL ::
* By default, outside contours of an outline are oriented in
* clock-wise direction, as defined in the TrueType specification.
* This flag is set if the outline uses the opposite direction
* (typically for Type~1 fonts). This flag is ignored by the scan
* converter.
*
* FT_OUTLINE_IGNORE_DROPOUTS ::
* By default, the scan converter will try to detect drop-outs in an
* outline and correct the glyph bitmap to ensure consistent shape
* continuity. If set, this flag hints the scan-line converter to
* ignore such cases. See below for more information.
*
* FT_OUTLINE_SMART_DROPOUTS ::
* Select smart dropout control. If unset, use simple dropout control.
* Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more
* information.
*
* FT_OUTLINE_INCLUDE_STUBS ::
* If set, turn pixels on for 'stubs', otherwise exclude them. Ignored
* if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more
* information.
*
* FT_OUTLINE_OVERLAP ::
* [Since 2.10.3] This flag indicates that this outline contains
* overlapping contours and the anti-aliased renderer should perform
* oversampling to mitigate possible artifacts. This flag should _not_
* be set for well designed glyphs without overlaps because it quadruples
* the rendering time.
*
* FT_OUTLINE_HIGH_PRECISION ::
* This flag indicates that the scan-line converter should try to
* convert this outline to bitmaps with the highest possible quality.
* It is typically set for small character sizes. Note that this is
* only a hint that might be completely ignored by a given
* scan-converter.
*
* FT_OUTLINE_SINGLE_PASS ::
* This flag is set to force a given scan-converter to only use a
* single pass over the outline to render a bitmap glyph image.
* Normally, it is set for very large character sizes. It is only a
* hint that might be completely ignored by a given scan-converter.
*
* @note:
* The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and
* @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth rasterizer.
*
* There exists a second mechanism to pass the drop-out mode to the B/W
* rasterizer; see the `tags` field in @FT_Outline.
*
* Please refer to the description of the 'SCANTYPE' instruction in the
* [OpenType specification](https://learn.microsoft.com/en-us/typography/opentype/spec/tt_instructions#scantype)
* how simple drop-outs, smart drop-outs, and stubs are defined.
*/
#define FT_OUTLINE_NONE 0x0
#define FT_OUTLINE_OWNER 0x1
#define FT_OUTLINE_EVEN_ODD_FILL 0x2
#define FT_OUTLINE_REVERSE_FILL 0x4
#define FT_OUTLINE_IGNORE_DROPOUTS 0x8
#define FT_OUTLINE_SMART_DROPOUTS 0x10
#define FT_OUTLINE_INCLUDE_STUBS 0x20
#define FT_OUTLINE_OVERLAP 0x40
#define FT_OUTLINE_HIGH_PRECISION 0x100
#define FT_OUTLINE_SINGLE_PASS 0x200
1999-12-17 00:11:37 +01:00
/* these constants are deprecated; use the corresponding */
/* `FT_OUTLINE_XXX` values instead */
#define ft_outline_none FT_OUTLINE_NONE
#define ft_outline_owner FT_OUTLINE_OWNER
#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL
#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL
#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS
#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION
#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS
2001-01-10 07:53:49 +01:00
/* */
#define FT_CURVE_TAG( flag ) ( flag & 0x03 )
1999-12-17 00:11:37 +01:00
/* see the `tags` field in `FT_Outline` for a description of the values */
#define FT_CURVE_TAG_ON 0x01
#define FT_CURVE_TAG_CONIC 0x00
#define FT_CURVE_TAG_CUBIC 0x02
Fix B/W rasterization of subglyphs with different drop-out modes. Normally, the SCANMODE instruction (if present) to set the drop-out mode in a TrueType font is located in the `prep' table only and thus valid for all glyphs. However, there are fonts like `pala.ttf' which additionally contain this instruction in the hinting code of some glyphs (but not all). As a result it can happen that a composite glyph needs multiple drop-out modes for its subglyphs since the rendering state gets reset for each subglyph. FreeType collects the hinted outlines from all subglyphs, then it sends the data to the rasterizer. It also sends the drop-out mode -- after hinting has been applied -- and here is the error: It sends the drop-out mode of the last subglyph only; drop-out modes of all other subglyphs are lost. This patch fixes the problem; it adds a second, alternative mechanism to pass the drop-out mode: For each contour, the rasterizer now checks the first `tags' array element. If bit 2 is set, bits 5-7 contain the contour's drop-out mode, overriding the global drop-out mode. * include/freetype/ftimage.h (FT_CURVE_TAG_HAS_SCANMODE): New macro. * src/truetype/ttgload.c (TT_Hint_Glyph): Store drop-out mode in `tags[0]'. * src/raster/ftraster.c (Flow_Up, Overshoot_Top, Overshoot_Bottom): Use bits 3-5 instead of 0-2. (New_Profile): Set the drop-out mode in the profile's `flags' field. (Decompose_Curve): Check `tags[0]' and set `dropOutControl' if necessary. (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, Horizontal_Gray_Sweep_Drop, Draw_Sweep): Use the profile's drop-out mode.
2009-06-18 15:42:52 +02:00
#define FT_CURVE_TAG_HAS_SCANMODE 0x04
1999-12-17 00:11:37 +01:00
#define FT_CURVE_TAG_TOUCH_X 0x08 /* reserved for TrueType hinter */
#define FT_CURVE_TAG_TOUCH_Y 0x10 /* reserved for TrueType hinter */
1999-12-17 00:11:37 +01:00
Fix B/W rasterization of subglyphs with different drop-out modes. Normally, the SCANMODE instruction (if present) to set the drop-out mode in a TrueType font is located in the `prep' table only and thus valid for all glyphs. However, there are fonts like `pala.ttf' which additionally contain this instruction in the hinting code of some glyphs (but not all). As a result it can happen that a composite glyph needs multiple drop-out modes for its subglyphs since the rendering state gets reset for each subglyph. FreeType collects the hinted outlines from all subglyphs, then it sends the data to the rasterizer. It also sends the drop-out mode -- after hinting has been applied -- and here is the error: It sends the drop-out mode of the last subglyph only; drop-out modes of all other subglyphs are lost. This patch fixes the problem; it adds a second, alternative mechanism to pass the drop-out mode: For each contour, the rasterizer now checks the first `tags' array element. If bit 2 is set, bits 5-7 contain the contour's drop-out mode, overriding the global drop-out mode. * include/freetype/ftimage.h (FT_CURVE_TAG_HAS_SCANMODE): New macro. * src/truetype/ttgload.c (TT_Hint_Glyph): Store drop-out mode in `tags[0]'. * src/raster/ftraster.c (Flow_Up, Overshoot_Top, Overshoot_Bottom): Use bits 3-5 instead of 0-2. (New_Profile): Set the drop-out mode in the profile's `flags' field. (Decompose_Curve): Check `tags[0]' and set `dropOutControl' if necessary. (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, Horizontal_Gray_Sweep_Drop, Draw_Sweep): Use the profile's drop-out mode.
2009-06-18 15:42:52 +02:00
#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \
FT_CURVE_TAG_TOUCH_Y )
/* values 0x20, 0x40, and 0x80 are reserved */
2000-07-10 16:24:26 +02:00
/* these constants are deprecated; use the corresponding */
/* `FT_CURVE_TAG_XXX` values instead */
2008-01-12 21:24:01 +01:00
#define FT_Curve_Tag_On FT_CURVE_TAG_ON
#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC
#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC
#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X
#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y
1999-12-17 00:11:37 +01:00
/**************************************************************************
*
* @functype:
* FT_Outline_MoveToFunc
*
* @description:
* A function pointer type used to describe the signature of a 'move to'
* function during outline walking/decomposition.
*
* A 'move to' is emitted to start a new contour in an outline.
*
* @input:
* to ::
* A pointer to the target point of the 'move to'.
*
* user ::
* A typeless pointer, which is passed from the caller of the
* decomposition function.
*
* @return:
* Error code. 0~means success.
*/
2001-06-28 09:17:51 +02:00
typedef int
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be halved. * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default strength. Don't increase slot->advance.y. * include/freetype/freetype.h (FREETYPE_MINOR): Set to 2. (FREETYPE_PATCH): Set to 0. * builds/unix/configure.ac (version_info): Set to 9:9:3. Currently, we are still binary compatible. * builds/win32/visualc/index.html, builds/win32/visualc/freetype.dsp, builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): s/2.1.9/2.1.10/. * docs/CHANGES, docs/VERSION.DLL: Updated. * ChangeLog: Split off older entries into... * ChangeLog.20, ChangeLog.21: These new files. The next release will be 2.2.0, so don't worry about source code backwards compatibility. * include/freetype/ftimage.h (FT_Outline_MoveToFunc, FT_Outline_LineToFunc, FT_Outline_ConicToFunc, FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc), include/freetype/ftrender.h (FT_Glyph_TransformFunc, FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate parameters with `const' where appropriate. * src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY to make glyphs centered vertically. * src/truetype/ttgload.c (compute_glyph_metrics): Compute vertBearingY to make glyphs centered vertically. Fix some bugs in vertical metrics: . loader->pp3.y and loader->pp4.y are in 26.6 format, not in font units. . As we use the glyph's cbox to calculate the top bearing now there iss no need to adjust `top'. * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake. * docs/release: Update.
2005-06-16 21:07:08 +02:00
(*FT_Outline_MoveToFunc)( const FT_Vector* to,
void* user );
1999-12-17 00:11:37 +01:00
#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc
1999-12-17 00:11:37 +01:00
/**************************************************************************
*
* @functype:
* FT_Outline_LineToFunc
*
* @description:
* A function pointer type used to describe the signature of a 'line to'
* function during outline walking/decomposition.
*
* A 'line to' is emitted to indicate a segment in the outline.
*
* @input:
* to ::
* A pointer to the target point of the 'line to'.
*
* user ::
* A typeless pointer, which is passed from the caller of the
* decomposition function.
*
* @return:
* Error code. 0~means success.
*/
2001-06-28 09:17:51 +02:00
typedef int
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be halved. * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default strength. Don't increase slot->advance.y. * include/freetype/freetype.h (FREETYPE_MINOR): Set to 2. (FREETYPE_PATCH): Set to 0. * builds/unix/configure.ac (version_info): Set to 9:9:3. Currently, we are still binary compatible. * builds/win32/visualc/index.html, builds/win32/visualc/freetype.dsp, builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): s/2.1.9/2.1.10/. * docs/CHANGES, docs/VERSION.DLL: Updated. * ChangeLog: Split off older entries into... * ChangeLog.20, ChangeLog.21: These new files. The next release will be 2.2.0, so don't worry about source code backwards compatibility. * include/freetype/ftimage.h (FT_Outline_MoveToFunc, FT_Outline_LineToFunc, FT_Outline_ConicToFunc, FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc), include/freetype/ftrender.h (FT_Glyph_TransformFunc, FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate parameters with `const' where appropriate. * src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY to make glyphs centered vertically. * src/truetype/ttgload.c (compute_glyph_metrics): Compute vertBearingY to make glyphs centered vertically. Fix some bugs in vertical metrics: . loader->pp3.y and loader->pp4.y are in 26.6 format, not in font units. . As we use the glyph's cbox to calculate the top bearing now there iss no need to adjust `top'. * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake. * docs/release: Update.
2005-06-16 21:07:08 +02:00
(*FT_Outline_LineToFunc)( const FT_Vector* to,
void* user );
1999-12-17 00:11:37 +01:00
2008-01-12 21:24:01 +01:00
#define FT_Outline_LineTo_Func FT_Outline_LineToFunc
1999-12-17 00:11:37 +01:00
/**************************************************************************
*
* @functype:
* FT_Outline_ConicToFunc
*
* @description:
* A function pointer type used to describe the signature of a 'conic to'
* function during outline walking or decomposition.
*
* A 'conic to' is emitted to indicate a second-order Bezier arc in the
* outline.
*
* @input:
* control ::
* An intermediate control point between the last position and the new
* target in `to`.
*
* to ::
* A pointer to the target end point of the conic arc.
*
* user ::
* A typeless pointer, which is passed from the caller of the
* decomposition function.
*
* @return:
* Error code. 0~means success.
*/
2001-06-28 09:17:51 +02:00
typedef int
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be halved. * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default strength. Don't increase slot->advance.y. * include/freetype/freetype.h (FREETYPE_MINOR): Set to 2. (FREETYPE_PATCH): Set to 0. * builds/unix/configure.ac (version_info): Set to 9:9:3. Currently, we are still binary compatible. * builds/win32/visualc/index.html, builds/win32/visualc/freetype.dsp, builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): s/2.1.9/2.1.10/. * docs/CHANGES, docs/VERSION.DLL: Updated. * ChangeLog: Split off older entries into... * ChangeLog.20, ChangeLog.21: These new files. The next release will be 2.2.0, so don't worry about source code backwards compatibility. * include/freetype/ftimage.h (FT_Outline_MoveToFunc, FT_Outline_LineToFunc, FT_Outline_ConicToFunc, FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc), include/freetype/ftrender.h (FT_Glyph_TransformFunc, FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate parameters with `const' where appropriate. * src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY to make glyphs centered vertically. * src/truetype/ttgload.c (compute_glyph_metrics): Compute vertBearingY to make glyphs centered vertically. Fix some bugs in vertical metrics: . loader->pp3.y and loader->pp4.y are in 26.6 format, not in font units. . As we use the glyph's cbox to calculate the top bearing now there iss no need to adjust `top'. * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake. * docs/release: Update.
2005-06-16 21:07:08 +02:00
(*FT_Outline_ConicToFunc)( const FT_Vector* control,
const FT_Vector* to,
void* user );
1999-12-17 00:11:37 +01:00
2008-01-12 21:24:01 +01:00
#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc
1999-12-17 00:11:37 +01:00
/**************************************************************************
*
* @functype:
* FT_Outline_CubicToFunc
*
* @description:
* A function pointer type used to describe the signature of a 'cubic to'
* function during outline walking or decomposition.
*
* A 'cubic to' is emitted to indicate a third-order Bezier arc.
*
* @input:
* control1 ::
* A pointer to the first Bezier control point.
*
* control2 ::
* A pointer to the second Bezier control point.
*
* to ::
* A pointer to the target end point.
*
* user ::
* A typeless pointer, which is passed from the caller of the
* decomposition function.
*
* @return:
* Error code. 0~means success.
*/
2001-06-28 09:17:51 +02:00
typedef int
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be halved. * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default strength. Don't increase slot->advance.y. * include/freetype/freetype.h (FREETYPE_MINOR): Set to 2. (FREETYPE_PATCH): Set to 0. * builds/unix/configure.ac (version_info): Set to 9:9:3. Currently, we are still binary compatible. * builds/win32/visualc/index.html, builds/win32/visualc/freetype.dsp, builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): s/2.1.9/2.1.10/. * docs/CHANGES, docs/VERSION.DLL: Updated. * ChangeLog: Split off older entries into... * ChangeLog.20, ChangeLog.21: These new files. The next release will be 2.2.0, so don't worry about source code backwards compatibility. * include/freetype/ftimage.h (FT_Outline_MoveToFunc, FT_Outline_LineToFunc, FT_Outline_ConicToFunc, FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc), include/freetype/ftrender.h (FT_Glyph_TransformFunc, FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate parameters with `const' where appropriate. * src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY to make glyphs centered vertically. * src/truetype/ttgload.c (compute_glyph_metrics): Compute vertBearingY to make glyphs centered vertically. Fix some bugs in vertical metrics: . loader->pp3.y and loader->pp4.y are in 26.6 format, not in font units. . As we use the glyph's cbox to calculate the top bearing now there iss no need to adjust `top'. * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake. * docs/release: Update.
2005-06-16 21:07:08 +02:00
(*FT_Outline_CubicToFunc)( const FT_Vector* control1,
const FT_Vector* control2,
const FT_Vector* to,
void* user );
2008-01-12 21:24:01 +01:00
#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc
1999-12-17 00:11:37 +01:00
/**************************************************************************
*
* @struct:
* FT_Outline_Funcs
*
* @description:
* A structure to hold various function pointers used during outline
* decomposition in order to emit segments, conic, and cubic Beziers.
*
* @fields:
* move_to ::
* The 'move to' emitter.
*
* line_to ::
* The segment emitter.
*
* conic_to ::
* The second-order Bezier arc emitter.
*
* cubic_to ::
* The third-order Bezier arc emitter.
*
* shift ::
* The shift that is applied to coordinates before they are sent to the
* emitter.
*
* delta ::
* The delta that is applied to coordinates before they are sent to the
* emitter, but after the shift.
*
* @note:
* The point coordinates sent to the emitters are the transformed version
* of the original coordinates (this is important for high accuracy
* during scan-conversion). The transformation is simple:
*
* ```
* x' = (x << shift) - delta
* y' = (y << shift) - delta
* ```
*
* Set the values of `shift` and `delta` to~0 to get the original point
* coordinates.
*/
1999-12-17 00:11:37 +01:00
typedef struct FT_Outline_Funcs_
{
FT_Outline_MoveToFunc move_to;
FT_Outline_LineToFunc line_to;
FT_Outline_ConicToFunc conic_to;
FT_Outline_CubicToFunc cubic_to;
1999-12-17 00:11:37 +01:00
int shift;
FT_Pos delta;
1999-12-17 00:11:37 +01:00
} FT_Outline_Funcs;
/**************************************************************************
*
* @section:
* basic_types
*
*/
/**************************************************************************
*
* @macro:
* FT_IMAGE_TAG
*
* @description:
* This macro converts four-letter tags to an unsigned long type.
*
* @note:
* Since many 16-bit compilers don't like 32-bit enumerations, you should
* redefine this macro in case of problems to something like this:
*
* ```
* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value
* ```
*
* to get a simple enumeration without assigning special numbers.
*/
#ifndef FT_IMAGE_TAG
#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \
value = ( ( FT_STATIC_BYTE_CAST( unsigned long, _x1 ) << 24 ) | \
( FT_STATIC_BYTE_CAST( unsigned long, _x2 ) << 16 ) | \
( FT_STATIC_BYTE_CAST( unsigned long, _x3 ) << 8 ) | \
FT_STATIC_BYTE_CAST( unsigned long, _x4 ) )
#endif /* FT_IMAGE_TAG */
2000-07-10 16:24:26 +02:00
/**************************************************************************
*
* @enum:
* FT_Glyph_Format
*
* @description:
* An enumeration type used to describe the format of a given glyph
* image. Note that this version of FreeType only supports two image
* formats, even though future font drivers will be able to register
* their own format.
*
* @values:
* FT_GLYPH_FORMAT_NONE ::
* The value~0 is reserved.
*
* FT_GLYPH_FORMAT_COMPOSITE ::
* The glyph image is a composite of several other images. This format
* is _only_ used with @FT_LOAD_NO_RECURSE, and is used to report
* compound glyphs (like accented characters).
*
* FT_GLYPH_FORMAT_BITMAP ::
* The glyph image is a bitmap, and can be described as an @FT_Bitmap.
* You generally need to access the `bitmap` field of the
* @FT_GlyphSlotRec structure to read it.
*
* FT_GLYPH_FORMAT_OUTLINE ::
* The glyph image is a vectorial outline made of line segments and
* Bezier arcs; it can be described as an @FT_Outline; you generally
* want to access the `outline` field of the @FT_GlyphSlotRec structure
* to read it.
*
* FT_GLYPH_FORMAT_PLOTTER ::
* The glyph image is a vectorial path with no inside and outside
* contours. Some Type~1 fonts, like those in the Hershey family,
* contain glyphs in this format. These are described as @FT_Outline,
* but FreeType isn't currently capable of rendering them correctly.
Add code to load OT-SVG glyph documents. * include/freetype/config/ftheader.h (FT_OTSVG_H): New macro. * include/freetype/freetype.h (FT_FACE_FLAG_SVG, FT_HAS_SVG): New macros. (FT_LOAD_SVG_ONLY): New internal macro. * include/freetype/ftimage.h (FT_Glyph_Format): New enumeration value `FT_GLYPH_FORMAT_SVG`. * include/freetype/internal/ftobjs.h (FT_GLYPH_OWN_GZIP_SVG): New macro. * include/freetype/internal/fttrace.h: Add `ttsvg` for `ttsvg.c`. * include/freetype/internal/sfnt.h(load_svg, free_svg, load_svg_doc): New functions. * include/freetype/internal/tttypes.h (TT_FaceRec): Add `svg` for the SVG table. * include/freetype/otsvg.h (FT_SVG_DocumentRec): New structure to hold the SVG document and other necessary information of an OT-SVG glyph in a glyph slot. * include/freetype/tttags.h (TTAG_SVG): New macro. * src/base/ftobjs.c: Include `otsvg.h`. (ft_glyphslot_init): Allocate `FT_SVG_DocumentRec` in `slot->other` if the SVG table exists. (ft_glyphslot_clear): Free it upon clean-up if it is a GZIP compressed glyph. (ft_glyphslot_done): Free the document data if it is a GZIP compressed glyph. (FT_Load_Glyph): Don't auto-hint SVG documents. * src/cache/ftcbasic.c (ftc_basic_family_load_glyph): Add support for FT_GLYPH_FORMAT_SVG. * src/sfnt/rules.mk (SFNT_DRV_SRC): Add `ttsvg.c`. * src/sfnt/sfdriver.c: Include `ttsvg.h`. (sfnt_interface): Add `tt_face_load_svg`, `tt_face_free_svg` and `tt_face_load_svg_doc`. * src/sfnt/sfnt.c: Include `ttsvg.c`. * src/sfnt/sfobjs.c (sfnt_load_face, sfnt_done_face): Add code to load and free data of the the SVG table. * src/sfnt/ttsvg.c: New file, implementing `tt_face_load_svg`, `tt_face_free_svg` and `tt_face_load_svg_doc`. * src/sfnt/ttsvg.h: Declarations of the SVG functions in `ttsvg.c`.
2021-12-26 04:20:44 +01:00
*
* FT_GLYPH_FORMAT_SVG ::
* [Since 2.12] The glyph is represented by an SVG document in the
* 'SVG~' table.
*/
2000-07-10 16:24:26 +02:00
typedef enum FT_Glyph_Format_
1999-12-17 00:11:37 +01:00
{
FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),
FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),
FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ),
FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ),
Add code to load OT-SVG glyph documents. * include/freetype/config/ftheader.h (FT_OTSVG_H): New macro. * include/freetype/freetype.h (FT_FACE_FLAG_SVG, FT_HAS_SVG): New macros. (FT_LOAD_SVG_ONLY): New internal macro. * include/freetype/ftimage.h (FT_Glyph_Format): New enumeration value `FT_GLYPH_FORMAT_SVG`. * include/freetype/internal/ftobjs.h (FT_GLYPH_OWN_GZIP_SVG): New macro. * include/freetype/internal/fttrace.h: Add `ttsvg` for `ttsvg.c`. * include/freetype/internal/sfnt.h(load_svg, free_svg, load_svg_doc): New functions. * include/freetype/internal/tttypes.h (TT_FaceRec): Add `svg` for the SVG table. * include/freetype/otsvg.h (FT_SVG_DocumentRec): New structure to hold the SVG document and other necessary information of an OT-SVG glyph in a glyph slot. * include/freetype/tttags.h (TTAG_SVG): New macro. * src/base/ftobjs.c: Include `otsvg.h`. (ft_glyphslot_init): Allocate `FT_SVG_DocumentRec` in `slot->other` if the SVG table exists. (ft_glyphslot_clear): Free it upon clean-up if it is a GZIP compressed glyph. (ft_glyphslot_done): Free the document data if it is a GZIP compressed glyph. (FT_Load_Glyph): Don't auto-hint SVG documents. * src/cache/ftcbasic.c (ftc_basic_family_load_glyph): Add support for FT_GLYPH_FORMAT_SVG. * src/sfnt/rules.mk (SFNT_DRV_SRC): Add `ttsvg.c`. * src/sfnt/sfdriver.c: Include `ttsvg.h`. (sfnt_interface): Add `tt_face_load_svg`, `tt_face_free_svg` and `tt_face_load_svg_doc`. * src/sfnt/sfnt.c: Include `ttsvg.c`. * src/sfnt/sfobjs.c (sfnt_load_face, sfnt_done_face): Add code to load and free data of the the SVG table. * src/sfnt/ttsvg.c: New file, implementing `tt_face_load_svg`, `tt_face_free_svg` and `tt_face_load_svg_doc`. * src/sfnt/ttsvg.h: Declarations of the SVG functions in `ttsvg.c`.
2021-12-26 04:20:44 +01:00
FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ),
FT_IMAGE_TAG( FT_GLYPH_FORMAT_SVG, 'S', 'V', 'G', ' ' )
} FT_Glyph_Format;
/* these constants are deprecated; use the corresponding */
/* `FT_Glyph_Format` values instead. */
#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE
#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE
#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP
#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE
#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER
2000-07-10 16:24:26 +02:00
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/***** *****/
/***** R A S T E R D E F I N I T I O N S *****/
/***** *****/
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
1999-12-17 00:11:37 +01:00
2000-07-10 16:24:26 +02:00
/**************************************************************************
*
* @section:
* raster
*
* @title:
* Scanline Converter
*
* @abstract:
* How vectorial outlines are converted into bitmaps and pixmaps.
*
* @description:
2020-10-31 06:52:18 +01:00
* A raster or a rasterizer is a scan converter in charge of producing a
* pixel coverage bitmap that can be used as an alpha channel when
2020-10-31 04:03:12 +01:00
* compositing a glyph with a background. FreeType comes with two
* rasterizers: bilevel `raster1` and anti-aliased `smooth` are two
2020-10-31 06:52:18 +01:00
* separate modules. They are usually called from the high-level
* @FT_Load_Glyph or @FT_Render_Glyph functions and produce the entire
* coverage bitmap at once, while staying largely invisible to users.
*
* Instead of working with complete coverage bitmaps, it is also possible
* to intercept consecutive pixel runs on the same scanline with the same
* coverage, called _spans_, and process them individually. Only the
* `smooth` rasterizer permits this when calling @FT_Outline_Render with
* @FT_Raster_Params as described below.
*
* Working with either complete bitmaps or spans it is important to think
* of them as colorless coverage objects suitable as alpha channels to
* blend arbitrary colors with a background. For best results, it is
* recommended to use gamma correction, too.
*
* This section also describes the public API needed to set up alternative
2020-10-31 04:03:12 +01:00
* @FT_Renderer modules.
*
* @order:
* FT_Span
* FT_SpanFunc
* FT_Raster_Params
* FT_RASTER_FLAG_XXX
*
2020-10-31 04:03:12 +01:00
* FT_Raster
* FT_Raster_NewFunc
* FT_Raster_DoneFunc
* FT_Raster_ResetFunc
* FT_Raster_SetModeFunc
* FT_Raster_RenderFunc
* FT_Raster_Funcs
*
*/
/**************************************************************************
*
* @struct:
* FT_Span
*
* @description:
2020-10-31 06:52:18 +01:00
* A structure to model a single span of consecutive pixels when
* rendering an anti-aliased bitmap.
*
* @fields:
* x ::
* The span's horizontal start position.
*
* len ::
* The span's length in pixels.
*
* coverage ::
* The span color/coverage, ranging from 0 (background) to 255
* (foreground).
*
* @note:
* This structure is used by the span drawing callback type named
* @FT_SpanFunc that takes the y~coordinate of the span as a parameter.
*
2020-10-31 04:03:12 +01:00
* The anti-aliased rasterizer produces coverage values from 0 to 255,
2023-04-26 13:15:57 +02:00
* that is, from completely transparent to completely opaque.
*/
2000-07-10 16:24:26 +02:00
typedef struct FT_Span_
{
short x;
unsigned short len;
unsigned char coverage;
} FT_Span;
1999-12-17 00:11:37 +01:00
/**************************************************************************
*
* @functype:
* FT_SpanFunc
*
* @description:
* A function used as a call-back by the anti-aliased renderer in order
2020-10-31 04:03:12 +01:00
* to let client applications draw themselves the pixel spans on each
* scan line.
*
* @input:
* y ::
2019-06-20 04:29:55 +02:00
* The scanline's upward y~coordinate.
*
* count ::
* The number of spans to draw on this scanline.
*
* spans ::
* A table of `count` spans to draw on the scanline.
*
* user ::
* User-supplied data that is passed to the callback.
*
* @note:
2020-10-31 04:03:12 +01:00
* This callback allows client applications to directly render the spans
* of the anti-aliased bitmap to any kind of surfaces.
*
* This can be used to write anti-aliased outlines directly to a given
2020-10-31 04:03:12 +01:00
* background bitmap using alpha compositing. It can also be used for
* oversampling and averaging.
*/
2001-06-28 09:17:51 +02:00
typedef void
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be halved. * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default strength. Don't increase slot->advance.y. * include/freetype/freetype.h (FREETYPE_MINOR): Set to 2. (FREETYPE_PATCH): Set to 0. * builds/unix/configure.ac (version_info): Set to 9:9:3. Currently, we are still binary compatible. * builds/win32/visualc/index.html, builds/win32/visualc/freetype.dsp, builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): s/2.1.9/2.1.10/. * docs/CHANGES, docs/VERSION.DLL: Updated. * ChangeLog: Split off older entries into... * ChangeLog.20, ChangeLog.21: These new files. The next release will be 2.2.0, so don't worry about source code backwards compatibility. * include/freetype/ftimage.h (FT_Outline_MoveToFunc, FT_Outline_LineToFunc, FT_Outline_ConicToFunc, FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc), include/freetype/ftrender.h (FT_Glyph_TransformFunc, FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate parameters with `const' where appropriate. * src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY to make glyphs centered vertically. * src/truetype/ttgload.c (compute_glyph_metrics): Compute vertBearingY to make glyphs centered vertically. Fix some bugs in vertical metrics: . loader->pp3.y and loader->pp4.y are in 26.6 format, not in font units. . As we use the glyph's cbox to calculate the top bearing now there iss no need to adjust `top'. * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake. * docs/release: Update.
2005-06-16 21:07:08 +02:00
(*FT_SpanFunc)( int y,
int count,
const FT_Span* spans,
void* user );
2000-07-10 16:24:26 +02:00
#define FT_Raster_Span_Func FT_SpanFunc
/**************************************************************************
*
* @functype:
* FT_Raster_BitTest_Func
*
* @description:
* Deprecated, unimplemented.
*/
2001-06-28 09:17:51 +02:00
typedef int
(*FT_Raster_BitTest_Func)( int y,
int x,
void* user );
2000-07-10 16:24:26 +02:00
/**************************************************************************
*
* @functype:
* FT_Raster_BitSet_Func
*
* @description:
* Deprecated, unimplemented.
*/
2001-06-28 09:17:51 +02:00
typedef void
(*FT_Raster_BitSet_Func)( int y,
int x,
void* user );
2000-07-10 16:24:26 +02:00
/**************************************************************************
*
* @enum:
* FT_RASTER_FLAG_XXX
*
* @description:
* A list of bit flag constants as used in the `flags` field of a
* @FT_Raster_Params structure.
*
* @values:
* FT_RASTER_FLAG_DEFAULT ::
* This value is 0.
*
* FT_RASTER_FLAG_AA ::
* This flag is set to indicate that an anti-aliased glyph image should
* be generated. Otherwise, it will be monochrome (1-bit).
*
* FT_RASTER_FLAG_DIRECT ::
* This flag is set to indicate direct rendering. In this mode, client
* applications must provide their own span callback. This lets them
* directly draw or compose over an existing bitmap. If this bit is
2019-04-24 03:51:42 +02:00
* _not_ set, the target pixmap's buffer _must_ be zeroed before
* rendering and the output will be clipped to its size.
*
* Direct rendering is only possible with anti-aliased glyphs.
*
* FT_RASTER_FLAG_CLIP ::
* This flag is only used in direct rendering mode. If set, the output
* will be clipped to a box specified in the `clip_box` field of the
2019-04-24 03:51:42 +02:00
* @FT_Raster_Params structure. Otherwise, the `clip_box` is
* effectively set to the bounding box and all spans are generated.
*
* FT_RASTER_FLAG_SDF ::
* This flag is set to indicate that a signed distance field glyph
* image should be generated. This is only used while rendering with
* the @FT_RENDER_MODE_SDF render mode.
*/
#define FT_RASTER_FLAG_DEFAULT 0x0
#define FT_RASTER_FLAG_AA 0x1
#define FT_RASTER_FLAG_DIRECT 0x2
#define FT_RASTER_FLAG_CLIP 0x4
#define FT_RASTER_FLAG_SDF 0x8
/* these constants are deprecated; use the corresponding */
/* `FT_RASTER_FLAG_XXX` values instead */
#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT
#define ft_raster_flag_aa FT_RASTER_FLAG_AA
#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT
#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP
2000-07-10 16:24:26 +02:00
/**************************************************************************
*
* @struct:
* FT_Raster_Params
*
* @description:
2019-06-23 04:54:57 +02:00
* A structure to hold the parameters used by a raster's render function,
* passed as an argument to @FT_Outline_Render.
*
* @fields:
* target ::
* The target bitmap.
*
* source ::
* A pointer to the source glyph image (e.g., an @FT_Outline).
*
* flags ::
* The rendering flags.
*
* gray_spans ::
* The gray span drawing callback.
*
* black_spans ::
* Unused.
*
* bit_test ::
* Unused.
*
* bit_set ::
* Unused.
*
* user ::
* User-supplied data that is passed to each drawing callback.
*
* clip_box ::
2020-08-29 04:28:47 +02:00
* An optional span clipping box expressed in _integer_ pixels
* (not in 26.6 fixed-point units).
*
* @note:
2020-08-29 04:28:47 +02:00
* The @FT_RASTER_FLAG_AA bit flag must be set in the `flags` to
* generate an anti-aliased glyph bitmap, otherwise a monochrome bitmap
2020-10-10 12:48:18 +02:00
* is generated. The `target` should have appropriate pixel mode and its
2020-08-29 04:28:47 +02:00
* dimensions define the clipping region.
*
2020-10-12 03:56:50 +02:00
* If both @FT_RASTER_FLAG_AA and @FT_RASTER_FLAG_DIRECT bit flags
2020-10-10 12:48:18 +02:00
* are set in `flags`, the raster calls an @FT_SpanFunc callback
2020-08-29 04:28:47 +02:00
* `gray_spans` with `user` data as an argument ignoring `target`. This
* allows direct composition over a pre-existing user surface to perform
* the span drawing and composition. To optionally clip the spans, set
* the @FT_RASTER_FLAG_CLIP flag and `clip_box`. The monochrome raster
* does not support the direct mode.
*
* The gray-level rasterizer always uses 256 gray levels. If you want
* fewer gray levels, you have to use @FT_RASTER_FLAG_DIRECT and reduce
* the levels in the callback function.
*/
2000-07-10 16:24:26 +02:00
typedef struct FT_Raster_Params_
1999-12-17 00:11:37 +01:00
{
const FT_Bitmap* target;
const void* source;
int flags;
FT_SpanFunc gray_spans;
FT_SpanFunc black_spans; /* unused */
FT_Raster_BitTest_Func bit_test; /* unused */
FT_Raster_BitSet_Func bit_set; /* unused */
void* user;
FT_BBox clip_box;
} FT_Raster_Params;
2020-10-31 04:03:12 +01:00
/**************************************************************************
*
* @type:
* FT_Raster
*
* @description:
* An opaque handle (pointer) to a raster object. Each object can be
* used independently to convert an outline into a bitmap or pixmap.
*
* @note:
2020-10-31 04:03:12 +01:00
* In FreeType 2, all rasters are now encapsulated within specific
* @FT_Renderer modules and only used in their context.
*
*/
typedef struct FT_RasterRec_* FT_Raster;
/**************************************************************************
*
* @functype:
* FT_Raster_NewFunc
*
* @description:
* A function used to create a new raster object.
*
* @input:
* memory ::
* A handle to the memory allocator.
*
* @output:
* raster ::
* A handle to the new raster object.
*
* @return:
* Error code. 0~means success.
*
* @note:
* The `memory` parameter is a typeless pointer in order to avoid
* un-wanted dependencies on the rest of the FreeType code. In practice,
* it is an @FT_Memory object, i.e., a handle to the standard FreeType
* memory allocator. However, this field can be completely ignored by a
* given raster implementation.
*/
2001-06-28 09:17:51 +02:00
typedef int
(*FT_Raster_NewFunc)( void* memory,
FT_Raster* raster );
2000-07-10 16:24:26 +02:00
#define FT_Raster_New_Func FT_Raster_NewFunc
2000-07-10 16:24:26 +02:00
/**************************************************************************
*
* @functype:
* FT_Raster_DoneFunc
*
* @description:
* A function used to destroy a given raster object.
*
* @input:
* raster ::
* A handle to the raster object.
*/
2001-06-28 09:17:51 +02:00
typedef void
(*FT_Raster_DoneFunc)( FT_Raster raster );
#define FT_Raster_Done_Func FT_Raster_DoneFunc
/**************************************************************************
*
* @functype:
* FT_Raster_ResetFunc
*
* @description:
* FreeType used to provide an area of memory called the 'render pool'
* available to all registered rasterizers. This was not thread safe,
* however, and now FreeType never allocates this pool.
*
* This function is called after a new raster object is created.
*
* @input:
* raster ::
* A handle to the new raster object.
*
* pool_base ::
* Previously, the address in memory of the render pool. Set this to
2019-02-20 16:18:40 +01:00
* `NULL`.
*
* pool_size ::
* Previously, the size in bytes of the render pool. Set this to 0.
*
* @note:
* Rasterizers should rely on dynamic or stack allocation if they want to
* (a handle to the memory allocator is passed to the rasterizer
* constructor).
*/
2001-06-28 09:17:51 +02:00
typedef void
(*FT_Raster_ResetFunc)( FT_Raster raster,
unsigned char* pool_base,
unsigned long pool_size );
2000-07-10 16:24:26 +02:00
#define FT_Raster_Reset_Func FT_Raster_ResetFunc
2000-07-10 16:24:26 +02:00
/**************************************************************************
*
* @functype:
* FT_Raster_SetModeFunc
*
* @description:
* This function is a generic facility to change modes or attributes in a
* given raster. This can be used for debugging purposes, or simply to
* allow implementation-specific 'features' in a given raster module.
*
* @input:
* raster ::
* A handle to the new raster object.
*
* mode ::
* A 4-byte tag used to name the mode or property.
*
* args ::
* A pointer to the new mode/property to use.
*/
2001-06-28 09:17:51 +02:00
typedef int
(*FT_Raster_SetModeFunc)( FT_Raster raster,
unsigned long mode,
void* args );
2000-07-10 16:24:26 +02:00
2008-01-12 21:24:01 +01:00
#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc
2000-07-10 16:24:26 +02:00
/**************************************************************************
*
* @functype:
* FT_Raster_RenderFunc
*
* @description:
* Invoke a given raster to scan-convert a given glyph image into a
* target bitmap.
*
* @input:
* raster ::
* A handle to the raster object.
*
* params ::
* A pointer to an @FT_Raster_Params structure used to store the
* rendering parameters.
*
* @return:
* Error code. 0~means success.
*
* @note:
* The exact format of the source image depends on the raster's glyph
* format defined in its @FT_Raster_Funcs structure. It can be an
* @FT_Outline or anything else in order to support a large array of
* glyph formats.
*
* Note also that the render function can fail and return a
* `FT_Err_Unimplemented_Feature` error code if the raster used does not
* support direct composition.
*/
2001-06-28 09:17:51 +02:00
typedef int
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be halved. * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default strength. Don't increase slot->advance.y. * include/freetype/freetype.h (FREETYPE_MINOR): Set to 2. (FREETYPE_PATCH): Set to 0. * builds/unix/configure.ac (version_info): Set to 9:9:3. Currently, we are still binary compatible. * builds/win32/visualc/index.html, builds/win32/visualc/freetype.dsp, builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): s/2.1.9/2.1.10/. * docs/CHANGES, docs/VERSION.DLL: Updated. * ChangeLog: Split off older entries into... * ChangeLog.20, ChangeLog.21: These new files. The next release will be 2.2.0, so don't worry about source code backwards compatibility. * include/freetype/ftimage.h (FT_Outline_MoveToFunc, FT_Outline_LineToFunc, FT_Outline_ConicToFunc, FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc), include/freetype/ftrender.h (FT_Glyph_TransformFunc, FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate parameters with `const' where appropriate. * src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY to make glyphs centered vertically. * src/truetype/ttgload.c (compute_glyph_metrics): Compute vertBearingY to make glyphs centered vertically. Fix some bugs in vertical metrics: . loader->pp3.y and loader->pp4.y are in 26.6 format, not in font units. . As we use the glyph's cbox to calculate the top bearing now there iss no need to adjust `top'. * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake. * docs/release: Update.
2005-06-16 21:07:08 +02:00
(*FT_Raster_RenderFunc)( FT_Raster raster,
const FT_Raster_Params* params );
#define FT_Raster_Render_Func FT_Raster_RenderFunc
/**************************************************************************
*
* @struct:
* FT_Raster_Funcs
*
* @description:
* A structure used to describe a given raster class to the library.
*
* @fields:
* glyph_format ::
* The supported glyph format for this raster.
*
* raster_new ::
* The raster constructor.
*
* raster_reset ::
* Used to reset the render pool within the raster.
*
* raster_render ::
* A function to render a glyph into a given bitmap.
*
* raster_done ::
* The raster destructor.
*/
2000-07-10 16:24:26 +02:00
typedef struct FT_Raster_Funcs_
{
FT_Glyph_Format glyph_format;
FT_Raster_NewFunc raster_new;
FT_Raster_ResetFunc raster_reset;
FT_Raster_SetModeFunc raster_set_mode;
FT_Raster_RenderFunc raster_render;
FT_Raster_DoneFunc raster_done;
} FT_Raster_Funcs;
/* */
FT_END_HEADER
#endif /* FTIMAGE_H_ */
1999-12-17 00:11:37 +01:00
2000-07-10 16:24:26 +02:00
/* END */
/* Local Variables: */
/* coding: utf-8 */
/* End: */