1 /***************************************************************************/
5 /* FreeType synthesizing code for emboldening and slanting (body). */
7 /* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2010 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
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. */
16 /***************************************************************************/
20 #include FT_SYNTHESIS_H
21 #include FT_INTERNAL_DEBUG_H
22 #include FT_INTERNAL_OBJECTS_H
27 /*************************************************************************/
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. */
34 #define FT_COMPONENT trace_synth
36 /*************************************************************************/
37 /*************************************************************************/
39 /**** EXPERIMENTAL OBLIQUING SUPPORT ****/
41 /*************************************************************************/
42 /*************************************************************************/
44 /* documentation is in ftsynth.h */
47 FT_GlyphSlot_Oblique( FT_GlyphSlot slot
)
50 FT_Outline
* outline
= &slot
->outline
;
53 /* only oblique outline glyphs */
54 if ( slot
->format
!= FT_GLYPH_FORMAT_OUTLINE
)
57 /* we don't touch the advance width */
59 /* For italic, simply apply a shear transform, with an angle */
60 /* of about 12 degrees. */
62 transform
.xx
= 0x10000L
;
63 transform
.yx
= 0x00000L
;
65 transform
.xy
= 0x06000L
;
66 transform
.yy
= 0x10000L
;
68 FT_Outline_Transform( outline
, &transform
);
72 /*************************************************************************/
73 /*************************************************************************/
75 /**** EXPERIMENTAL EMBOLDENING/OUTLINING SUPPORT ****/
77 /*************************************************************************/
78 /*************************************************************************/
81 /* documentation is in ftsynth.h */
84 FT_GlyphSlot_Embolden( FT_GlyphSlot slot
)
86 FT_Library library
= slot
->library
;
87 FT_Face face
= slot
->face
;
92 if ( slot
->format
!= FT_GLYPH_FORMAT_OUTLINE
&&
93 slot
->format
!= FT_GLYPH_FORMAT_BITMAP
)
96 /* some reasonable strength */
97 xstr
= FT_MulFix( face
->units_per_EM
,
98 face
->size
->metrics
.y_scale
) / 24;
101 if ( slot
->format
== FT_GLYPH_FORMAT_OUTLINE
)
104 (void)FT_Outline_Embolden( &slot
->outline
, xstr
);
106 /* this is more than enough for most glyphs; if you need accurate */
107 /* values, you have to call FT_Outline_Get_CBox */
111 else if ( slot
->format
== FT_GLYPH_FORMAT_BITMAP
)
113 /* round to full pixels */
120 * XXX: overflow check for 16-bit system, for compatibility
121 * with FT_GlyphSlot_Embolden() since freetype-2.1.10.
122 * unfortunately, this function return no informations
123 * about the cause of error.
125 if ( ( ystr
>> 6 ) > FT_INT_MAX
|| ( ystr
>> 6 ) < FT_INT_MIN
)
127 FT_TRACE1(( "FT_GlyphSlot_Embolden:" ));
128 FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr
));
131 error
= FT_GlyphSlot_Own_Bitmap( slot
);
135 error
= FT_Bitmap_Embolden( library
, &slot
->bitmap
, xstr
, ystr
);
140 if ( slot
->advance
.x
)
141 slot
->advance
.x
+= xstr
;
143 if ( slot
->advance
.y
)
144 slot
->advance
.y
+= ystr
;
146 slot
->metrics
.width
+= xstr
;
147 slot
->metrics
.height
+= ystr
;
148 slot
->metrics
.horiBearingY
+= ystr
;
149 slot
->metrics
.horiAdvance
+= xstr
;
150 slot
->metrics
.vertBearingX
-= xstr
/ 2;
151 slot
->metrics
.vertBearingY
+= ystr
;
152 slot
->metrics
.vertAdvance
+= ystr
;
154 /* XXX: 16-bit overflow case must be excluded before here */
155 if ( slot
->format
== FT_GLYPH_FORMAT_BITMAP
)
156 slot
->bitmap_top
+= (FT_Int
)( ystr
>> 6 );