1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* ftoutln.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* FreeType outline management (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier/* Copyright 1996-2008, 2010, 2012 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 /*************************************************************************/ 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* All functions are declared in freetype.h. */ 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_OUTLINE_H 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H 290a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#include FT_INTERNAL_DEBUG_H 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRIGONOMETRY_H 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* messages during execution. */ 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_outline 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Outline null_outline = { 0, 0, 0, 0, 0, 0 }; 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Decompose( FT_Outline* outline, 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Outline_Funcs* func_interface, 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* user ) 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef SCALED 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SCALED( x ) ( ( (x) << shift ) - delta ) 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector v_last; 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector v_control; 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector v_start; 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* point; 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* limit; 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* tags; 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int n; /* index of contour in outline */ 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt first; /* index of first point in contour */ 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int tag; /* current point's state */ 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int shift; 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos delta; 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !outline || !func_interface ) 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Argument; 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project shift = func_interface->shift; 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project delta = func_interface->delta; 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first = 0; 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < outline->n_contours; n++ ) 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int last; /* index of last point in contour */ 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 870a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); 880a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project last = outline->contours[n]; 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( last < 0 ) 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project limit = outline->points + last; 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 940a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_start = outline->points[first]; 950a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_start.x = SCALED( v_start.x ); 960a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_start.y = SCALED( v_start.y ); 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 980a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_last = outline->points[last]; 990a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_last.x = SCALED( v_last.x ); 1000a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_last.y = SCALED( v_last.y ); 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_control = v_start; 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point = outline->points + first; 1050a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project tags = outline->tags + first; 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tag = FT_CURVE_TAG( tags[0] ); 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* A contour cannot start with a cubic control point! */ 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( tag == FT_CURVE_TAG_CUBIC ) 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check first point to determine origin */ 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( tag == FT_CURVE_TAG_CONIC ) 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* first point is conic control. Yes, this happens. */ 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* start at last point if it is on the curve */ 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_start = v_last; 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project limit--; 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if both first and last points are conic, */ 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* start at their middle and record its position */ 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* for closure */ 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_start.x = ( v_start.x + v_last.x ) / 2; 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_start.y = ( v_start.y + v_last.y ) / 2; 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_last = v_start; 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point--; 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tags--; 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_TRACE5(( " move to (%.2f, %.2f)\n", 1370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_start.x / 64.0, v_start.y / 64.0 )); 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = func_interface->move_to( &v_start, user ); 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( point < limit ) 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point++; 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tags++; 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tag = FT_CURVE_TAG( tags[0] ); 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( tag ) 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case FT_CURVE_TAG_ON: /* emit a single line_to */ 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector vec; 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec.x = SCALED( point->x ); 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec.y = SCALED( point->y ); 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_TRACE5(( " line to (%.2f, %.2f)\n", 1590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project vec.x / 64.0, vec.y / 64.0 )); 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = func_interface->line_to( &vec, user ); 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case FT_CURVE_TAG_CONIC: /* consume conic arcs */ 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_control.x = SCALED( point->x ); 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_control.y = SCALED( point->y ); 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Do_Conic: 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( point < limit ) 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector vec; 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector v_middle; 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point++; 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tags++; 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tag = FT_CURVE_TAG( tags[0] ); 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec.x = SCALED( point->x ); 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec.y = SCALED( point->y ); 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( tag == FT_CURVE_TAG_ON ) 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1860a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_TRACE5(( " conic to (%.2f, %.2f)" 1870a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project " with control (%.2f, %.2f)\n", 1880a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project vec.x / 64.0, vec.y / 64.0, 1890a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_control.x / 64.0, v_control.y / 64.0 )); 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = func_interface->conic_to( &v_control, &vec, user ); 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( tag != FT_CURVE_TAG_CONIC ) 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_middle.x = ( v_control.x + vec.x ) / 2; 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_middle.y = ( v_control.y + vec.y ) / 2; 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2020a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_TRACE5(( " conic to (%.2f, %.2f)" 2030a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project " with control (%.2f, %.2f)\n", 2040a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_middle.x / 64.0, v_middle.y / 64.0, 2050a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_control.x / 64.0, v_control.y / 64.0 )); 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = func_interface->conic_to( &v_control, &v_middle, user ); 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_control = vec; 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Do_Conic; 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_TRACE5(( " conic to (%.2f, %.2f)" 2150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project " with control (%.2f, %.2f)\n", 2160a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_start.x / 64.0, v_start.y / 64.0, 2170a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_control.x / 64.0, v_control.y / 64.0 )); 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = func_interface->conic_to( &v_control, &v_start, user ); 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Close; 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: /* FT_CURVE_TAG_CUBIC */ 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector vec1, vec2; 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( point + 1 > limit || 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point += 2; 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tags += 2; 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2330a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project vec1.x = SCALED( point[-2].x ); 2340a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project vec1.y = SCALED( point[-2].y ); 2350a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 2360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project vec2.x = SCALED( point[-1].x ); 2370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project vec2.y = SCALED( point[-1].y ); 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( point <= limit ) 240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector vec; 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec.x = SCALED( point->x ); 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec.y = SCALED( point->y ); 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_TRACE5(( " cubic to (%.2f, %.2f)" 2480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", 2490a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project vec.x / 64.0, vec.y / 64.0, 2500a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project vec1.x / 64.0, vec1.y / 64.0, 2510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project vec2.x / 64.0, vec2.y / 64.0 )); 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_TRACE5(( " cubic to (%.2f, %.2f)" 2590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", 2600a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_start.x / 64.0, v_start.y / 64.0, 2610a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project vec1.x / 64.0, vec1.y / 64.0, 2620a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project vec2.x / 64.0, vec2.y / 64.0 )); 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Close; 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* close the contour with a line segment */ 2700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_TRACE5(( " line to (%.2f, %.2f)\n", 2710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project v_start.x / 64.0, v_start.y / 64.0 )); 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = func_interface->line_to( &v_start, user ); 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Close: 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first = last + 1; 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2810a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); 2820a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return FT_Err_Ok; 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 2850a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Invalid_Outline: 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Outline; 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_New_Internal( FT_Memory memory, 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt numPoints, 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int numContours, 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline *anoutline ) 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !anoutline || !memory ) 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Argument; 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *anoutline = null_outline; 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 307295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( FT_NEW_ARRAY( anoutline->points, numPoints ) || 308aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_NEW_ARRAY( anoutline->tags, numPoints ) || 309aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_NEW_ARRAY( anoutline->contours, numContours ) ) 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project anoutline->n_points = (FT_UShort)numPoints; 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project anoutline->n_contours = (FT_Short)numContours; 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project anoutline->flags |= FT_OUTLINE_OWNER; 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail: 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project anoutline->flags |= FT_OUTLINE_OWNER; 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Done_Internal( memory, anoutline ); 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_New( FT_Library library, 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt numPoints, 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int numContours, 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline *anoutline ) 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !library ) 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Library_Handle; 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Outline_New_Internal( library->memory, numPoints, 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project numContours, anoutline ); 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Check( FT_Outline* outline ) 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( outline ) 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int n_points = outline->n_points; 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int n_contours = outline->n_contours; 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int end0, end; 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int n; 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* empty glyph? */ 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( n_points == 0 && n_contours == 0 ) 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check point and contour counts */ 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( n_points <= 0 || n_contours <= 0 ) 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Bad; 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project end0 = end = -1; 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < n_contours; n++ ) 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project end = outline->contours[n]; 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* note that we don't accept empty contours */ 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( end <= end0 || end >= n_points ) 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Bad; 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project end0 = end; 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( end != n_points - 1 ) 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Bad; 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: check the tags array */ 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Bad: 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Argument; 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Copy( const FT_Outline* source, 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline *target ) 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int is_owner; 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !source || !target || 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project source->n_points != target->n_points || 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project source->n_contours != target->n_contours ) 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Argument; 400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( source == target ) 402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_COPY( target->points, source->points, source->n_points ); 405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); 407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); 409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* copy all flags, except the `FT_OUTLINE_OWNER' one */ 411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project is_owner = target->flags & FT_OUTLINE_OWNER; 412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project target->flags = source->flags; 413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project target->flags &= ~FT_OUTLINE_OWNER; 415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project target->flags |= is_owner; 416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Done_Internal( FT_Memory memory, 423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* outline ) 424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( memory && outline ) 426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( outline->flags & FT_OUTLINE_OWNER ) 428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( outline->points ); 430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( outline->tags ); 431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( outline->contours ); 432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *outline = null_outline; 434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Argument; 439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Done( FT_Library library, 446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* outline ) 447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check for valid `outline' in FT_Outline_Done_Internal() */ 449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !library ) 451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Library_Handle; 452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Outline_Done_Internal( library->memory, outline ); 454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Get_CBox( const FT_Outline* outline, 461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BBox *acbox ) 462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos xMin, yMin, xMax, yMax; 464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( outline && acbox ) 467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( outline->n_points == 0 ) 469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xMin = 0; 471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project yMin = 0; 472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xMax = 0; 473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project yMax = 0; 474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* vec = outline->points; 478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* limit = vec + outline->n_points; 479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xMin = xMax = vec->x; 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project yMin = yMax = vec->y; 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec++; 484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; vec < limit; vec++ ) 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos x, y; 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x = vec->x; 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( x < xMin ) xMin = x; 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( x > xMax ) xMax = x; 493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = vec->y; 495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( y < yMin ) yMin = y; 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( y > yMax ) yMax = y; 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->xMin = xMin; 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->xMax = xMax; 501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->yMin = yMin; 502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->yMax = yMax; 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Translate( const FT_Outline* outline, 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos xOffset, 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos yOffset ) 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort n; 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* vec; 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !outline ) 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec = outline->points; 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < outline->n_points; n++ ) 524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec->x += xOffset; 526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec->y += yOffset; 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec++; 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Reverse( FT_Outline* outline ) 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort n; 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int first, last; 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !outline ) 542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first = 0; 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < outline->n_contours; n++ ) 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project last = outline->contours[n]; 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reverse point table */ 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* p = outline->points + first; 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* q = outline->points + last; 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector swap; 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( p < q ) 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project swap = *p; 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *p = *q; 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *q = swap; 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p++; 563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q--; 564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reverse tags table */ 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* p = outline->tags + first; 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* q = outline->tags + last; 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char swap; 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( p < q ) 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project swap = *p; 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *p = *q; 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *q = swap; 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p++; 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q--; 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first = last + 1; 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->flags ^= FT_OUTLINE_REVERSE_FILL; 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Render( FT_Library library, 595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* outline, 596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Raster_Params* params ) 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 5990a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Bool update = FALSE; 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Renderer renderer; 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode node; 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !library ) 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Library_Handle; 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !outline || !params ) 608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Argument; 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project renderer = library->cur_renderer; 611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project node = library->renderers.head; 612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project params->source = (void*)outline; 614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Err_Cannot_Render_Glyph; 616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( renderer ) 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = renderer->raster_render( renderer->raster, params ); 619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error || FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph ) 620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ 623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* is unsupported by the current renderer for this glyph image */ 624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* format */ 625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now, look for another renderer that supports the same */ 627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* format */ 628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &node ); 6300a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project update = TRUE; 631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if we changed the current renderer for the glyph image format */ 634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* we need to select it as the next current one */ 635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error && update && renderer ) 636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Set_Renderer( library, renderer, 0, 0 ); 637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Get_Bitmap( FT_Library library, 646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* outline, 647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Bitmap *abitmap ) 648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Raster_Params params; 650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !abitmap ) 653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Argument; 654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* other checks are delayed to FT_Outline_Render() */ 656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project params.target = abitmap; 658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project params.flags = 0; 659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY || 661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project abitmap->pixel_mode == FT_PIXEL_MODE_LCD || 662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V ) 663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project params.flags |= FT_RASTER_FLAG_AA; 664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Outline_Render( library, outline, ¶ms ); 666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in freetype.h */ 670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector_Transform( FT_Vector* vector, 673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Matrix* matrix ) 674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos xz, yz; 676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !vector || !matrix ) 679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xz = FT_MulFix( vector->x, matrix->xx ) + 682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MulFix( vector->y, matrix->xy ); 683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project yz = FT_MulFix( vector->x, matrix->yx ) + 685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MulFix( vector->y, matrix->yy ); 686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vector->x = xz; 688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vector->y = yz; 689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Transform( const FT_Outline* outline, 696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Matrix* matrix ) 697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* vec; 699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* limit; 700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !outline || !matrix ) 703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec = outline->points; 706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project limit = vec + outline->n_points; 707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; vec < limit; vec++ ) 709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector_Transform( vec, matrix ); 710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0 714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \ 716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project do { \ 717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (first) = ( c > 0 ) ? (outline)->points + \ 718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (outline)->contours[c - 1] + 1 \ 719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : (outline)->points; \ 720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (last) = (outline)->points + (outline)->contours[c]; \ 721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } while ( 0 ) 722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Is a point in some contour? */ 725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We treat every point of the contour as if it */ 727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* it were ON. That is, we allow false positives, */ 728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* but disallow false negatives. (XXX really?) */ 729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Bool 730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_contour_has( FT_Outline* outline, 731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short c, 732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* point ) 733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* first; 735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* last; 736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* a; 737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* b; 738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt n = 0; 739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); 742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( a = first; a <= last; a++ ) 744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos x; 746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int intersect; 747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project b = ( a == last ) ? first : a + 1; 750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project intersect = ( a->y - point->y ) ^ ( b->y - point->y ); 752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* a and b are on the same side */ 754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( intersect >= 0 ) 755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( intersect == 0 && a->y == point->y ) 757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( a->x <= point->x && b->x >= point->x ) || 759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( a->x >= point->x && b->x <= point->x ) ) 760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 1; 761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y ); 767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( x < point->x ) 769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n++; 770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( x == point->x ) 771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 1; 772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 77441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier return n & 1; 775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Bool 779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_contour_enclosed( FT_Outline* outline, 780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort c ) 781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* first; 783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* last; 784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short i; 785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); 788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < outline->n_contours; i++ ) 790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( i != c && ft_contour_has( outline, i, first ) ) 792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* pt; 794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( pt = first + 1; pt <= last; pt++ ) 797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !ft_contour_has( outline, i, pt ) ) 798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 1; 801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This version differs from the public one in that each */ 809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* part (contour not enclosed in another contour) of the */ 810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* outline is checked for orientation. This is */ 811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* necessary for some buggy CJK fonts. */ 812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Orientation 813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_get_orientation( FT_Outline* outline ) 814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short i; 816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* first; 817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* last; 818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Orientation orient = FT_ORIENTATION_NONE; 819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first = outline->points; 822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < outline->n_contours; i++, first = last + 1 ) 823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* point; 825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* xmin_point; 826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos xmin; 827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project last = outline->points + outline->contours[i]; 830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* skip degenerate contours */ 832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( last < first + 2 ) 833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ft_contour_enclosed( outline, i ) ) 836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xmin = first->x; 839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xmin_point = first; 840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( point = first + 1; point <= last; point++ ) 842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( point->x < xmin ) 844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xmin = point->x; 846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xmin_point = point; 847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check the orientation of the contour */ 851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* prev; 853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* next; 854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Orientation o; 855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project prev = ( xmin_point == first ) ? last : xmin_point - 1; 858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project next = ( xmin_point == last ) ? first : xmin_point + 1; 859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) > 861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) ) 862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project o = FT_ORIENTATION_POSTSCRIPT; 863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project o = FT_ORIENTATION_TRUETYPE; 865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( orient == FT_ORIENTATION_NONE ) 867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orient = o; 868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( orient != o ) 869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_ORIENTATION_NONE; 870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return orient; 874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* 0 */ 877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Embolden( FT_Outline* outline, 883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos strength ) 884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* points; 886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector v_prev, v_first, v_next, v_cur; 887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Angle rotate, angle_in, angle_out; 888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int c, n, first; 889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int orientation; 890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !outline ) 893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Argument; 894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project strength /= 2; 896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( strength == 0 ) 897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orientation = FT_Outline_Get_Orientation( outline ); 900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( orientation == FT_ORIENTATION_NONE ) 901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( outline->n_contours ) 903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Argument; 904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( orientation == FT_ORIENTATION_TRUETYPE ) 909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rotate = -FT_ANGLE_PI2; 910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rotate = FT_ANGLE_PI2; 912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project points = outline->points; 914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first = 0; 916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( c = 0; c < outline->n_contours; c++ ) 917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int last = outline->contours[c]; 919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_first = points[first]; 922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_prev = points[last]; 923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_cur = v_first; 924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = first; n <= last; n++ ) 926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector in, out; 928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Angle angle_diff; 929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos d; 930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Fixed scale; 931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( n < last ) 934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_next = points[n + 1]; 935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_next = v_first; 937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute the in and out vectors */ 939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project in.x = v_cur.x - v_prev.x; 940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project in.y = v_cur.y - v_prev.y; 941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project out.x = v_next.x - v_cur.x; 943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project out.y = v_next.y - v_cur.y; 944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project angle_in = FT_Atan2( in.x, in.y ); 946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project angle_out = FT_Atan2( out.x, out.y ); 947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project angle_diff = FT_Angle_Diff( angle_in, angle_out ); 948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project scale = FT_Cos( angle_diff / 2 ); 949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( scale < 0x4000L && scale > -0x4000L ) 951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project in.x = in.y = 0; 952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project d = FT_DivFix( strength, scale ); 955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector_From_Polar( &in, d, angle_in + angle_diff / 2 - rotate ); 957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->points[n].x = v_cur.x + strength + in.x; 960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->points[n].y = v_cur.y + strength + in.y; 961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_prev = v_cur; 963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v_cur = v_next; 964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first = last + 1; 967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftoutln.h */ 974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Orientation ) 976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Get_Orientation( FT_Outline* outline ) 977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos xmin = 32768L; 979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos xmin_ymin = 32768L; 980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos xmin_ymax = -32768L; 981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* xmin_first = NULL; 982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* xmin_last = NULL; 983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project short* contour; 985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* first; 987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* last; 988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* prev; 989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* point; 990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int i; 992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos ray_y[3]; 993aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Orientation result[3] = 994aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { FT_ORIENTATION_NONE, FT_ORIENTATION_NONE, FT_ORIENTATION_NONE }; 995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !outline || outline->n_points <= 0 ) 998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_ORIENTATION_TRUETYPE; 999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We use the nonzero winding rule to find the orientation. */ 1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Since glyph outlines behave much more `regular' than arbitrary */ 1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* cubic or quadratic curves, this test deals with the polygon */ 1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* only which is spanned up by the control points. */ 1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first = outline->points; 1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( contour = outline->contours; 1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project contour < outline->contours + outline->n_contours; 1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project contour++, first = last + 1 ) 1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos contour_xmin = 32768L; 1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos contour_xmax = -32768L; 1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos contour_ymin = 32768L; 1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos contour_ymax = -32768L; 1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project last = outline->points + *contour; 1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* skip degenerate contours */ 1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( last < first + 2 ) 1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( point = first; point <= last; ++point ) 1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( point->x < contour_xmin ) 1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project contour_xmin = point->x; 1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( point->x > contour_xmax ) 1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project contour_xmax = point->x; 1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( point->y < contour_ymin ) 1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project contour_ymin = point->y; 1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( point->y > contour_ymax ) 1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project contour_ymax = point->y; 1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( contour_xmin < xmin && 1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project contour_xmin != contour_xmax && 1039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project contour_ymin != contour_ymax ) 1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xmin = contour_xmin; 1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xmin_ymin = contour_ymin; 1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xmin_ymax = contour_ymax; 1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xmin_first = first; 1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xmin_last = last; 1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 10490a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( xmin == 32768L ) 1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_ORIENTATION_TRUETYPE; 1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ray_y[0] = ( xmin_ymin * 3 + xmin_ymax ) >> 2; 1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ray_y[1] = ( xmin_ymin + xmin_ymax ) >> 1; 1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ray_y[2] = ( xmin_ymin + xmin_ymax * 3 ) >> 2; 1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < 3; i++ ) 1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos left_x; 1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos right_x; 1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* left1; 1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* left2; 1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* right1; 1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* right2; 1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RedoRay: 1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project left_x = 32768L; 1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project right_x = -32768L; 1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project left1 = left2 = right1 = right2 = NULL; 1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project prev = xmin_last; 1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( point = xmin_first; point <= xmin_last; prev = point, ++point ) 1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos tmp_x; 1076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( point->y == ray_y[i] || prev->y == ray_y[i] ) 1079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ray_y[i]++; 1081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto RedoRay; 1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( point->y < ray_y[i] && prev->y < ray_y[i] ) || 1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( point->y > ray_y[i] && prev->y > ray_y[i] ) ) 1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tmp_x = FT_MulDiv( point->x - prev->x, 1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ray_y[i] - prev->y, 1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point->y - prev->y ) + prev->x; 1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( tmp_x < left_x ) 1093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project left_x = tmp_x; 1095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project left1 = prev; 1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project left2 = point; 1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( tmp_x > right_x ) 1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project right_x = tmp_x; 1102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project right1 = prev; 1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project right2 = point; 1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( left1 && right1 ) 1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( left1->y < left2->y && right1->y > right2->y ) 1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result[i] = FT_ORIENTATION_TRUETYPE; 1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( left1->y > left2->y && right1->y < right2->y ) 1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result[i] = FT_ORIENTATION_POSTSCRIPT; 1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result[i] = FT_ORIENTATION_NONE; 1115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( result[0] != FT_ORIENTATION_NONE && 1119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( result[0] == result[1] || result[0] == result[2] ) ) 1120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return result[0]; 1121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( result[1] != FT_ORIENTATION_NONE && result[1] == result[2] ) 1123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return result[1]; 1124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_ORIENTATION_TRUETYPE; 1126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 1130