- Revert 44301
[reactos.git] / lib / 3rdparty / freetype / src / base / ftsynth.c
1 /***************************************************************************/
2 /* */
3 /* ftsynth.c */
4 /* */
5 /* FreeType synthesizing code for emboldening and slanting (body). */
6 /* */
7 /* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006 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_OBJECTS_H
22 #include FT_OUTLINE_H
23 #include FT_BITMAP_H
24
25
26 /*************************************************************************/
27 /*************************************************************************/
28 /**** ****/
29 /**** EXPERIMENTAL OBLIQUING SUPPORT ****/
30 /**** ****/
31 /*************************************************************************/
32 /*************************************************************************/
33
34 /* documentation is in ftsynth.h */
35
36 FT_EXPORT_DEF( void )
37 FT_GlyphSlot_Oblique( FT_GlyphSlot slot )
38 {
39 FT_Matrix transform;
40 FT_Outline* outline = &slot->outline;
41
42
43 /* only oblique outline glyphs */
44 if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
45 return;
46
47 /* we don't touch the advance width */
48
49 /* For italic, simply apply a shear transform, with an angle */
50 /* of about 12 degrees. */
51
52 transform.xx = 0x10000L;
53 transform.yx = 0x00000L;
54
55 transform.xy = 0x06000L;
56 transform.yy = 0x10000L;
57
58 FT_Outline_Transform( outline, &transform );
59 }
60
61
62 /*************************************************************************/
63 /*************************************************************************/
64 /**** ****/
65 /**** EXPERIMENTAL EMBOLDENING/OUTLINING SUPPORT ****/
66 /**** ****/
67 /*************************************************************************/
68 /*************************************************************************/
69
70
71 FT_EXPORT_DEF( FT_Error )
72 FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot )
73 {
74 if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP &&
75 !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
76 {
77 FT_Bitmap bitmap;
78 FT_Error error;
79
80
81 FT_Bitmap_New( &bitmap );
82 error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap );
83 if ( error )
84 return error;
85
86 slot->bitmap = bitmap;
87 slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
88 }
89
90 return FT_Err_Ok;
91 }
92
93
94 /* documentation is in ftsynth.h */
95
96 FT_EXPORT_DEF( void )
97 FT_GlyphSlot_Embolden( FT_GlyphSlot slot )
98 {
99 FT_Library library = slot->library;
100 FT_Face face = FT_SLOT_FACE( slot );
101 FT_Error error;
102 FT_Pos xstr, ystr;
103
104
105 if ( slot->format != FT_GLYPH_FORMAT_OUTLINE &&
106 slot->format != FT_GLYPH_FORMAT_BITMAP )
107 return;
108
109 /* some reasonable strength */
110 xstr = FT_MulFix( face->units_per_EM,
111 face->size->metrics.y_scale ) / 24;
112 ystr = xstr;
113
114 if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
115 {
116 error = FT_Outline_Embolden( &slot->outline, xstr );
117 /* ignore error */
118
119 /* this is more than enough for most glyphs; if you need accurate */
120 /* values, you have to call FT_Outline_Get_CBox */
121 xstr = xstr * 2;
122 ystr = xstr;
123 }
124 else if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
125 {
126 xstr = FT_PIX_FLOOR( xstr );
127 if ( xstr == 0 )
128 xstr = 1 << 6;
129 ystr = FT_PIX_FLOOR( ystr );
130
131 error = FT_GlyphSlot_Own_Bitmap( slot );
132 if ( error )
133 return;
134
135 error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr );
136 if ( error )
137 return;
138 }
139
140 if ( slot->advance.x )
141 slot->advance.x += xstr;
142
143 if ( slot->advance.y )
144 slot->advance.y += ystr;
145
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;
153
154 if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
155 slot->bitmap_top += ystr >> 6;
156 }
157
158
159 /* END */