• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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-2023 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 
33 FT_BEGIN_HEADER
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    *   Degenerate contours, segments, and Bezier arcs may be reported.  In
113    *   most cases, it is best to filter these out before using the outline
114    *   for stroking or other path modification purposes (which may cause
115    *   degenerate segments to become non-degenrate and visible, like when
116    *   stroke caps are used or the path is otherwise outset).  Some glyph
117    *   outlines may contain deliberate degenerate single points for mark
118    *   attachement.
119    *
120    *   Similarly, the function returns success for an empty outline also
121    *   (doing nothing, that is, not calling any emitter); if necessary, you
122    *   should filter this out, too.
123    */
124   FT_EXPORT( FT_Error )
125   FT_Outline_Decompose( FT_Outline*              outline,
126                         const FT_Outline_Funcs*  func_interface,
127                         void*                    user );
128 
129 
130   /**************************************************************************
131    *
132    * @function:
133    *   FT_Outline_New
134    *
135    * @description:
136    *   Create a new outline of a given size.
137    *
138    * @input:
139    *   library ::
140    *     A handle to the library object from where the outline is allocated.
141    *     Note however that the new outline will **not** necessarily be
142    *     **freed**, when destroying the library, by @FT_Done_FreeType.
143    *
144    *   numPoints ::
145    *     The maximum number of points within the outline.  Must be smaller
146    *     than or equal to 0xFFFF (65535).
147    *
148    *   numContours ::
149    *     The maximum number of contours within the outline.  This value must
150    *     be in the range 0 to `numPoints`.
151    *
152    * @output:
153    *   anoutline ::
154    *     A handle to the new outline.
155    *
156    * @return:
157    *   FreeType error code.  0~means success.
158    *
159    * @note:
160    *   The reason why this function takes a `library` parameter is simply to
161    *   use the library's memory allocator.
162    */
163   FT_EXPORT( FT_Error )
164   FT_Outline_New( FT_Library   library,
165                   FT_UInt      numPoints,
166                   FT_Int       numContours,
167                   FT_Outline  *anoutline );
168 
169 
170   /**************************************************************************
171    *
172    * @function:
173    *   FT_Outline_Done
174    *
175    * @description:
176    *   Destroy an outline created with @FT_Outline_New.
177    *
178    * @input:
179    *   library ::
180    *     A handle of the library object used to allocate the outline.
181    *
182    *   outline ::
183    *     A pointer to the outline object to be discarded.
184    *
185    * @return:
186    *   FreeType error code.  0~means success.
187    *
188    * @note:
189    *   If the outline's 'owner' field is not set, only the outline descriptor
190    *   will be released.
191    */
192   FT_EXPORT( FT_Error )
193   FT_Outline_Done( FT_Library   library,
194                    FT_Outline*  outline );
195 
196 
197   /**************************************************************************
198    *
199    * @function:
200    *   FT_Outline_Check
201    *
202    * @description:
203    *   Check the contents of an outline descriptor.
204    *
205    * @input:
206    *   outline ::
207    *     A handle to a source outline.
208    *
209    * @return:
210    *   FreeType error code.  0~means success.
211    *
212    * @note:
213    *   An empty outline, or an outline with a single point only is also
214    *   valid.
215    */
216   FT_EXPORT( FT_Error )
217   FT_Outline_Check( FT_Outline*  outline );
218 
219 
220   /**************************************************************************
221    *
222    * @function:
223    *   FT_Outline_Get_CBox
224    *
225    * @description:
226    *   Return an outline's 'control box'.  The control box encloses all the
227    *   outline's points, including Bezier control points.  Though it
228    *   coincides with the exact bounding box for most glyphs, it can be
229    *   slightly larger in some situations (like when rotating an outline that
230    *   contains Bezier outside arcs).
231    *
232    *   Computing the control box is very fast, while getting the bounding box
233    *   can take much more time as it needs to walk over all segments and arcs
234    *   in the outline.  To get the latter, you can use the 'ftbbox'
235    *   component, which is dedicated to this single task.
236    *
237    * @input:
238    *   outline ::
239    *     A pointer to the source outline descriptor.
240    *
241    * @output:
242    *   acbox ::
243    *     The outline's control box.
244    *
245    * @note:
246    *   See @FT_Glyph_Get_CBox for a discussion of tricky fonts.
247    */
248   FT_EXPORT( void )
249   FT_Outline_Get_CBox( const FT_Outline*  outline,
250                        FT_BBox           *acbox );
251 
252 
253   /**************************************************************************
254    *
255    * @function:
256    *   FT_Outline_Translate
257    *
258    * @description:
259    *   Apply a simple translation to the points of an outline.
260    *
261    * @inout:
262    *   outline ::
263    *     A pointer to the target outline descriptor.
264    *
265    * @input:
266    *   xOffset ::
267    *     The horizontal offset.
268    *
269    *   yOffset ::
270    *     The vertical offset.
271    */
272   FT_EXPORT( void )
273   FT_Outline_Translate( const FT_Outline*  outline,
274                         FT_Pos             xOffset,
275                         FT_Pos             yOffset );
276 
277 
278   /**************************************************************************
279    *
280    * @function:
281    *   FT_Outline_Copy
282    *
283    * @description:
284    *   Copy an outline into another one.  Both objects must have the same
285    *   sizes (number of points & number of contours) when this function is
286    *   called.
287    *
288    * @input:
289    *   source ::
290    *     A handle to the source outline.
291    *
292    * @output:
293    *   target ::
294    *     A handle to the target outline.
295    *
296    * @return:
297    *   FreeType error code.  0~means success.
298    */
299   FT_EXPORT( FT_Error )
300   FT_Outline_Copy( const FT_Outline*  source,
301                    FT_Outline        *target );
302 
303 
304   /**************************************************************************
305    *
306    * @function:
307    *   FT_Outline_Transform
308    *
309    * @description:
310    *   Apply a simple 2x2 matrix to all of an outline's points.  Useful for
311    *   applying rotations, slanting, flipping, etc.
312    *
313    * @inout:
314    *   outline ::
315    *     A pointer to the target outline descriptor.
316    *
317    * @input:
318    *   matrix ::
319    *     A pointer to the transformation matrix.
320    *
321    * @note:
322    *   You can use @FT_Outline_Translate if you need to translate the
323    *   outline's points.
324    */
325   FT_EXPORT( void )
326   FT_Outline_Transform( const FT_Outline*  outline,
327                         const FT_Matrix*   matrix );
328 
329 
330   /**************************************************************************
331    *
332    * @function:
333    *   FT_Outline_Embolden
334    *
335    * @description:
336    *   Embolden an outline.  The new outline will be at most 4~times
337    *   `strength` pixels wider and higher.  You may think of the left and
338    *   bottom borders as unchanged.
339    *
340    *   Negative `strength` values to reduce the outline thickness are
341    *   possible also.
342    *
343    * @inout:
344    *   outline ::
345    *     A handle to the target outline.
346    *
347    * @input:
348    *   strength ::
349    *     How strong the glyph is emboldened.  Expressed in 26.6 pixel format.
350    *
351    * @return:
352    *   FreeType error code.  0~means success.
353    *
354    * @note:
355    *   The used algorithm to increase or decrease the thickness of the glyph
356    *   doesn't change the number of points; this means that certain
357    *   situations like acute angles or intersections are sometimes handled
358    *   incorrectly.
359    *
360    *   If you need 'better' metrics values you should call
361    *   @FT_Outline_Get_CBox or @FT_Outline_Get_BBox.
362    *
363    *   To get meaningful results, font scaling values must be set with
364    *   functions like @FT_Set_Char_Size before calling FT_Render_Glyph.
365    *
366    * @example:
367    *   ```
368    *     FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );
369    *
370    *     if ( face->glyph->format == FT_GLYPH_FORMAT_OUTLINE )
371    *       FT_Outline_Embolden( &face->glyph->outline, strength );
372    *   ```
373    *
374    */
375   FT_EXPORT( FT_Error )
376   FT_Outline_Embolden( FT_Outline*  outline,
377                        FT_Pos       strength );
378 
379 
380   /**************************************************************************
381    *
382    * @function:
383    *   FT_Outline_EmboldenXY
384    *
385    * @description:
386    *   Embolden an outline.  The new outline will be `xstrength` pixels wider
387    *   and `ystrength` pixels higher.  Otherwise, it is similar to
388    *   @FT_Outline_Embolden, which uses the same strength in both directions.
389    *
390    * @since:
391    *   2.4.10
392    */
393   FT_EXPORT( FT_Error )
394   FT_Outline_EmboldenXY( FT_Outline*  outline,
395                          FT_Pos       xstrength,
396                          FT_Pos       ystrength );
397 
398 
399   /**************************************************************************
400    *
401    * @function:
402    *   FT_Outline_Reverse
403    *
404    * @description:
405    *   Reverse the drawing direction of an outline.  This is used to ensure
406    *   consistent fill conventions for mirrored glyphs.
407    *
408    * @inout:
409    *   outline ::
410    *     A pointer to the target outline descriptor.
411    *
412    * @note:
413    *   This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in the
414    *   outline's `flags` field.
415    *
416    *   It shouldn't be used by a normal client application, unless it knows
417    *   what it is doing.
418    */
419   FT_EXPORT( void )
420   FT_Outline_Reverse( FT_Outline*  outline );
421 
422 
423   /**************************************************************************
424    *
425    * @function:
426    *   FT_Outline_Get_Bitmap
427    *
428    * @description:
429    *   Render an outline within a bitmap.  The outline's image is simply
430    *   OR-ed to the target bitmap.
431    *
432    * @input:
433    *   library ::
434    *     A handle to a FreeType library object.
435    *
436    *   outline ::
437    *     A pointer to the source outline descriptor.
438    *
439    * @inout:
440    *   abitmap ::
441    *     A pointer to the target bitmap descriptor.
442    *
443    * @return:
444    *   FreeType error code.  0~means success.
445    *
446    * @note:
447    *   This function does **not create** the bitmap, it only renders an
448    *   outline image within the one you pass to it!  Consequently, the
449    *   various fields in `abitmap` should be set accordingly.
450    *
451    *   It will use the raster corresponding to the default glyph format.
452    *
453    *   The value of the `num_grays` field in `abitmap` is ignored.  If you
454    *   select the gray-level rasterizer, and you want less than 256 gray
455    *   levels, you have to use @FT_Outline_Render directly.
456    */
457   FT_EXPORT( FT_Error )
458   FT_Outline_Get_Bitmap( FT_Library        library,
459                          FT_Outline*       outline,
460                          const FT_Bitmap  *abitmap );
461 
462 
463   /**************************************************************************
464    *
465    * @function:
466    *   FT_Outline_Render
467    *
468    * @description:
469    *   Render an outline within a bitmap using the current scan-convert.
470    *
471    * @input:
472    *   library ::
473    *     A handle to a FreeType library object.
474    *
475    *   outline ::
476    *     A pointer to the source outline descriptor.
477    *
478    * @inout:
479    *   params ::
480    *     A pointer to an @FT_Raster_Params structure used to describe the
481    *     rendering operation.
482    *
483    * @return:
484    *   FreeType error code.  0~means success.
485    *
486    * @note:
487    *   This advanced function uses @FT_Raster_Params as an argument.
488    *   The field `params.source` will be set to `outline` before the scan
489    *   converter is called, which means that the value you give to it is
490    *   actually ignored.  Either `params.target` must point to preallocated
491    *   bitmap, or @FT_RASTER_FLAG_DIRECT must be set in `params.flags`
492    *   allowing FreeType rasterizer to be used for direct composition,
493    *   translucency, etc.  See @FT_Raster_Params for more details.
494    */
495   FT_EXPORT( FT_Error )
496   FT_Outline_Render( FT_Library         library,
497                      FT_Outline*        outline,
498                      FT_Raster_Params*  params );
499 
500 
501   /**************************************************************************
502    *
503    * @enum:
504    *   FT_Orientation
505    *
506    * @description:
507    *   A list of values used to describe an outline's contour orientation.
508    *
509    *   The TrueType and PostScript specifications use different conventions
510    *   to determine whether outline contours should be filled or unfilled.
511    *
512    * @values:
513    *   FT_ORIENTATION_TRUETYPE ::
514    *     According to the TrueType specification, clockwise contours must be
515    *     filled, and counter-clockwise ones must be unfilled.
516    *
517    *   FT_ORIENTATION_POSTSCRIPT ::
518    *     According to the PostScript specification, counter-clockwise
519    *     contours must be filled, and clockwise ones must be unfilled.
520    *
521    *   FT_ORIENTATION_FILL_RIGHT ::
522    *     This is identical to @FT_ORIENTATION_TRUETYPE, but is used to
523    *     remember that in TrueType, everything that is to the right of the
524    *     drawing direction of a contour must be filled.
525    *
526    *   FT_ORIENTATION_FILL_LEFT ::
527    *     This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to
528    *     remember that in PostScript, everything that is to the left of the
529    *     drawing direction of a contour must be filled.
530    *
531    *   FT_ORIENTATION_NONE ::
532    *     The orientation cannot be determined.  That is, different parts of
533    *     the glyph have different orientation.
534    *
535    */
536   typedef enum  FT_Orientation_
537   {
538     FT_ORIENTATION_TRUETYPE   = 0,
539     FT_ORIENTATION_POSTSCRIPT = 1,
540     FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,
541     FT_ORIENTATION_FILL_LEFT  = FT_ORIENTATION_POSTSCRIPT,
542     FT_ORIENTATION_NONE
543 
544   } FT_Orientation;
545 
546 
547   /**************************************************************************
548    *
549    * @function:
550    *   FT_Outline_Get_Orientation
551    *
552    * @description:
553    *   This function analyzes a glyph outline and tries to compute its fill
554    *   orientation (see @FT_Orientation).  This is done by integrating the
555    *   total area covered by the outline. The positive integral corresponds
556    *   to the clockwise orientation and @FT_ORIENTATION_POSTSCRIPT is
557    *   returned. The negative integral corresponds to the counter-clockwise
558    *   orientation and @FT_ORIENTATION_TRUETYPE is returned.
559    *
560    *   Note that this will return @FT_ORIENTATION_TRUETYPE for empty
561    *   outlines.
562    *
563    * @input:
564    *   outline ::
565    *     A handle to the source outline.
566    *
567    * @return:
568    *   The orientation.
569    *
570    */
571   FT_EXPORT( FT_Orientation )
572   FT_Outline_Get_Orientation( FT_Outline*  outline );
573 
574 
575   /* */
576 
577 
578 FT_END_HEADER
579 
580 #endif /* FTOUTLN_H_ */
581 
582 
583 /* END */
584 
585 
586 /* Local Variables: */
587 /* coding: utf-8    */
588 /* End:             */
589