QtBase  v6.3.1
ftoutln.h
Go to the documentation of this file.
1 /****************************************************************************
2  *
3  * ftoutln.h
4  *
5  * Support for the FT_Outline type used to store glyph shapes of
6  * most scalable font formats (specification).
7  *
8  * Copyright (C) 1996-2020 by
9  * David Turner, Robert Wilhelm, and Werner Lemberg.
10  *
11  * This file is part of the FreeType project, and may only be used,
12  * modified, and distributed under the terms of the FreeType project
13  * license, LICENSE.TXT. By continuing to use, modify, or distribute
14  * this file you indicate that you have read the license and
15  * understand and accept it fully.
16  *
17  */
18 
19 
20 #ifndef FTOUTLN_H_
21 #define FTOUTLN_H_
22 
23 
24 #include <freetype/freetype.h>
25 
26 #ifdef FREETYPE_H
27 #error "freetype.h of FreeType 1 has been loaded!"
28 #error "Please fix the directory search order for header files"
29 #error "so that freetype.h of FreeType 2 is found first."
30 #endif
31 
32 
34 
35 
36  /**************************************************************************
37  *
38  * @section:
39  * outline_processing
40  *
41  * @title:
42  * Outline Processing
43  *
44  * @abstract:
45  * Functions to create, transform, and render vectorial glyph images.
46  *
47  * @description:
48  * This section contains routines used to create and destroy scalable
49  * glyph images known as 'outlines'. These can also be measured,
50  * transformed, and converted into bitmaps and pixmaps.
51  *
52  * @order:
53  * FT_Outline
54  * FT_Outline_New
55  * FT_Outline_Done
56  * FT_Outline_Copy
57  * FT_Outline_Translate
58  * FT_Outline_Transform
59  * FT_Outline_Embolden
60  * FT_Outline_EmboldenXY
61  * FT_Outline_Reverse
62  * FT_Outline_Check
63  *
64  * FT_Outline_Get_CBox
65  * FT_Outline_Get_BBox
66  *
67  * FT_Outline_Get_Bitmap
68  * FT_Outline_Render
69  * FT_Outline_Decompose
70  * FT_Outline_Funcs
71  * FT_Outline_MoveToFunc
72  * FT_Outline_LineToFunc
73  * FT_Outline_ConicToFunc
74  * FT_Outline_CubicToFunc
75  *
76  * FT_Orientation
77  * FT_Outline_Get_Orientation
78  *
79  * FT_OUTLINE_XXX
80  *
81  */
82 
83 
84  /**************************************************************************
85  *
86  * @function:
87  * FT_Outline_Decompose
88  *
89  * @description:
90  * Walk over an outline's structure to decompose it into individual
91  * segments and Bezier arcs. This function also emits 'move to'
92  * operations to indicate the start of new contours in the outline.
93  *
94  * @input:
95  * outline ::
96  * A pointer to the source target.
97  *
98  * func_interface ::
99  * A table of 'emitters', i.e., function pointers called during
100  * decomposition to indicate path operations.
101  *
102  * @inout:
103  * user ::
104  * A typeless pointer that is passed to each emitter during the
105  * decomposition. It can be used to store the state during the
106  * decomposition.
107  *
108  * @return:
109  * FreeType error code. 0~means success.
110  *
111  * @note:
112  * A contour that contains a single point only is represented by a 'move
113  * to' operation followed by 'line to' to the same point. In most cases,
114  * it is best to filter this out before using the outline for stroking
115  * purposes (otherwise it would result in a visible dot when round caps
116  * are used).
117  *
118  * Similarly, the function returns success for an empty outline also
119  * (doing nothing, this is, not calling any emitter); if necessary, you
120  * should filter this out, too.
121  */
124  const FT_Outline_Funcs* func_interface,
125  void* user );
126 
127 
128  /**************************************************************************
129  *
130  * @function:
131  * FT_Outline_New
132  *
133  * @description:
134  * Create a new outline of a given size.
135  *
136  * @input:
137  * library ::
138  * A handle to the library object from where the outline is allocated.
139  * Note however that the new outline will **not** necessarily be
140  * **freed**, when destroying the library, by @FT_Done_FreeType.
141  *
142  * numPoints ::
143  * The maximum number of points within the outline. Must be smaller
144  * than or equal to 0xFFFF (65535).
145  *
146  * numContours ::
147  * The maximum number of contours within the outline. This value must
148  * be in the range 0 to `numPoints`.
149  *
150  * @output:
151  * anoutline ::
152  * A handle to the new outline.
153  *
154  * @return:
155  * FreeType error code. 0~means success.
156  *
157  * @note:
158  * The reason why this function takes a `library` parameter is simply to
159  * use the library's memory allocator.
160  */
163  FT_UInt numPoints,
164  FT_Int numContours,
165  FT_Outline *anoutline );
166 
167 
168  /**************************************************************************
169  *
170  * @function:
171  * FT_Outline_Done
172  *
173  * @description:
174  * Destroy an outline created with @FT_Outline_New.
175  *
176  * @input:
177  * library ::
178  * A handle of the library object used to allocate the outline.
179  *
180  * outline ::
181  * A pointer to the outline object to be discarded.
182  *
183  * @return:
184  * FreeType error code. 0~means success.
185  *
186  * @note:
187  * If the outline's 'owner' field is not set, only the outline descriptor
188  * will be released.
189  */
192  FT_Outline* outline );
193 
194 
195  /**************************************************************************
196  *
197  * @function:
198  * FT_Outline_Check
199  *
200  * @description:
201  * Check the contents of an outline descriptor.
202  *
203  * @input:
204  * outline ::
205  * A handle to a source outline.
206  *
207  * @return:
208  * FreeType error code. 0~means success.
209  *
210  * @note:
211  * An empty outline, or an outline with a single point only is also
212  * valid.
213  */
215  FT_Outline_Check( FT_Outline* outline );
216 
217 
218  /**************************************************************************
219  *
220  * @function:
221  * FT_Outline_Get_CBox
222  *
223  * @description:
224  * Return an outline's 'control box'. The control box encloses all the
225  * outline's points, including Bezier control points. Though it
226  * coincides with the exact bounding box for most glyphs, it can be
227  * slightly larger in some situations (like when rotating an outline that
228  * contains Bezier outside arcs).
229  *
230  * Computing the control box is very fast, while getting the bounding box
231  * can take much more time as it needs to walk over all segments and arcs
232  * in the outline. To get the latter, you can use the 'ftbbox'
233  * component, which is dedicated to this single task.
234  *
235  * @input:
236  * outline ::
237  * A pointer to the source outline descriptor.
238  *
239  * @output:
240  * acbox ::
241  * The outline's control box.
242  *
243  * @note:
244  * See @FT_Glyph_Get_CBox for a discussion of tricky fonts.
245  */
246  FT_EXPORT( void )
247  FT_Outline_Get_CBox( const FT_Outline* outline,
248  FT_BBox *acbox );
249 
250 
251  /**************************************************************************
252  *
253  * @function:
254  * FT_Outline_Translate
255  *
256  * @description:
257  * Apply a simple translation to the points of an outline.
258  *
259  * @inout:
260  * outline ::
261  * A pointer to the target outline descriptor.
262  *
263  * @input:
264  * xOffset ::
265  * The horizontal offset.
266  *
267  * yOffset ::
268  * The vertical offset.
269  */
270  FT_EXPORT( void )
271  FT_Outline_Translate( const FT_Outline* outline,
272  FT_Pos xOffset,
273  FT_Pos yOffset );
274 
275 
276  /**************************************************************************
277  *
278  * @function:
279  * FT_Outline_Copy
280  *
281  * @description:
282  * Copy an outline into another one. Both objects must have the same
283  * sizes (number of points & number of contours) when this function is
284  * called.
285  *
286  * @input:
287  * source ::
288  * A handle to the source outline.
289  *
290  * @output:
291  * target ::
292  * A handle to the target outline.
293  *
294  * @return:
295  * FreeType error code. 0~means success.
296  */
299  FT_Outline *target );
300 
301 
302  /**************************************************************************
303  *
304  * @function:
305  * FT_Outline_Transform
306  *
307  * @description:
308  * Apply a simple 2x2 matrix to all of an outline's points. Useful for
309  * applying rotations, slanting, flipping, etc.
310  *
311  * @inout:
312  * outline ::
313  * A pointer to the target outline descriptor.
314  *
315  * @input:
316  * matrix ::
317  * A pointer to the transformation matrix.
318  *
319  * @note:
320  * You can use @FT_Outline_Translate if you need to translate the
321  * outline's points.
322  */
323  FT_EXPORT( void )
324  FT_Outline_Transform( const FT_Outline* outline,
325  const FT_Matrix* matrix );
326 
327 
328  /**************************************************************************
329  *
330  * @function:
331  * FT_Outline_Embolden
332  *
333  * @description:
334  * Embolden an outline. The new outline will be at most 4~times
335  * `strength` pixels wider and higher. You may think of the left and
336  * bottom borders as unchanged.
337  *
338  * Negative `strength` values to reduce the outline thickness are
339  * possible also.
340  *
341  * @inout:
342  * outline ::
343  * A handle to the target outline.
344  *
345  * @input:
346  * strength ::
347  * How strong the glyph is emboldened. Expressed in 26.6 pixel format.
348  *
349  * @return:
350  * FreeType error code. 0~means success.
351  *
352  * @note:
353  * The used algorithm to increase or decrease the thickness of the glyph
354  * doesn't change the number of points; this means that certain
355  * situations like acute angles or intersections are sometimes handled
356  * incorrectly.
357  *
358  * If you need 'better' metrics values you should call
359  * @FT_Outline_Get_CBox or @FT_Outline_Get_BBox.
360  *
361  * To get meaningful results, font scaling values must be set with
362  * functions like @FT_Set_Char_Size before calling FT_Render_Glyph.
363  *
364  * @example:
365  * ```
366  * FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );
367  *
368  * if ( face->glyph->format == FT_GLYPH_FORMAT_OUTLINE )
369  * FT_Outline_Embolden( &face->glyph->outline, strength );
370  * ```
371  *
372  */
375  FT_Pos strength );
376 
377 
378  /**************************************************************************
379  *
380  * @function:
381  * FT_Outline_EmboldenXY
382  *
383  * @description:
384  * Embolden an outline. The new outline will be `xstrength` pixels wider
385  * and `ystrength` pixels higher. Otherwise, it is similar to
386  * @FT_Outline_Embolden, which uses the same strength in both directions.
387  *
388  * @since:
389  * 2.4.10
390  */
393  FT_Pos xstrength,
394  FT_Pos ystrength );
395 
396 
397  /**************************************************************************
398  *
399  * @function:
400  * FT_Outline_Reverse
401  *
402  * @description:
403  * Reverse the drawing direction of an outline. This is used to ensure
404  * consistent fill conventions for mirrored glyphs.
405  *
406  * @inout:
407  * outline ::
408  * A pointer to the target outline descriptor.
409  *
410  * @note:
411  * This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in the
412  * outline's `flags` field.
413  *
414  * It shouldn't be used by a normal client application, unless it knows
415  * what it is doing.
416  */
417  FT_EXPORT( void )
418  FT_Outline_Reverse( FT_Outline* outline );
419 
420 
421  /**************************************************************************
422  *
423  * @function:
424  * FT_Outline_Get_Bitmap
425  *
426  * @description:
427  * Render an outline within a bitmap. The outline's image is simply
428  * OR-ed to the target bitmap.
429  *
430  * @input:
431  * library ::
432  * A handle to a FreeType library object.
433  *
434  * outline ::
435  * A pointer to the source outline descriptor.
436  *
437  * @inout:
438  * abitmap ::
439  * A pointer to the target bitmap descriptor.
440  *
441  * @return:
442  * FreeType error code. 0~means success.
443  *
444  * @note:
445  * This function does **not create** the bitmap, it only renders an
446  * outline image within the one you pass to it! Consequently, the
447  * various fields in `abitmap` should be set accordingly.
448  *
449  * It will use the raster corresponding to the default glyph format.
450  *
451  * The value of the `num_grays` field in `abitmap` is ignored. If you
452  * select the gray-level rasterizer, and you want less than 256 gray
453  * levels, you have to use @FT_Outline_Render directly.
454  */
457  FT_Outline* outline,
458  const FT_Bitmap *abitmap );
459 
460 
461  /**************************************************************************
462  *
463  * @function:
464  * FT_Outline_Render
465  *
466  * @description:
467  * Render an outline within a bitmap using the current scan-convert.
468  *
469  * @input:
470  * library ::
471  * A handle to a FreeType library object.
472  *
473  * outline ::
474  * A pointer to the source outline descriptor.
475  *
476  * @inout:
477  * params ::
478  * A pointer to an @FT_Raster_Params structure used to describe the
479  * rendering operation.
480  *
481  * @return:
482  * FreeType error code. 0~means success.
483  *
484  * @note:
485  * This advanced function uses @FT_Raster_Params as an argument.
486  * The field `params.source` will be set to `outline` before the scan
487  * converter is called, which means that the value you give to it is
488  * actually ignored. Either `params.target` must point to preallocated
489  * bitmap, or @FT_RASTER_FLAG_DIRECT must be set in `params.flags`
490  * allowing FreeType rasterizer to be used for direct composition,
491  * translucency, etc. See @FT_Raster_Params for more details.
492  */
495  FT_Outline* outline,
497 
498 
499  /**************************************************************************
500  *
501  * @enum:
502  * FT_Orientation
503  *
504  * @description:
505  * A list of values used to describe an outline's contour orientation.
506  *
507  * The TrueType and PostScript specifications use different conventions
508  * to determine whether outline contours should be filled or unfilled.
509  *
510  * @values:
511  * FT_ORIENTATION_TRUETYPE ::
512  * According to the TrueType specification, clockwise contours must be
513  * filled, and counter-clockwise ones must be unfilled.
514  *
515  * FT_ORIENTATION_POSTSCRIPT ::
516  * According to the PostScript specification, counter-clockwise
517  * contours must be filled, and clockwise ones must be unfilled.
518  *
519  * FT_ORIENTATION_FILL_RIGHT ::
520  * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to
521  * remember that in TrueType, everything that is to the right of the
522  * drawing direction of a contour must be filled.
523  *
524  * FT_ORIENTATION_FILL_LEFT ::
525  * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to
526  * remember that in PostScript, everything that is to the left of the
527  * drawing direction of a contour must be filled.
528  *
529  * FT_ORIENTATION_NONE ::
530  * The orientation cannot be determined. That is, different parts of
531  * the glyph have different orientation.
532  *
533  */
534  typedef enum FT_Orientation_
535  {
541 
543 
544 
545  /**************************************************************************
546  *
547  * @function:
548  * FT_Outline_Get_Orientation
549  *
550  * @description:
551  * This function analyzes a glyph outline and tries to compute its fill
552  * orientation (see @FT_Orientation). This is done by integrating the
553  * total area covered by the outline. The positive integral corresponds
554  * to the clockwise orientation and @FT_ORIENTATION_POSTSCRIPT is
555  * returned. The negative integral corresponds to the counter-clockwise
556  * orientation and @FT_ORIENTATION_TRUETYPE is returned.
557  *
558  * Note that this will return @FT_ORIENTATION_TRUETYPE for empty
559  * outlines.
560  *
561  * @input:
562  * outline ::
563  * A handle to the source outline.
564  *
565  * @return:
566  * The orientation.
567  *
568  */
571 
572 
573  /* */
574 
575 
577 
578 #endif /* FTOUTLN_H_ */
579 
580 
581 /* END */
582 
583 
584 /* Local Variables: */
585 /* coding: utf-8 */
586 /* End: */
FT_Library library
Definition: cffdrivr.c:660
#define FT_END_HEADER
Definition: ftheader.h:57
#define FT_BEGIN_HEADER
Definition: ftheader.h:37
FT_BEGIN_HEADER typedef signed long FT_Pos
Definition: ftimage.h:57
FT_Outline_Check(FT_Outline *outline)
Definition: ftoutln.c:341
FT_Outline_EmboldenXY(FT_Outline *outline, FT_Pos xstrength, FT_Pos ystrength)
Definition: ftoutln.c:904
FT_Orientation_
Definition: ftoutln.h:535
@ FT_ORIENTATION_FILL_RIGHT
Definition: ftoutln.h:538
@ FT_ORIENTATION_NONE
Definition: ftoutln.h:540
@ FT_ORIENTATION_POSTSCRIPT
Definition: ftoutln.h:537
@ FT_ORIENTATION_FILL_LEFT
Definition: ftoutln.h:539
@ FT_ORIENTATION_TRUETYPE
Definition: ftoutln.h:536
FT_Outline_Reverse(FT_Outline *outline)
Definition: ftoutln.c:532
FT_Outline_Translate(const FT_Outline *outline, FT_Pos xOffset, FT_Pos yOffset)
Definition: ftoutln.c:507
FT_Outline_Get_Bitmap(FT_Library library, FT_Outline *outline, const FT_Bitmap *abitmap)
Definition: ftoutln.c:656
FT_Outline_Get_Orientation(FT_Outline *outline)
Definition: ftoutln.c:1039
enum FT_Orientation_ FT_Orientation
FT_Outline_New(FT_Library library, FT_UInt numPoints, FT_Int numContours, FT_Outline *anoutline)
Definition: ftoutln.c:293
FT_Outline_Embolden(FT_Outline *outline, FT_Pos strength)
Definition: ftoutln.c:894
FT_Outline_Transform(const FT_Outline *outline, const FT_Matrix *matrix)
Definition: ftoutln.c:706
FT_BEGIN_HEADER FT_Outline_Decompose(FT_Outline *outline, const FT_Outline_Funcs *func_interface, void *user)
Definition: ftoutln.c:43
FT_Outline_Done(FT_Library library, FT_Outline *outline)
Definition: ftoutln.c:425
FT_Outline_Render(FT_Library library, FT_Outline *outline, FT_Raster_Params *params)
Definition: ftoutln.c:593
FT_Outline_Copy(const FT_Outline *source, FT_Outline *target)
Definition: ftoutln.c:386
FT_Outline_Get_CBox(const FT_Outline *outline, FT_BBox *acbox)
Definition: ftoutln.c:457
int FT_Error
Definition: fttypes.h:299
unsigned int FT_UInt
Definition: fttypes.h:231
signed int FT_Int
Definition: fttypes.h:220
#define FT_EXPORT(x)
GLenum target
GLsizei GLsizei GLchar * source
void ** params
GLuint GLenum matrix
Definition: qopenglext.h:11564