1 | /**************************************************************************** |
2 | * |
3 | * ftsynth.c |
4 | * |
5 | * FreeType synthesizing code for emboldening and slanting (body). |
6 | * |
7 | * Copyright (C) 2000-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 | #include <ft2build.h> |
20 | #include FT_SYNTHESIS_H |
21 | #include FT_INTERNAL_DEBUG_H |
22 | #include FT_INTERNAL_OBJECTS_H |
23 | #include FT_OUTLINE_H |
24 | #include FT_BITMAP_H |
25 | |
26 | |
27 | /************************************************************************** |
28 | * |
29 | * The macro FT_COMPONENT is used in trace mode. It is an implicit |
30 | * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log |
31 | * messages during execution. |
32 | */ |
33 | #undef FT_COMPONENT |
34 | #define FT_COMPONENT synth |
35 | |
36 | |
37 | /*************************************************************************/ |
38 | /*************************************************************************/ |
39 | /**** ****/ |
40 | /**** EXPERIMENTAL OBLIQUING SUPPORT ****/ |
41 | /**** ****/ |
42 | /*************************************************************************/ |
43 | /*************************************************************************/ |
44 | |
45 | /* documentation is in ftsynth.h */ |
46 | |
47 | FT_EXPORT_DEF( void ) |
48 | FT_GlyphSlot_Oblique( FT_GlyphSlot slot ) |
49 | { |
50 | FT_Matrix transform; |
51 | FT_Outline* outline; |
52 | |
53 | |
54 | if ( !slot ) |
55 | return; |
56 | |
57 | outline = &slot->outline; |
58 | |
59 | /* only oblique outline glyphs */ |
60 | if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) |
61 | return; |
62 | |
63 | /* we don't touch the advance width */ |
64 | |
65 | /* For italic, simply apply a shear transform, with an angle */ |
66 | /* of about 12 degrees. */ |
67 | |
68 | transform.xx = 0x10000L; |
69 | transform.yx = 0x00000L; |
70 | |
71 | transform.xy = 0x0366AL; |
72 | transform.yy = 0x10000L; |
73 | |
74 | FT_Outline_Transform( outline, &transform ); |
75 | } |
76 | |
77 | |
78 | /*************************************************************************/ |
79 | /*************************************************************************/ |
80 | /**** ****/ |
81 | /**** EXPERIMENTAL EMBOLDENING SUPPORT ****/ |
82 | /**** ****/ |
83 | /*************************************************************************/ |
84 | /*************************************************************************/ |
85 | |
86 | |
87 | /* documentation is in ftsynth.h */ |
88 | |
89 | FT_EXPORT_DEF( void ) |
90 | FT_GlyphSlot_Embolden( FT_GlyphSlot slot ) |
91 | { |
92 | FT_Library library; |
93 | FT_Face face; |
94 | FT_Error error; |
95 | FT_Pos xstr, ystr; |
96 | |
97 | |
98 | if ( !slot ) |
99 | return; |
100 | |
101 | library = slot->library; |
102 | face = slot->face; |
103 | |
104 | if ( slot->format != FT_GLYPH_FORMAT_OUTLINE && |
105 | slot->format != FT_GLYPH_FORMAT_BITMAP ) |
106 | return; |
107 | |
108 | /* some reasonable strength */ |
109 | xstr = FT_MulFix( face->units_per_EM, |
110 | face->size->metrics.y_scale ) / 24; |
111 | ystr = xstr; |
112 | |
113 | if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) |
114 | FT_Outline_EmboldenXY( &slot->outline, xstr, ystr ); |
115 | |
116 | else /* slot->format == FT_GLYPH_FORMAT_BITMAP */ |
117 | { |
118 | /* round to full pixels */ |
119 | xstr &= ~63; |
120 | if ( xstr == 0 ) |
121 | xstr = 1 << 6; |
122 | ystr &= ~63; |
123 | |
124 | /* |
125 | * XXX: overflow check for 16-bit system, for compatibility |
126 | * with FT_GlyphSlot_Embolden() since FreeType 2.1.10. |
127 | * unfortunately, this function return no informations |
128 | * about the cause of error. |
129 | */ |
130 | if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN ) |
131 | { |
132 | FT_TRACE1(( "FT_GlyphSlot_Embolden:" )); |
133 | FT_TRACE1(( "too strong emboldening parameter ystr=%d\n" , ystr )); |
134 | return; |
135 | } |
136 | error = FT_GlyphSlot_Own_Bitmap( slot ); |
137 | if ( error ) |
138 | return; |
139 | |
140 | error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr ); |
141 | if ( error ) |
142 | return; |
143 | } |
144 | |
145 | if ( slot->advance.x ) |
146 | slot->advance.x += xstr; |
147 | |
148 | if ( slot->advance.y ) |
149 | slot->advance.y += ystr; |
150 | |
151 | slot->metrics.width += xstr; |
152 | slot->metrics.height += ystr; |
153 | slot->metrics.horiAdvance += xstr; |
154 | slot->metrics.vertAdvance += ystr; |
155 | slot->metrics.horiBearingY += ystr; |
156 | |
157 | /* XXX: 16-bit overflow case must be excluded before here */ |
158 | if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) |
159 | slot->bitmap_top += (FT_Int)( ystr >> 6 ); |
160 | } |
161 | |
162 | |
163 | /* END */ |
164 | |