1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  ftsynth.c                                                              */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    FreeType synthesizing code for emboldening and slanting (body).      */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki/*  Copyright 2000-2015 by                                                 */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h>
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_SYNTHESIS_H
21295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_INTERNAL_DEBUG_H
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_OUTLINE_H
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_BITMAP_H
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
28295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                       */
29295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
30295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
31295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* messages during execution.                                            */
32295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                       */
33295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#undef  FT_COMPONENT
34295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define FT_COMPONENT  trace_synth
35295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
36727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
37295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*************************************************************************/
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****   EXPERIMENTAL OBLIQUING SUPPORT                                ****/
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in ftsynth.h */
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_EXPORT_DEF( void )
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot )
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Matrix    transform;
51fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    FT_Outline*  outline;
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
54fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    if ( !slot )
55fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      return;
56fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki
57fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    outline = &slot->outline;
58fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* only oblique outline glyphs */
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* we don't touch the advance width */
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* For italic, simply apply a shear transform, with an angle */
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* of about 12 degrees.                                      */
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    transform.xx = 0x10000L;
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    transform.yx = 0x00000L;
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
71727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    transform.xy = 0x0366AL;
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    transform.yy = 0x10000L;
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Outline_Transform( outline, &transform );
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
81727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /****   EXPERIMENTAL EMBOLDENING SUPPORT                              ****/
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in ftsynth.h */
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_EXPORT_DEF( void )
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot )
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
92fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    FT_Library  library;
93fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    FT_Face     face;
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error    error;
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Pos      xstr, ystr;
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
98fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    if ( !slot )
99fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      return;
100fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki
101fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    library = slot->library;
102fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    face    = slot->face;
103fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE &&
1057f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner         slot->format != FT_GLYPH_FORMAT_BITMAP  )
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* some reasonable strength */
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    xstr = FT_MulFix( face->units_per_EM,
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      face->size->metrics.y_scale ) / 24;
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ystr = xstr;
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
114fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      FT_Outline_EmboldenXY( &slot->outline, xstr, ystr );
115fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki
1167f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    else /* slot->format == FT_GLYPH_FORMAT_BITMAP */
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1180a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* round to full pixels */
1190a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      xstr &= ~63;
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( xstr == 0 )
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        xstr = 1 << 6;
1220a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      ystr &= ~63;
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
124295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      /*
125295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner       * XXX: overflow check for 16-bit system, for compatibility
126295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner       *      with FT_GlyphSlot_Embolden() since freetype-2.1.10.
127295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner       *      unfortunately, this function return no informations
128295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner       *      about the cause of error.
129295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner       */
130295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN )
131295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      {
132295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        FT_TRACE1(( "FT_GlyphSlot_Embolden:" ));
133295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr ));
134295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        return;
135295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      }
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = FT_GlyphSlot_Own_Bitmap( slot );
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr );
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->advance.x )
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->advance.x += xstr;
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->advance.y )
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->advance.y += ystr;
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
151ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    slot->metrics.width        += xstr;
152ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    slot->metrics.height       += ystr;
153ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    slot->metrics.horiAdvance  += xstr;
154ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    slot->metrics.vertAdvance  += ystr;
155ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    slot->metrics.horiBearingY += ystr;
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
157295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* XXX: 16-bit overflow case must be excluded before here */
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
159295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      slot->bitmap_top += (FT_Int)( ystr >> 6 );
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
164