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