| OLD | NEW |
| 1 /***************************************************************************/ | 1 /***************************************************************************/ |
| 2 /* */ | 2 /* */ |
| 3 /* ttgload.c */ | 3 /* ttgload.c */ |
| 4 /* */ | 4 /* */ |
| 5 /* TrueType Glyph Loader (body). */ | 5 /* TrueType Glyph Loader (body). */ |
| 6 /* */ | 6 /* */ |
| 7 /* Copyright 1996-2011 */ | 7 /* Copyright 1996-2012 */ |
| 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ | 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
| 9 /* */ | 9 /* */ |
| 10 /* This file is part of the FreeType project, and may only be used, */ | 10 /* This file is part of the FreeType project, and may only be used, */ |
| 11 /* modified, and distributed under the terms of the FreeType project */ | 11 /* modified, and distributed under the terms of the FreeType project */ |
| 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ | 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
| 13 /* this file you indicate that you have read the license and */ | 13 /* this file you indicate that you have read the license and */ |
| 14 /* understand and accept it fully. */ | 14 /* understand and accept it fully. */ |
| 15 /* */ | 15 /* */ |
| 16 /***************************************************************************/ | 16 /***************************************************************************/ |
| 17 | 17 |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 goto Fail; | 355 goto Fail; |
| 356 | 356 |
| 357 /* reading the contours' endpoints & number of points */ | 357 /* reading the contours' endpoints & number of points */ |
| 358 cont = gloader->current.outline.contours; | 358 cont = gloader->current.outline.contours; |
| 359 cont_limit = cont + n_contours; | 359 cont_limit = cont + n_contours; |
| 360 | 360 |
| 361 /* check space for contours array + instructions count */ | 361 /* check space for contours array + instructions count */ |
| 362 if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit ) | 362 if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit ) |
| 363 goto Invalid_Outline; | 363 goto Invalid_Outline; |
| 364 | 364 |
| 365 prev_cont = FT_NEXT_USHORT( p ); | 365 prev_cont = FT_NEXT_SHORT( p ); |
| 366 | 366 |
| 367 if ( n_contours > 0 ) | 367 if ( n_contours > 0 ) |
| 368 cont[0] = prev_cont; | 368 cont[0] = prev_cont; |
| 369 | 369 |
| 370 if ( prev_cont < 0 ) |
| 371 goto Invalid_Outline; |
| 372 |
| 370 for ( cont++; cont < cont_limit; cont++ ) | 373 for ( cont++; cont < cont_limit; cont++ ) |
| 371 { | 374 { |
| 372 cont[0] = FT_NEXT_USHORT( p ); | 375 cont[0] = FT_NEXT_SHORT( p ); |
| 373 if ( cont[0] <= prev_cont ) | 376 if ( cont[0] <= prev_cont ) |
| 374 { | 377 { |
| 375 /* unordered contours: this is invalid */ | 378 /* unordered contours: this is invalid */ |
| 376 error = TT_Err_Invalid_Table; | 379 goto Invalid_Outline; |
| 377 goto Fail; | |
| 378 } | 380 } |
| 379 prev_cont = cont[0]; | 381 prev_cont = cont[0]; |
| 380 } | 382 } |
| 381 | 383 |
| 382 n_points = 0; | 384 n_points = 0; |
| 383 if ( n_contours > 0 ) | 385 if ( n_contours > 0 ) |
| 384 { | 386 { |
| 385 n_points = cont[-1] + 1; | 387 n_points = cont[-1] + 1; |
| 386 if ( n_points < 0 ) | 388 if ( n_points < 0 ) |
| 387 goto Invalid_Outline; | 389 goto Invalid_Outline; |
| 388 } | 390 } |
| 389 | 391 |
| 390 /* note that we will add four phantom points later */ | 392 /* note that we will add four phantom points later */ |
| 391 error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 ); | 393 error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 ); |
| 392 if ( error ) | 394 if ( error ) |
| 393 goto Fail; | 395 goto Fail; |
| 394 | 396 |
| 395 /* we'd better check the contours table right now */ | |
| 396 outline = &gloader->current.outline; | |
| 397 | |
| 398 for ( cont = outline->contours + 1; cont < cont_limit; cont++ ) | |
| 399 if ( cont[-1] >= cont[0] ) | |
| 400 goto Invalid_Outline; | |
| 401 | |
| 402 /* reading the bytecode instructions */ | 397 /* reading the bytecode instructions */ |
| 403 load->glyph->control_len = 0; | 398 load->glyph->control_len = 0; |
| 404 load->glyph->control_data = 0; | 399 load->glyph->control_data = 0; |
| 405 | 400 |
| 406 if ( p + 2 > limit ) | 401 if ( p + 2 > limit ) |
| 407 goto Invalid_Outline; | 402 goto Invalid_Outline; |
| 408 | 403 |
| 409 n_ins = FT_NEXT_USHORT( p ); | 404 n_ins = FT_NEXT_USHORT( p ); |
| 410 | 405 |
| 411 FT_TRACE5(( " Instructions size: %u\n", n_ins )); | 406 FT_TRACE5(( " Instructions size: %u\n", n_ins )); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 432 load->glyph->control_len = n_ins; | 427 load->glyph->control_len = n_ins; |
| 433 load->glyph->control_data = load->exec->glyphIns; | 428 load->glyph->control_data = load->exec->glyphIns; |
| 434 | 429 |
| 435 FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins ); | 430 FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins ); |
| 436 } | 431 } |
| 437 | 432 |
| 438 #endif /* TT_USE_BYTECODE_INTERPRETER */ | 433 #endif /* TT_USE_BYTECODE_INTERPRETER */ |
| 439 | 434 |
| 440 p += n_ins; | 435 p += n_ins; |
| 441 | 436 |
| 437 outline = &gloader->current.outline; |
| 438 |
| 442 /* reading the point tags */ | 439 /* reading the point tags */ |
| 443 flag = (FT_Byte*)outline->tags; | 440 flag = (FT_Byte*)outline->tags; |
| 444 flag_limit = flag + n_points; | 441 flag_limit = flag + n_points; |
| 445 | 442 |
| 446 FT_ASSERT( flag != NULL ); | 443 FT_ASSERT( flag != NULL ); |
| 447 | 444 |
| 448 while ( flag < flag_limit ) | 445 while ( flag < flag_limit ) |
| 449 { | 446 { |
| 450 if ( p + 1 > limit ) | 447 if ( p + 1 > limit ) |
| 451 goto Invalid_Outline; | 448 goto Invalid_Outline; |
| (...skipping 1653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2105 /* */ | 2102 /* */ |
| 2106 if ( !( load_flags & FT_LOAD_NO_SCALE ) && | 2103 if ( !( load_flags & FT_LOAD_NO_SCALE ) && |
| 2107 size->root.metrics.y_ppem < 24 ) | 2104 size->root.metrics.y_ppem < 24 ) |
| 2108 glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; | 2105 glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; |
| 2109 | 2106 |
| 2110 return error; | 2107 return error; |
| 2111 } | 2108 } |
| 2112 | 2109 |
| 2113 | 2110 |
| 2114 /* END */ | 2111 /* END */ |
| OLD | NEW |