Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(327)

Side by Side Diff: third_party/freetype/src/cid/cidgload.c

Issue 1413673003: Update bundled freetype to 2.6.1 (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: DEPS for corpus Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/freetype/src/cid/cidgload.h ('k') | third_party/freetype/src/cid/cidload.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /***************************************************************************/ 1 /***************************************************************************/
2 /* */ 2 /* */
3 /* cidgload.c */ 3 /* cidgload.c */
4 /* */ 4 /* */
5 /* CID-keyed Type1 Glyph Loader (body). */ 5 /* CID-keyed Type1 Glyph Loader (body). */
6 /* */ 6 /* */
7 /* Copyright 1996-2007, 2009, 2010, 2013 by */ 7 /* Copyright 1996-2015 by */
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 19 matching lines...) Expand all
37 #define FT_COMPONENT trace_cidgload 37 #define FT_COMPONENT trace_cidgload
38 38
39 39
40 FT_CALLBACK_DEF( FT_Error ) 40 FT_CALLBACK_DEF( FT_Error )
41 cid_load_glyph( T1_Decoder decoder, 41 cid_load_glyph( T1_Decoder decoder,
42 FT_UInt glyph_index ) 42 FT_UInt glyph_index )
43 { 43 {
44 CID_Face face = (CID_Face)decoder->builder.face; 44 CID_Face face = (CID_Face)decoder->builder.face;
45 CID_FaceInfo cid = &face->cid; 45 CID_FaceInfo cid = &face->cid;
46 FT_Byte* p; 46 FT_Byte* p;
47 FT_UInt fd_select; 47 FT_ULong fd_select;
48 FT_Stream stream = face->cid_stream; 48 FT_Stream stream = face->cid_stream;
49 FT_Error error = FT_Err_Ok; 49 FT_Error error = FT_Err_Ok;
50 FT_Byte* charstring = 0; 50 FT_Byte* charstring = NULL;
51 FT_Memory memory = face->root.memory; 51 FT_Memory memory = face->root.memory;
52 FT_ULong glyph_length = 0; 52 FT_ULong glyph_length = 0;
53 PSAux_Service psaux = (PSAux_Service)face->psaux; 53 PSAux_Service psaux = (PSAux_Service)face->psaux;
54 54
55 #ifdef FT_CONFIG_OPTION_INCREMENTAL 55 #ifdef FT_CONFIG_OPTION_INCREMENTAL
56 FT_Incremental_InterfaceRec *inc = 56 FT_Incremental_InterfaceRec *inc =
57 face->root.internal->incremental_interface; 57 face->root.internal->incremental_interface;
58 #endif 58 #endif
59 59
60 60
61 FT_TRACE1(( "cid_load_glyph: glyph index %d\n", glyph_index )); 61 FT_TRACE1(( "cid_load_glyph: glyph index %d\n", glyph_index ));
62 62
63 #ifdef FT_CONFIG_OPTION_INCREMENTAL 63 #ifdef FT_CONFIG_OPTION_INCREMENTAL
64 64
65 /* For incremental fonts get the character data using */ 65 /* For incremental fonts get the character data using */
66 /* the callback function. */ 66 /* the callback function. */
67 if ( inc ) 67 if ( inc )
68 { 68 {
69 FT_Data glyph_data; 69 FT_Data glyph_data;
70 70
71 71
72 error = inc->funcs->get_glyph_data( inc->object, 72 error = inc->funcs->get_glyph_data( inc->object,
73 glyph_index, &glyph_data ); 73 glyph_index, &glyph_data );
74 if ( error ) 74 if ( error )
75 goto Exit; 75 goto Exit;
76 76
77 p = (FT_Byte*)glyph_data.pointer; 77 p = (FT_Byte*)glyph_data.pointer;
78 fd_select = (FT_UInt)cid_get_offset( &p, (FT_Byte)cid->fd_bytes ); 78 fd_select = cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
79 79
80 if ( glyph_data.length != 0 ) 80 if ( glyph_data.length != 0 )
81 { 81 {
82 glyph_length = glyph_data.length - cid->fd_bytes; 82 glyph_length = (FT_ULong)( glyph_data.length - cid->fd_bytes );
83 (void)FT_ALLOC( charstring, glyph_length ); 83 (void)FT_ALLOC( charstring, glyph_length );
84 if ( !error ) 84 if ( !error )
85 ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes, 85 ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes,
86 glyph_length ); 86 glyph_length );
87 } 87 }
88 88
89 inc->funcs->free_glyph_data( inc->object, &glyph_data ); 89 inc->funcs->free_glyph_data( inc->object, &glyph_data );
90 90
91 if ( error ) 91 if ( error )
92 goto Exit; 92 goto Exit;
93 } 93 }
94 94
95 else 95 else
96 96
97 #endif /* FT_CONFIG_OPTION_INCREMENTAL */ 97 #endif /* FT_CONFIG_OPTION_INCREMENTAL */
98 98
99 /* For ordinary fonts read the CID font dictionary index */ 99 /* For ordinary fonts read the CID font dictionary index */
100 /* and charstring offset from the CIDMap. */ 100 /* and charstring offset from the CIDMap. */
101 { 101 {
102 FT_UInt entry_len = cid->fd_bytes + cid->gd_bytes; 102 FT_UInt entry_len = (FT_UInt)( cid->fd_bytes + cid->gd_bytes );
103 FT_ULong off1; 103 FT_ULong off1;
104 104
105 105
106 if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset + 106 if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset +
107 glyph_index * entry_len ) || 107 glyph_index * entry_len ) ||
108 FT_FRAME_ENTER( 2 * entry_len ) ) 108 FT_FRAME_ENTER( 2 * entry_len ) )
109 goto Exit; 109 goto Exit;
110 110
111 p = (FT_Byte*)stream->cursor; 111 p = (FT_Byte*)stream->cursor;
112 fd_select = (FT_UInt) cid_get_offset( &p, (FT_Byte)cid->fd_bytes ); 112 fd_select = cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
113 off1 = (FT_ULong)cid_get_offset( &p, (FT_Byte)cid->gd_bytes ); 113 off1 = cid_get_offset( &p, (FT_Byte)cid->gd_bytes );
114 p += cid->fd_bytes; 114 p += cid->fd_bytes;
115 glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1; 115 glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1;
116 FT_FRAME_EXIT(); 116 FT_FRAME_EXIT();
117 117
118 if ( fd_select >= (FT_UInt)cid->num_dicts ) 118 if ( fd_select >= (FT_ULong)cid->num_dicts )
119 { 119 {
120 error = FT_THROW( Invalid_Offset ); 120 error = FT_THROW( Invalid_Offset );
121 goto Exit; 121 goto Exit;
122 } 122 }
123 if ( glyph_length == 0 ) 123 if ( glyph_length == 0 )
124 goto Exit; 124 goto Exit;
125 if ( FT_ALLOC( charstring, glyph_length ) ) 125 if ( FT_ALLOC( charstring, glyph_length ) )
126 goto Exit; 126 goto Exit;
127 if ( FT_STREAM_READ_AT( cid->data_offset + off1, 127 if ( FT_STREAM_READ_AT( cid->data_offset + off1,
128 charstring, glyph_length ) ) 128 charstring, glyph_length ) )
129 goto Exit; 129 goto Exit;
130 } 130 }
131 131
132 /* Now set up the subrs array and parse the charstrings. */ 132 /* Now set up the subrs array and parse the charstrings. */
133 { 133 {
134 CID_FaceDict dict; 134 CID_FaceDict dict;
135 CID_Subrs cid_subrs = face->subrs + fd_select; 135 CID_Subrs cid_subrs = face->subrs + fd_select;
136 FT_Int cs_offset; 136 FT_UInt cs_offset;
137 137
138 138
139 /* Set up subrs */ 139 /* Set up subrs */
140 decoder->num_subrs = cid_subrs->num_subrs; 140 decoder->num_subrs = cid_subrs->num_subrs;
141 decoder->subrs = cid_subrs->code; 141 decoder->subrs = cid_subrs->code;
142 decoder->subrs_len = 0; 142 decoder->subrs_len = 0;
143 143
144 /* Set up font matrix */ 144 /* Set up font matrix */
145 dict = cid->font_dicts + fd_select; 145 dict = cid->font_dicts + fd_select;
146 146
147 decoder->font_matrix = dict->font_matrix; 147 decoder->font_matrix = dict->font_matrix;
148 decoder->font_offset = dict->font_offset; 148 decoder->font_offset = dict->font_offset;
149 decoder->lenIV = dict->private_dict.lenIV; 149 decoder->lenIV = dict->private_dict.lenIV;
150 150
151 /* Decode the charstring. */ 151 /* Decode the charstring. */
152 152
153 /* Adjustment for seed bytes. */ 153 /* Adjustment for seed bytes. */
154 cs_offset = ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); 154 cs_offset = decoder->lenIV >= 0 ? (FT_UInt)decoder->lenIV : 0;
155 155
156 /* Decrypt only if lenIV >= 0. */ 156 /* Decrypt only if lenIV >= 0. */
157 if ( decoder->lenIV >= 0 ) 157 if ( decoder->lenIV >= 0 )
158 psaux->t1_decrypt( charstring, glyph_length, 4330 ); 158 psaux->t1_decrypt( charstring, glyph_length, 4330 );
159 159
160 error = decoder->funcs.parse_charstrings( 160 error = decoder->funcs.parse_charstrings(
161 decoder, charstring + cs_offset, 161 decoder, charstring + cs_offset,
162 (FT_Int)glyph_length - cs_offset ); 162 glyph_length - cs_offset );
163 } 163 }
164 164
165 FT_FREE( charstring ); 165 FT_FREE( charstring );
166 166
167 #ifdef FT_CONFIG_OPTION_INCREMENTAL 167 #ifdef FT_CONFIG_OPTION_INCREMENTAL
168 168
169 /* Incremental fonts can optionally override the metrics. */ 169 /* Incremental fonts can optionally override the metrics. */
170 if ( !error && inc && inc->funcs->get_glyph_metrics ) 170 if ( !error && inc && inc->funcs->get_glyph_metrics )
171 { 171 {
172 FT_Incremental_MetricsRec metrics; 172 FT_Incremental_MetricsRec metrics;
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 FIXED_TO_INT( decoder.builder.advance.x ); 350 FIXED_TO_INT( decoder.builder.advance.x );
351 351
352 internal->glyph_matrix = font_matrix; 352 internal->glyph_matrix = font_matrix;
353 internal->glyph_delta = font_offset; 353 internal->glyph_delta = font_offset;
354 internal->glyph_transformed = 1; 354 internal->glyph_transformed = 1;
355 } 355 }
356 else 356 else
357 { 357 {
358 FT_BBox cbox; 358 FT_BBox cbox;
359 FT_Glyph_Metrics* metrics = &cidglyph->metrics; 359 FT_Glyph_Metrics* metrics = &cidglyph->metrics;
360 FT_Vector advance;
361 360
362 361
363 /* copy the _unscaled_ advance width */ 362 /* copy the _unscaled_ advance width */
364 metrics->horiAdvance = 363 metrics->horiAdvance =
365 FIXED_TO_INT( decoder.builder.advance.x ); 364 FIXED_TO_INT( decoder.builder.advance.x );
366 cidglyph->linearHoriAdvance = 365 cidglyph->linearHoriAdvance =
367 FIXED_TO_INT( decoder.builder.advance.x ); 366 FIXED_TO_INT( decoder.builder.advance.x );
368 cidglyph->internal->glyph_transformed = 0; 367 cidglyph->internal->glyph_transformed = 0;
369 368
370 /* make up vertical ones */ 369 /* make up vertical ones */
371 metrics->vertAdvance = ( face->cid.font_bbox.yMax - 370 metrics->vertAdvance = ( face->cid.font_bbox.yMax -
372 face->cid.font_bbox.yMin ) >> 16; 371 face->cid.font_bbox.yMin ) >> 16;
373 cidglyph->linearVertAdvance = metrics->vertAdvance; 372 cidglyph->linearVertAdvance = metrics->vertAdvance;
374 373
375 cidglyph->format = FT_GLYPH_FORMAT_OUTLINE; 374 cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
376 375
377 if ( cidsize->metrics.y_ppem < 24 ) 376 if ( cidsize->metrics.y_ppem < 24 )
378 cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; 377 cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
379 378
380 /* apply the font matrix */ 379 /* apply the font matrix, if any */
381 FT_Outline_Transform( &cidglyph->outline, &font_matrix ); 380 if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L ||
381 font_matrix.xy != 0 || font_matrix.yx != 0 )
382 {
383 FT_Outline_Transform( &cidglyph->outline, &font_matrix );
382 384
383 FT_Outline_Translate( &cidglyph->outline, 385 metrics->horiAdvance = FT_MulFix( metrics->horiAdvance,
384 font_offset.x, 386 font_matrix.xx );
385 font_offset.y ); 387 metrics->vertAdvance = FT_MulFix( metrics->vertAdvance,
388 font_matrix.yy );
389 }
386 390
387 advance.x = metrics->horiAdvance; 391 if ( font_offset.x || font_offset.y )
388 advance.y = 0; 392 {
389 FT_Vector_Transform( &advance, &font_matrix ); 393 FT_Outline_Translate( &cidglyph->outline,
390 metrics->horiAdvance = advance.x + font_offset.x; 394 font_offset.x,
395 font_offset.y );
391 396
392 advance.x = 0; 397 metrics->horiAdvance += font_offset.x;
393 advance.y = metrics->vertAdvance; 398 metrics->vertAdvance += font_offset.y;
394 FT_Vector_Transform( &advance, &font_matrix ); 399 }
395 metrics->vertAdvance = advance.y + font_offset.y;
396 400
397 if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ) 401 if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
398 { 402 {
399 /* scale the outline and the metrics */ 403 /* scale the outline and the metrics */
400 FT_Int n; 404 FT_Int n;
401 FT_Outline* cur = decoder.builder.base; 405 FT_Outline* cur = decoder.builder.base;
402 FT_Vector* vec = cur->points; 406 FT_Vector* vec = cur->points;
403 FT_Fixed x_scale = glyph->x_scale; 407 FT_Fixed x_scale = glyph->x_scale;
404 FT_Fixed y_scale = glyph->y_scale; 408 FT_Fixed y_scale = glyph->y_scale;
405 409
(...skipping 27 matching lines...) Expand all
433 metrics->vertAdvance ); 437 metrics->vertAdvance );
434 } 438 }
435 } 439 }
436 440
437 Exit: 441 Exit:
438 return error; 442 return error;
439 } 443 }
440 444
441 445
442 /* END */ 446 /* END */
OLDNEW
« no previous file with comments | « third_party/freetype/src/cid/cidgload.h ('k') | third_party/freetype/src/cid/cidload.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698