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