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 /* 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 );