ReactOS 0.4.16-dev-2332-g4cba65d
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 */
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 */
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 )
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 )
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 */
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 )
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 )
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 */
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 */
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: */
int yOffset
Definition: appswitch.c:58
int xOffset
Definition: appswitch.c:58
void user(int argc, const char *argv[])
Definition: cmds.c:1350
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
GLuint GLenum matrix
Definition: glext.h:9407
GLenum const GLfloat * params
Definition: glext.h:5645
#define FT_EXPORT(x)
Definition: mesh.c:5330
Definition: tools.h:99