1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* ftgloadr.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* The FreeType glyph loader (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki/* Copyright 2002-2015 by */ 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* David Turner, Robert Wilhelm, and Werner Lemberg */ 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* this file you indicate that you have read the license and */ 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* understand and accept it fully. */ 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 20727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_INTERNAL_DEBUG_H 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_GLYPH_LOADER_H 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_MEMORY_H 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_gloader 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** G L Y P H L O A D E R *****/ 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The glyph loader is a simple object which is used to load a set of */ 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* glyphs easily. It is critical for the correct loading of composites. */ 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Ideally, one can see it as a stack of abstract `glyph' objects. */ 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* loader.base Is really the bottom of the stack. It describes a */ 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* single glyph image made of the juxtaposition of */ 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* several glyphs (those `in the stack'). */ 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* loader.current Describes the top of the stack, on which a new */ 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* glyph can be loaded. */ 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rewind Clears the stack. */ 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Prepare Set up `loader.current' for addition of a new glyph */ 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* image. */ 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Add Add the `current' glyph image to the `base' one, */ 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* and prepare for another one. */ 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The glyph loader is now a base object. Each driver used to */ 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* re-implement it in one way or the other, which wasted code and */ 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* energy. */ 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* create a new glyph loader */ 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Error ) 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_New( FT_Memory memory, 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader *aloader ) 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 73aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_GlyphLoader loader = NULL; 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !FT_NEW( loader ) ) 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->memory = memory; 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *aloader = loader; 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* rewind the glyph loader - reset counters to 0 */ 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( void ) 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Rewind( FT_GlyphLoader loader ) 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoad base = &loader->base; 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoad current = &loader->current; 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project base->outline.n_points = 0; 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project base->outline.n_contours = 0; 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project base->num_subglyphs = 0; 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *current = *base; 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reset the glyph loader, frees all allocated tables */ 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* and starts from zero */ 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( void ) 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Reset( FT_GlyphLoader loader ) 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = loader->memory; 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( loader->base.outline.points ); 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( loader->base.outline.tags ); 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( loader->base.outline.contours ); 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( loader->base.extra_points ); 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( loader->base.subglyphs ); 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->base.extra_points2 = NULL; 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->max_points = 0; 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->max_contours = 0; 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->max_subglyphs = 0; 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Rewind( loader ); 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* delete a glyph loader */ 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( void ) 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Done( FT_GlyphLoader loader ) 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( loader ) 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = loader->memory; 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Reset( loader ); 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( loader ); 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* re-adjust the `current' outline fields */ 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Adjust_Points( FT_GlyphLoader loader ) 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* base = &loader->base.outline; 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* current = &loader->current.outline; 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project current->points = base->points + base->n_points; 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project current->tags = base->tags + base->n_points; 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project current->contours = base->contours + base->n_contours; 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* handle extra points table - if any */ 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( loader->use_extra ) 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->current.extra_points = loader->base.extra_points + 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project base->n_points; 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->current.extra_points2 = loader->base.extra_points2 + 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project base->n_points; 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Error ) 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ) 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = loader->memory; 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) ) 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->use_extra = 1; 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->base.extra_points2 = loader->base.extra_points + 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->max_points; 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Adjust_Points( loader ); 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* re-adjust the `current' subglyphs field */ 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader loader ) 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoad base = &loader->base; 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoad current = &loader->current; 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project current->subglyphs = base->subglyphs + base->num_subglyphs; 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Ensure that we can add `n_points' and `n_contours' to our glyph. */ 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This function reallocates its outline tables if necessary. Note that */ 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* it DOESN'T change the number of points within the loader! */ 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Error ) 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt n_points, 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt n_contours ) 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = loader->memory; 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* base = &loader->base.outline; 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* current = &loader->current.outline; 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool adjust = 0; 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt new_max, old_max; 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check points & tags */ 215ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki new_max = (FT_UInt)base->n_points + (FT_UInt)current->n_points + 216ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki n_points; 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project old_max = loader->max_points; 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( new_max > old_max ) 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_max = FT_PAD_CEIL( new_max, 8 ); 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 223295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( new_max > FT_OUTLINE_POINTS_MAX ) 224727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Array_Too_Large ); 225295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( loader->use_extra ) 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_RENEW_ARRAY( loader->base.extra_points, 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project old_max * 2, new_max * 2 ) ) 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_MOVE( loader->base.extra_points + new_max, 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->base.extra_points + old_max, 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project old_max ); 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->base.extra_points2 = loader->base.extra_points + new_max; 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project adjust = 1; 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->max_points = new_max; 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check contours */ 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project old_max = loader->max_contours; 249ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki new_max = (FT_UInt)base->n_contours + (FT_UInt)current->n_contours + 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_contours; 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( new_max > old_max ) 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_max = FT_PAD_CEIL( new_max, 4 ); 254295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 255295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( new_max > FT_OUTLINE_CONTOURS_MAX ) 256727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Array_Too_Large ); 257295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project adjust = 1; 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->max_contours = new_max; 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( adjust ) 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Adjust_Points( loader ); 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 269ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 270ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_GlyphLoader_Reset( loader ); 271ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Ensure that we can add `n_subglyphs' to our glyph. this function */ 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reallocates its subglyphs table if necessary. Note that it DOES */ 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NOT change the number of subglyphs within the loader! */ 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Error ) 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt n_subs ) 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = loader->memory; 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt new_max, old_max; 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoad base = &loader->base; 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoad current = &loader->current; 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_max = base->num_subglyphs + current->num_subglyphs + n_subs; 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project old_max = loader->max_subglyphs; 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( new_max > old_max ) 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_max = FT_PAD_CEIL( new_max, 2 ); 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) ) 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->max_subglyphs = new_max; 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Adjust_Subglyphs( loader ); 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* prepare loader for the addition of a new glyph on top of the base one */ 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( void ) 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Prepare( FT_GlyphLoader loader ) 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoad current = &loader->current; 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project current->outline.n_points = 0; 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project current->outline.n_contours = 0; 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project current->num_subglyphs = 0; 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Adjust_Points ( loader ); 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Adjust_Subglyphs( loader ); 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 326727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* add current glyph to the base image -- and prepare for another */ 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( void ) 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Add( FT_GlyphLoader loader ) 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoad base; 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoad current; 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 333ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_Int n_curr_contours; 334ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_Int n_base_points; 335ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_Int n; 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !loader ) 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project base = &loader->base; 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project current = &loader->current; 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_curr_contours = current->outline.n_contours; 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_base_points = base->outline.n_points; 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project base->outline.n_points = 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (short)( base->outline.n_points + current->outline.n_points ); 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project base->outline.n_contours = 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (short)( base->outline.n_contours + current->outline.n_contours ); 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project base->num_subglyphs += current->num_subglyphs; 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* adjust contours count in newest outline */ 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < n_curr_contours; n++ ) 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project current->outline.contours[n] = 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (short)( current->outline.contours[n] + n_base_points ); 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* prepare for another new glyph image */ 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Prepare( loader ); 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Error ) 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader source ) 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 369ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_UInt num_points = (FT_UInt)source->base.outline.n_points; 370ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_UInt num_contours = (FT_UInt)source->base.outline.n_contours; 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours ); 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* out = &target->base.outline; 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* in = &source->base.outline; 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_COPY( out->points, in->points, 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project num_points ); 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_COPY( out->tags, in->tags, 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project num_points ); 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_COPY( out->contours, in->contours, 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project num_contours ); 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* do we need to copy the extra points? */ 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( target->use_extra && source->use_extra ) 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points, 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project num_points ); 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2, 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project num_points ); 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project out->n_points = (short)num_points; 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project out->n_contours = (short)num_contours; 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Adjust_Points( target ); 400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 407