1 /****************************************************************************
2  *
3  * ftmm.h
4  *
5  *   FreeType Multiple Master font interface (specification).
6  *
7  * Copyright (C) 1996-2019 by
8  * David Turner, Robert Wilhelm, and Werner Lemberg.
9  *
10  * This file is part of the FreeType project, and may only be used,
11  * modified, and distributed under the terms of the FreeType project
12  * license, LICENSE.TXT.  By continuing to use, modify, or distribute
13  * this file you indicate that you have read the license and
14  * understand and accept it fully.
15  *
16  */
17 
18 
19 #ifndef FTMM_H_
20 #define FTMM_H_
21 
22 
23 #include <ft2build.h>
24 #include FT_TYPE1_TABLES_H
25 
26 
27 FT_BEGIN_HEADER
28 
29 
30   /**************************************************************************
31    *
32    * @section:
33    *   multiple_masters
34    *
35    * @title:
36    *   Multiple Masters
37    *
38    * @abstract:
39    *   How to manage Multiple Masters fonts.
40    *
41    * @description:
42    *   The following types and functions are used to manage Multiple Master
43    *   fonts, i.e., the selection of specific design instances by setting
44    *   design axis coordinates.
45    *
46    *   Besides Adobe MM fonts, the interface supports Apple's TrueType GX and
47    *   OpenType variation fonts.  Some of the routines only work with Adobe
48    *   MM fonts, others will work with all three types.  They are similar
49    *   enough that a consistent interface makes sense.
50    *
51    */
52 
53 
54   /**************************************************************************
55    *
56    * @struct:
57    *   FT_MM_Axis
58    *
59    * @description:
60    *   A structure to model a given axis in design space for Multiple Masters
61    *   fonts.
62    *
63    *   This structure can't be used for TrueType GX or OpenType variation
64    *   fonts.
65    *
66    * @fields:
67    *   name ::
68    *     The axis's name.
69    *
70    *   minimum ::
71    *     The axis's minimum design coordinate.
72    *
73    *   maximum ::
74    *     The axis's maximum design coordinate.
75    */
76   typedef struct  FT_MM_Axis_
77   {
78     FT_String*  name;
79     FT_Long     minimum;
80     FT_Long     maximum;
81 
82   } FT_MM_Axis;
83 
84 
85   /**************************************************************************
86    *
87    * @struct:
88    *   FT_Multi_Master
89    *
90    * @description:
91    *   A structure to model the axes and space of a Multiple Masters font.
92    *
93    *   This structure can't be used for TrueType GX or OpenType variation
94    *   fonts.
95    *
96    * @fields:
97    *   num_axis ::
98    *     Number of axes.  Cannot exceed~4.
99    *
100    *   num_designs ::
101    *     Number of designs; should be normally 2^num_axis even though the
102    *     Type~1 specification strangely allows for intermediate designs to be
103    *     present.  This number cannot exceed~16.
104    *
105    *   axis ::
106    *     A table of axis descriptors.
107    */
108   typedef struct  FT_Multi_Master_
109   {
110     FT_UInt     num_axis;
111     FT_UInt     num_designs;
112     FT_MM_Axis  axis[T1_MAX_MM_AXIS];
113 
114   } FT_Multi_Master;
115 
116 
117   /**************************************************************************
118    *
119    * @struct:
120    *   FT_Var_Axis
121    *
122    * @description:
123    *   A structure to model a given axis in design space for Multiple
124    *   Masters, TrueType GX, and OpenType variation fonts.
125    *
126    * @fields:
127    *   name ::
128    *     The axis's name.  Not always meaningful for TrueType GX or OpenType
129    *     variation fonts.
130    *
131    *   minimum ::
132    *     The axis's minimum design coordinate.
133    *
134    *   def ::
135    *     The axis's default design coordinate.  FreeType computes meaningful
136    *     default values for Adobe MM fonts.
137    *
138    *   maximum ::
139    *     The axis's maximum design coordinate.
140    *
141    *   tag ::
142    *     The axis's tag (the equivalent to 'name' for TrueType GX and
143    *     OpenType variation fonts).  FreeType provides default values for
144    *     Adobe MM fonts if possible.
145    *
146    *   strid ::
147    *     The axis name entry in the font's 'name' table.  This is another
148    *     (and often better) version of the 'name' field for TrueType GX or
149    *     OpenType variation fonts.  Not meaningful for Adobe MM fonts.
150    *
151    * @note:
152    *   The fields `minimum`, `def`, and `maximum` are 16.16 fractional values
153    *   for TrueType GX and OpenType variation fonts.  For Adobe MM fonts, the
154    *   values are integers.
155    */
156   typedef struct  FT_Var_Axis_
157   {
158     FT_String*  name;
159 
160     FT_Fixed    minimum;
161     FT_Fixed    def;
162     FT_Fixed    maximum;
163 
164     FT_ULong    tag;
165     FT_UInt     strid;
166 
167   } FT_Var_Axis;
168 
169 
170   /**************************************************************************
171    *
172    * @struct:
173    *   FT_Var_Named_Style
174    *
175    * @description:
176    *   A structure to model a named instance in a TrueType GX or OpenType
177    *   variation font.
178    *
179    *   This structure can't be used for Adobe MM fonts.
180    *
181    * @fields:
182    *   coords ::
183    *     The design coordinates for this instance.  This is an array with one
184    *     entry for each axis.
185    *
186    *   strid ::
187    *     The entry in 'name' table identifying this instance.
188    *
189    *   psid ::
190    *     The entry in 'name' table identifying a PostScript name for this
191    *     instance.  Value 0xFFFF indicates a missing entry.
192    */
193   typedef struct  FT_Var_Named_Style_
194   {
195     FT_Fixed*  coords;
196     FT_UInt    strid;
197     FT_UInt    psid;   /* since 2.7.1 */
198 
199   } FT_Var_Named_Style;
200 
201 
202   /**************************************************************************
203    *
204    * @struct:
205    *   FT_MM_Var
206    *
207    * @description:
208    *   A structure to model the axes and space of an Adobe MM, TrueType GX,
209    *   or OpenType variation font.
210    *
211    *   Some fields are specific to one format and not to the others.
212    *
213    * @fields:
214    *   num_axis ::
215    *     The number of axes.  The maximum value is~4 for Adobe MM fonts; no
216    *     limit in TrueType GX or OpenType variation fonts.
217    *
218    *   num_designs ::
219    *     The number of designs; should be normally 2^num_axis for Adobe MM
220    *     fonts.  Not meaningful for TrueType GX or OpenType variation fonts
221    *     (where every glyph could have a different number of designs).
222    *
223    *   num_namedstyles ::
224    *     The number of named styles; a 'named style' is a tuple of design
225    *     coordinates that has a string ID (in the 'name' table) associated
226    *     with it.  The font can tell the user that, for example,
227    *     [Weight=1.5,Width=1.1] is 'Bold'.  Another name for 'named style' is
228    *     'named instance'.
229    *
230    *     For Adobe Multiple Masters fonts, this value is always zero because
231    *     the format does not support named styles.
232    *
233    *   axis ::
234    *     An axis descriptor table.  TrueType GX and OpenType variation fonts
235    *     contain slightly more data than Adobe MM fonts.  Memory management
236    *     of this pointer is done internally by FreeType.
237    *
238    *   namedstyle ::
239    *     A named style (instance) table.  Only meaningful for TrueType GX and
240    *     OpenType variation fonts.  Memory management of this pointer is done
241    *     internally by FreeType.
242    */
243   typedef struct  FT_MM_Var_
244   {
245     FT_UInt              num_axis;
246     FT_UInt              num_designs;
247     FT_UInt              num_namedstyles;
248     FT_Var_Axis*         axis;
249     FT_Var_Named_Style*  namedstyle;
250 
251   } FT_MM_Var;
252 
253 
254   /**************************************************************************
255    *
256    * @function:
257    *   FT_Get_Multi_Master
258    *
259    * @description:
260    *   Retrieve a variation descriptor of a given Adobe MM font.
261    *
262    *   This function can't be used with TrueType GX or OpenType variation
263    *   fonts.
264    *
265    * @input:
266    *   face ::
267    *     A handle to the source face.
268    *
269    * @output:
270    *   amaster ::
271    *     The Multiple Masters descriptor.
272    *
273    * @return:
274    *   FreeType error code.  0~means success.
275    */
276   FT_EXPORT( FT_Error )
277   FT_Get_Multi_Master( FT_Face           face,
278                        FT_Multi_Master  *amaster );
279 
280 
281   /**************************************************************************
282    *
283    * @function:
284    *   FT_Get_MM_Var
285    *
286    * @description:
287    *   Retrieve a variation descriptor for a given font.
288    *
289    *   This function works with all supported variation formats.
290    *
291    * @input:
292    *   face ::
293    *     A handle to the source face.
294    *
295    * @output:
296    *   amaster ::
297    *     The variation descriptor.  Allocates a data structure, which the
298    *     user must deallocate with a call to @FT_Done_MM_Var after use.
299    *
300    * @return:
301    *   FreeType error code.  0~means success.
302    */
303   FT_EXPORT( FT_Error )
304   FT_Get_MM_Var( FT_Face      face,
305                  FT_MM_Var*  *amaster );
306 
307 
308   /**************************************************************************
309    *
310    * @function:
311    *   FT_Done_MM_Var
312    *
313    * @description:
314    *   Free the memory allocated by @FT_Get_MM_Var.
315    *
316    * @input:
317    *   library ::
318    *     A handle of the face's parent library object that was used in the
319    *     call to @FT_Get_MM_Var to create `amaster`.
320    *
321    * @return:
322    *   FreeType error code.  0~means success.
323    */
324   FT_EXPORT( FT_Error )
325   FT_Done_MM_Var( FT_Library   library,
326                   FT_MM_Var   *amaster );
327 
328 
329   /**************************************************************************
330    *
331    * @function:
332    *   FT_Set_MM_Design_Coordinates
333    *
334    * @description:
335    *   For Adobe MM fonts, choose an interpolated font design through design
336    *   coordinates.
337    *
338    *   This function can't be used with TrueType GX or OpenType variation
339    *   fonts.
340    *
341    * @inout:
342    *   face ::
343    *     A handle to the source face.
344    *
345    * @input:
346    *   num_coords ::
347    *     The number of available design coordinates.  If it is larger than
348    *     the number of axes, ignore the excess values.  If it is smaller than
349    *     the number of axes, use default values for the remaining axes.
350    *
351    *   coords ::
352    *     An array of design coordinates.
353    *
354    * @return:
355    *   FreeType error code.  0~means success.
356    *
357    * @note:
358    *   [Since 2.8.1] To reset all axes to the default values, call the
359    *   function with `num_coords` set to zero and `coords` set to `NULL`.
360    *
361    *   [Since 2.9] If `num_coords` is larger than zero, this function sets
362    *   the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field
363    *   (i.e., @FT_IS_VARIATION will return true).  If `num_coords` is zero,
364    *   this bit flag gets unset.
365    */
366   FT_EXPORT( FT_Error )
367   FT_Set_MM_Design_Coordinates( FT_Face   face,
368                                 FT_UInt   num_coords,
369                                 FT_Long*  coords );
370 
371 
372   /**************************************************************************
373    *
374    * @function:
375    *   FT_Set_Var_Design_Coordinates
376    *
377    * @description:
378    *   Choose an interpolated font design through design coordinates.
379    *
380    *   This function works with all supported variation formats.
381    *
382    * @inout:
383    *   face ::
384    *     A handle to the source face.
385    *
386    * @input:
387    *   num_coords ::
388    *     The number of available design coordinates.  If it is larger than
389    *     the number of axes, ignore the excess values.  If it is smaller than
390    *     the number of axes, use default values for the remaining axes.
391    *
392    *   coords ::
393    *     An array of design coordinates.
394    *
395    * @return:
396    *   FreeType error code.  0~means success.
397    *
398    * @note:
399    *   [Since 2.8.1] To reset all axes to the default values, call the
400    *   function with `num_coords` set to zero and `coords` set to `NULL`.
401    *   [Since 2.9] 'Default values' means the currently selected named
402    *   instance (or the base font if no named instance is selected).
403    *
404    *   [Since 2.9] If `num_coords` is larger than zero, this function sets
405    *   the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field
406    *   (i.e., @FT_IS_VARIATION will return true).  If `num_coords` is zero,
407    *   this bit flag gets unset.
408    */
409   FT_EXPORT( FT_Error )
410   FT_Set_Var_Design_Coordinates( FT_Face    face,
411                                  FT_UInt    num_coords,
412                                  FT_Fixed*  coords );
413 
414 
415   /**************************************************************************
416    *
417    * @function:
418    *   FT_Get_Var_Design_Coordinates
419    *
420    * @description:
421    *   Get the design coordinates of the currently selected interpolated
422    *   font.
423    *
424    *   This function works with all supported variation formats.
425    *
426    * @input:
427    *   face ::
428    *     A handle to the source face.
429    *
430    *   num_coords ::
431    *     The number of design coordinates to retrieve.  If it is larger than
432    *     the number of axes, set the excess values to~0.
433    *
434    * @output:
435    *   coords ::
436    *     The design coordinates array.
437    *
438    * @return:
439    *   FreeType error code.  0~means success.
440    *
441    * @since:
442    *   2.7.1
443    */
444   FT_EXPORT( FT_Error )
445   FT_Get_Var_Design_Coordinates( FT_Face    face,
446                                  FT_UInt    num_coords,
447                                  FT_Fixed*  coords );
448 
449 
450   /**************************************************************************
451    *
452    * @function:
453    *   FT_Set_MM_Blend_Coordinates
454    *
455    * @description:
456    *   Choose an interpolated font design through normalized blend
457    *   coordinates.
458    *
459    *   This function works with all supported variation formats.
460    *
461    * @inout:
462    *   face ::
463    *     A handle to the source face.
464    *
465    * @input:
466    *   num_coords ::
467    *     The number of available design coordinates.  If it is larger than
468    *     the number of axes, ignore the excess values.  If it is smaller than
469    *     the number of axes, use default values for the remaining axes.
470    *
471    *   coords ::
472    *     The design coordinates array (each element must be between 0 and 1.0
473    *     for Adobe MM fonts, and between -1.0 and 1.0 for TrueType GX and
474    *     OpenType variation fonts).
475    *
476    * @return:
477    *   FreeType error code.  0~means success.
478    *
479    * @note:
480    *   [Since 2.8.1] To reset all axes to the default values, call the
481    *   function with `num_coords` set to zero and `coords` set to `NULL`.
482    *   [Since 2.9] 'Default values' means the currently selected named
483    *   instance (or the base font if no named instance is selected).
484    *
485    *   [Since 2.9] If `num_coords` is larger than zero, this function sets
486    *   the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field
487    *   (i.e., @FT_IS_VARIATION will return true).  If `num_coords` is zero,
488    *   this bit flag gets unset.
489    */
490   FT_EXPORT( FT_Error )
491   FT_Set_MM_Blend_Coordinates( FT_Face    face,
492                                FT_UInt    num_coords,
493                                FT_Fixed*  coords );
494 
495 
496   /**************************************************************************
497    *
498    * @function:
499    *   FT_Get_MM_Blend_Coordinates
500    *
501    * @description:
502    *   Get the normalized blend coordinates of the currently selected
503    *   interpolated font.
504    *
505    *   This function works with all supported variation formats.
506    *
507    * @input:
508    *   face ::
509    *     A handle to the source face.
510    *
511    *   num_coords ::
512    *     The number of normalized blend coordinates to retrieve.  If it is
513    *     larger than the number of axes, set the excess values to~0.5 for
514    *     Adobe MM fonts, and to~0 for TrueType GX and OpenType variation
515    *     fonts.
516    *
517    * @output:
518    *   coords ::
519    *     The normalized blend coordinates array.
520    *
521    * @return:
522    *   FreeType error code.  0~means success.
523    *
524    * @since:
525    *   2.7.1
526    */
527   FT_EXPORT( FT_Error )
528   FT_Get_MM_Blend_Coordinates( FT_Face    face,
529                                FT_UInt    num_coords,
530                                FT_Fixed*  coords );
531 
532 
533   /**************************************************************************
534    *
535    * @function:
536    *   FT_Set_Var_Blend_Coordinates
537    *
538    * @description:
539    *   This is another name of @FT_Set_MM_Blend_Coordinates.
540    */
541   FT_EXPORT( FT_Error )
542   FT_Set_Var_Blend_Coordinates( FT_Face    face,
543                                 FT_UInt    num_coords,
544                                 FT_Fixed*  coords );
545 
546 
547   /**************************************************************************
548    *
549    * @function:
550    *   FT_Get_Var_Blend_Coordinates
551    *
552    * @description:
553    *   This is another name of @FT_Get_MM_Blend_Coordinates.
554    *
555    * @since:
556    *   2.7.1
557    */
558   FT_EXPORT( FT_Error )
559   FT_Get_Var_Blend_Coordinates( FT_Face    face,
560                                 FT_UInt    num_coords,
561                                 FT_Fixed*  coords );
562 
563 
564   /**************************************************************************
565    *
566    * @function:
567    *   FT_Set_MM_WeightVector
568    *
569    * @description:
570    *   For Adobe MM fonts, choose an interpolated font design by directly
571    *   setting the weight vector.
572    *
573    *   This function can't be used with TrueType GX or OpenType variation
574    *   fonts.
575    *
576    * @inout:
577    *   face ::
578    *     A handle to the source face.
579    *
580    * @input:
581    *   len ::
582    *     The length of the weight vector array.  If it is larger than the
583    *     number of designs, the extra values are ignored.  If it is less than
584    *     the number of designs, the remaining values are set to zero.
585    *
586    *   weightvector ::
587    *     An array representing the weight vector.
588    *
589    * @return:
590    *   FreeType error code.  0~means success.
591    *
592    * @note:
593    *   Adobe Multiple Master fonts limit the number of designs, and thus the
594    *   length of the weight vector to~16.
595    *
596    *   If `len` is zero and `weightvector` is `NULL`, the weight vector array
597    *   is reset to the default values.
598    *
599    *   The Adobe documentation also states that the values in the
600    *   WeightVector array must total 1.0 +/-~0.001.  In practice this does
601    *   not seem to be enforced, so is not enforced here, either.
602    *
603    * @since:
604    *   2.10
605    */
606   FT_EXPORT( FT_Error )
607   FT_Set_MM_WeightVector( FT_Face    face,
608                           FT_UInt    len,
609                           FT_Fixed*  weightvector );
610 
611 
612   /**************************************************************************
613    *
614    * @function:
615    *   FT_Get_MM_WeightVector
616    *
617    * @description:
618    *   For Adobe MM fonts, retrieve the current weight vector of the font.
619    *
620    *   This function can't be used with TrueType GX or OpenType variation
621    *   fonts.
622    *
623    * @inout:
624    *   face ::
625    *     A handle to the source face.
626    *
627    *   len ::
628    *     A pointer to the size of the array to be filled.  If the size of the
629    *     array is less than the number of designs, `FT_Err_Invalid_Argument`
630    *     is returned, and `len` is set to the required size (the number of
631    *     designs).  If the size of the array is greater than the number of
632    *     designs, the remaining entries are set to~0.  On successful
633    *     completion, `len` is set to the number of designs (i.e., the number
634    *     of values written to the array).
635    *
636    * @output:
637    *   weightvector ::
638    *     An array to be filled.
639    *
640    * @return:
641    *   FreeType error code.  0~means success.
642    *
643    * @note:
644    *   Adobe Multiple Master fonts limit the number of designs, and thus the
645    *   length of the WeightVector to~16.
646    *
647    * @since:
648    *   2.10
649    */
650   FT_EXPORT( FT_Error )
651   FT_Get_MM_WeightVector( FT_Face    face,
652                           FT_UInt*   len,
653                           FT_Fixed*  weightvector );
654 
655 
656   /**************************************************************************
657    *
658    * @enum:
659    *   FT_VAR_AXIS_FLAG_XXX
660    *
661    * @description:
662    *   A list of bit flags used in the return value of
663    *   @FT_Get_Var_Axis_Flags.
664    *
665    * @values:
666    *   FT_VAR_AXIS_FLAG_HIDDEN ::
667    *     The variation axis should not be exposed to user interfaces.
668    *
669    * @since:
670    *   2.8.1
671    */
672 #define FT_VAR_AXIS_FLAG_HIDDEN  1
673 
674 
675   /**************************************************************************
676    *
677    * @function:
678    *   FT_Get_Var_Axis_Flags
679    *
680    * @description:
681    *   Get the 'flags' field of an OpenType Variation Axis Record.
682    *
683    *   Not meaningful for Adobe MM fonts (`*flags` is always zero).
684    *
685    * @input:
686    *   master ::
687    *     The variation descriptor.
688    *
689    *   axis_index ::
690    *     The index of the requested variation axis.
691    *
692    * @output:
693    *   flags ::
694    *     The 'flags' field.  See @FT_VAR_AXIS_FLAG_XXX for possible values.
695    *
696    * @return:
697    *   FreeType error code.  0~means success.
698    *
699    * @since:
700    *   2.8.1
701    */
702   FT_EXPORT( FT_Error )
703   FT_Get_Var_Axis_Flags( FT_MM_Var*  master,
704                          FT_UInt     axis_index,
705                          FT_UInt*    flags );
706 
707 
708   /**************************************************************************
709    *
710    * @function:
711    *   FT_Set_Named_Instance
712    *
713    * @description:
714    *   Set or change the current named instance.
715    *
716    * @input:
717    *   face ::
718    *     A handle to the source face.
719    *
720    *   instance_index ::
721    *     The index of the requested instance, starting with value 1.  If set
722    *     to value 0, FreeType switches to font access without a named
723    *     instance.
724    *
725    * @return:
726    *   FreeType error code.  0~means success.
727    *
728    * @note:
729    *   The function uses the value of `instance_index` to set bits 16-30 of
730    *   the face's `face_index` field.  It also resets any variation applied
731    *   to the font, and the @FT_FACE_FLAG_VARIATION bit of the face's
732    *   `face_flags` field gets reset to zero (i.e., @FT_IS_VARIATION will
733    *   return false).
734    *
735    *   For Adobe MM fonts (which don't have named instances) this function
736    *   simply resets the current face to the default instance.
737    *
738    * @since:
739    *   2.9
740    */
741   FT_EXPORT( FT_Error )
742   FT_Set_Named_Instance( FT_Face  face,
743                          FT_UInt  instance_index );
744 
745   /* */
746 
747 
748 FT_END_HEADER
749 
750 #endif /* FTMM_H_ */
751 
752 
753 /* END */
754