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

Side by Side Diff: third_party/freetype/src/base/ftcalc.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/base/ftbitmap.c ('k') | third_party/freetype/src/base/ftcid.c » ('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 /* ftcalc.c */ 3 /* ftcalc.c */
4 /* */ 4 /* */
5 /* Arithmetic computations (body). */ 5 /* Arithmetic computations (body). */
6 /* */ 6 /* */
7 /* Copyright 1996-2006, 2008, 2012-2014 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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 FT_END_STMNT 79 FT_END_STMNT
80 80
81 /* The following three functions are available regardless of whether */ 81 /* The following three functions are available regardless of whether */
82 /* FT_LONG64 is defined. */ 82 /* FT_LONG64 is defined. */
83 83
84 /* documentation is in freetype.h */ 84 /* documentation is in freetype.h */
85 85
86 FT_EXPORT_DEF( FT_Fixed ) 86 FT_EXPORT_DEF( FT_Fixed )
87 FT_RoundFix( FT_Fixed a ) 87 FT_RoundFix( FT_Fixed a )
88 { 88 {
89 return ( a >= 0 ) ? ( a + 0x8000L ) & ~0xFFFFL 89 return ( a + 0x8000L - ( a < 0 ) ) & ~0xFFFFL;
90 : -((-a + 0x8000L ) & ~0xFFFFL );
91 } 90 }
92 91
93 92
94 /* documentation is in freetype.h */ 93 /* documentation is in freetype.h */
95 94
96 FT_EXPORT_DEF( FT_Fixed ) 95 FT_EXPORT_DEF( FT_Fixed )
97 FT_CeilFix( FT_Fixed a ) 96 FT_CeilFix( FT_Fixed a )
98 { 97 {
99 return ( a >= 0 ) ? ( a + 0xFFFFL ) & ~0xFFFFL 98 return ( a + 0xFFFFL ) & ~0xFFFFL;
100 : -((-a + 0xFFFFL ) & ~0xFFFFL );
101 } 99 }
102 100
103 101
104 /* documentation is in freetype.h */ 102 /* documentation is in freetype.h */
105 103
106 FT_EXPORT_DEF( FT_Fixed ) 104 FT_EXPORT_DEF( FT_Fixed )
107 FT_FloorFix( FT_Fixed a ) 105 FT_FloorFix( FT_Fixed a )
108 { 106 {
109 return ( a >= 0 ) ? a & ~0xFFFFL 107 return a & ~0xFFFFL;
110 : -((-a) & ~0xFFFFL );
111 } 108 }
112 109
113 #ifndef FT_MSB 110 #ifndef FT_MSB
114 111
115 FT_BASE_DEF ( FT_Int ) 112 FT_BASE_DEF ( FT_Int )
116 FT_MSB( FT_UInt32 z ) 113 FT_MSB( FT_UInt32 z )
117 { 114 {
118 FT_Int shift = 0; 115 FT_Int shift = 0;
116
119 117
120 /* determine msb bit index in `shift' */ 118 /* determine msb bit index in `shift' */
121 if ( z & 0xFFFF0000U ) 119 if ( z & 0xFFFF0000UL )
122 { 120 {
123 z >>= 16; 121 z >>= 16;
124 shift += 16; 122 shift += 16;
125 } 123 }
126 if ( z & 0x0000FF00U ) 124 if ( z & 0x0000FF00UL )
127 { 125 {
128 z >>= 8; 126 z >>= 8;
129 shift += 8; 127 shift += 8;
130 } 128 }
131 if ( z & 0x000000F0U ) 129 if ( z & 0x000000F0UL )
132 { 130 {
133 z >>= 4; 131 z >>= 4;
134 shift += 4; 132 shift += 4;
135 } 133 }
136 if ( z & 0x0000000CU ) 134 if ( z & 0x0000000CUL )
137 { 135 {
138 z >>= 2; 136 z >>= 2;
139 shift += 2; 137 shift += 2;
140 } 138 }
141 if ( z & 0x00000002U ) 139 if ( z & 0x00000002UL )
142 { 140 {
143 /* z >>= 1; */ 141 /* z >>= 1; */
144 shift += 1; 142 shift += 1;
145 } 143 }
146 144
147 return shift; 145 return shift;
148 } 146 }
149 147
150 #endif /* !FT_MSB */ 148 #endif /* !FT_MSB */
151 149
(...skipping 13 matching lines...) Expand all
165 return FT_Vector_Length( &v ); 163 return FT_Vector_Length( &v );
166 } 164 }
167 165
168 166
169 #ifdef FT_LONG64 167 #ifdef FT_LONG64
170 168
171 169
172 /* documentation is in freetype.h */ 170 /* documentation is in freetype.h */
173 171
174 FT_EXPORT_DEF( FT_Long ) 172 FT_EXPORT_DEF( FT_Long )
175 FT_MulDiv( FT_Long a, 173 FT_MulDiv( FT_Long a_,
176 FT_Long b, 174 FT_Long b_,
177 FT_Long c ) 175 FT_Long c_ )
178 { 176 {
179 FT_Int s = 1; 177 FT_Int s = 1;
180 FT_Long d; 178 FT_UInt64 a, b, c, d;
179 FT_Long d_;
181 180
182 181
183 FT_MOVE_SIGN( a, s ); 182 FT_MOVE_SIGN( a_, s );
184 FT_MOVE_SIGN( b, s ); 183 FT_MOVE_SIGN( b_, s );
185 FT_MOVE_SIGN( c, s ); 184 FT_MOVE_SIGN( c_, s );
186 185
187 d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c 186 a = (FT_UInt64)a_;
188 : 0x7FFFFFFFL ); 187 b = (FT_UInt64)b_;
188 c = (FT_UInt64)c_;
189 189
190 return ( s > 0 ) ? d : -d; 190 d = c > 0 ? ( a * b + ( c >> 1 ) ) / c
191 : 0x7FFFFFFFUL;
192
193 d_ = (FT_Long)d;
194
195 return s < 0 ? -d_ : d_;
191 } 196 }
192 197
193 198
194 /* documentation is in ftcalc.h */ 199 /* documentation is in ftcalc.h */
195 200
196 FT_BASE_DEF( FT_Long ) 201 FT_BASE_DEF( FT_Long )
197 FT_MulDiv_No_Round( FT_Long a, 202 FT_MulDiv_No_Round( FT_Long a_,
198 FT_Long b, 203 FT_Long b_,
199 FT_Long c ) 204 FT_Long c_ )
200 { 205 {
201 FT_Int s = 1; 206 FT_Int s = 1;
202 FT_Long d; 207 FT_UInt64 a, b, c, d;
208 FT_Long d_;
203 209
204 210
205 FT_MOVE_SIGN( a, s ); 211 FT_MOVE_SIGN( a_, s );
206 FT_MOVE_SIGN( b, s ); 212 FT_MOVE_SIGN( b_, s );
207 FT_MOVE_SIGN( c, s ); 213 FT_MOVE_SIGN( c_, s );
208 214
209 d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c 215 a = (FT_UInt64)a_;
210 : 0x7FFFFFFFL ); 216 b = (FT_UInt64)b_;
217 c = (FT_UInt64)c_;
211 218
212 return ( s > 0 ) ? d : -d; 219 d = c > 0 ? a * b / c
220 : 0x7FFFFFFFUL;
221
222 d_ = (FT_Long)d;
223
224 return s < 0 ? -d_ : d_;
213 } 225 }
214 226
215 227
216 /* documentation is in freetype.h */ 228 /* documentation is in freetype.h */
217 229
218 FT_EXPORT_DEF( FT_Long ) 230 FT_EXPORT_DEF( FT_Long )
219 FT_MulFix( FT_Long a, 231 FT_MulFix( FT_Long a_,
220 FT_Long b ) 232 FT_Long b_ )
221 { 233 {
222 #ifdef FT_MULFIX_ASSEMBLER 234 #ifdef FT_MULFIX_ASSEMBLER
223 235
224 return FT_MULFIX_ASSEMBLER( a, b ); 236 return FT_MULFIX_ASSEMBLER( a_, b_ );
225 237
226 #else 238 #else
227 239
228 FT_Int s = 1; 240 FT_Int64 ab = (FT_Int64)a_ * (FT_Int64)b_;
229 FT_Long c;
230 241
231 242 /* this requires arithmetic right shift of signed numbers */
232 FT_MOVE_SIGN( a, s ); 243 return (FT_Long)( ( ab + 0x8000L - ( ab < 0 ) ) >> 16 );
233 FT_MOVE_SIGN( b, s );
234
235 c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 );
236
237 return ( s > 0 ) ? c : -c;
238 244
239 #endif /* FT_MULFIX_ASSEMBLER */ 245 #endif /* FT_MULFIX_ASSEMBLER */
240 } 246 }
241 247
242 248
243 /* documentation is in freetype.h */ 249 /* documentation is in freetype.h */
244 250
245 FT_EXPORT_DEF( FT_Long ) 251 FT_EXPORT_DEF( FT_Long )
246 FT_DivFix( FT_Long a, 252 FT_DivFix( FT_Long a_,
247 FT_Long b ) 253 FT_Long b_ )
248 { 254 {
249 FT_Int s = 1; 255 FT_Int s = 1;
250 FT_Long q; 256 FT_UInt64 a, b, q;
257 FT_Long q_;
251 258
252 259
253 FT_MOVE_SIGN( a, s ); 260 FT_MOVE_SIGN( a_, s );
254 FT_MOVE_SIGN( b, s ); 261 FT_MOVE_SIGN( b_, s );
255 262
256 q = (FT_Long)( b > 0 ? ( ( (FT_UInt64)a << 16 ) + ( b >> 1 ) ) / b 263 a = (FT_UInt64)a_;
257 : 0x7FFFFFFFL ); 264 b = (FT_UInt64)b_;
258 265
259 return ( s < 0 ? -q : q ); 266 q = b > 0 ? ( ( a << 16 ) + ( b >> 1 ) ) / b
267 : 0x7FFFFFFFUL;
268
269 q_ = (FT_Long)q;
270
271 return s < 0 ? -q_ : q_;
260 } 272 }
261 273
262 274
263 #else /* !FT_LONG64 */ 275 #else /* !FT_LONG64 */
264 276
265 277
266 static void 278 static void
267 ft_multo64( FT_UInt32 x, 279 ft_multo64( FT_UInt32 x,
268 FT_UInt32 y, 280 FT_UInt32 y,
269 FT_Int64 *z ) 281 FT_Int64 *z )
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 /* */ 405 /* */
394 /* a << 16 <= X - c/2 */ 406 /* a << 16 <= X - c/2 */
395 /* */ 407 /* */
396 /* is scaled down by 2^16 and we use */ 408 /* is scaled down by 2^16 and we use */
397 /* */ 409 /* */
398 /* a <= 65535 - (c >> 17) . */ 410 /* a <= 65535 - (c >> 17) . */
399 411
400 /* documentation is in freetype.h */ 412 /* documentation is in freetype.h */
401 413
402 FT_EXPORT_DEF( FT_Long ) 414 FT_EXPORT_DEF( FT_Long )
403 FT_MulDiv( FT_Long a, 415 FT_MulDiv( FT_Long a_,
404 FT_Long b, 416 FT_Long b_,
405 FT_Long c ) 417 FT_Long c_ )
406 { 418 {
407 FT_Int s = 1; 419 FT_Int s = 1;
420 FT_UInt32 a, b, c;
408 421
409 422
410 /* XXX: this function does not allow 64-bit arguments */ 423 /* XXX: this function does not allow 64-bit arguments */
411 if ( a == 0 || b == c )
412 return a;
413 424
414 FT_MOVE_SIGN( a, s ); 425 FT_MOVE_SIGN( a_, s );
415 FT_MOVE_SIGN( b, s ); 426 FT_MOVE_SIGN( b_, s );
416 FT_MOVE_SIGN( c, s ); 427 FT_MOVE_SIGN( c_, s );
428
429 a = (FT_UInt32)a_;
430 b = (FT_UInt32)b_;
431 c = (FT_UInt32)c_;
417 432
418 if ( c == 0 ) 433 if ( c == 0 )
419 a = 0x7FFFFFFFL; 434 a = 0x7FFFFFFFUL;
420 435
421 else if ( (FT_ULong)a + b <= 129894UL - ( c >> 17 ) ) 436 else if ( a + b <= 129894UL - ( c >> 17 ) )
422 a = ( (FT_ULong)a * b + ( c >> 1 ) ) / c; 437 a = ( a * b + ( c >> 1 ) ) / c;
423 438
424 else 439 else
425 { 440 {
426 FT_Int64 temp, temp2; 441 FT_Int64 temp, temp2;
427 442
428 443
429 ft_multo64( a, b, &temp ); 444 ft_multo64( a, b, &temp );
430 445
431 temp2.hi = 0; 446 temp2.hi = 0;
432 temp2.lo = c >> 1; 447 temp2.lo = c >> 1;
433 448
434 FT_Add64( &temp, &temp2, &temp ); 449 FT_Add64( &temp, &temp2, &temp );
435 450
436 /* last attempt to ditch long division */ 451 /* last attempt to ditch long division */
437 a = temp.hi == 0 ? temp.lo / c 452 a = temp.hi == 0 ? temp.lo / c
438 : ft_div64by32( temp.hi, temp.lo, c ); 453 : ft_div64by32( temp.hi, temp.lo, c );
439 } 454 }
440 455
441 return ( s < 0 ? -a : a ); 456 a_ = (FT_Long)a;
457
458 return s < 0 ? -a_ : a_;
442 } 459 }
443 460
444 461
445 FT_BASE_DEF( FT_Long ) 462 FT_BASE_DEF( FT_Long )
446 FT_MulDiv_No_Round( FT_Long a, 463 FT_MulDiv_No_Round( FT_Long a_,
447 FT_Long b, 464 FT_Long b_,
448 FT_Long c ) 465 FT_Long c_ )
449 { 466 {
450 FT_Int s = 1; 467 FT_Int s = 1;
468 FT_UInt32 a, b, c;
451 469
452 470
453 if ( a == 0 || b == c ) 471 /* XXX: this function does not allow 64-bit arguments */
454 return a;
455 472
456 FT_MOVE_SIGN( a, s ); 473 FT_MOVE_SIGN( a_, s );
457 FT_MOVE_SIGN( b, s ); 474 FT_MOVE_SIGN( b_, s );
458 FT_MOVE_SIGN( c, s ); 475 FT_MOVE_SIGN( c_, s );
476
477 a = (FT_UInt32)a_;
478 b = (FT_UInt32)b_;
479 c = (FT_UInt32)c_;
459 480
460 if ( c == 0 ) 481 if ( c == 0 )
461 a = 0x7FFFFFFFL; 482 a = 0x7FFFFFFFUL;
462 483
463 else if ( (FT_ULong)a + b <= 131071UL ) 484 else if ( a + b <= 131071UL )
464 a = (FT_ULong)a * b / c; 485 a = a * b / c;
465 486
466 else 487 else
467 { 488 {
468 FT_Int64 temp; 489 FT_Int64 temp;
469 490
470 491
471 ft_multo64( a, b, &temp ); 492 ft_multo64( a, b, &temp );
472 493
473 /* last attempt to ditch long division */ 494 /* last attempt to ditch long division */
474 a = temp.hi == 0 ? temp.lo / c 495 a = temp.hi == 0 ? temp.lo / c
475 : ft_div64by32( temp.hi, temp.lo, c ); 496 : ft_div64by32( temp.hi, temp.lo, c );
476 } 497 }
477 498
478 return ( s < 0 ? -a : a ); 499 a_ = (FT_Long)a;
500
501 return s < 0 ? -a_ : a_;
479 } 502 }
480 503
481 504
482 /* documentation is in freetype.h */ 505 /* documentation is in freetype.h */
483 506
484 FT_EXPORT_DEF( FT_Long ) 507 FT_EXPORT_DEF( FT_Long )
485 FT_MulFix( FT_Long a, 508 FT_MulFix( FT_Long a_,
486 FT_Long b ) 509 FT_Long b_ )
487 { 510 {
488 #ifdef FT_MULFIX_ASSEMBLER 511 #ifdef FT_MULFIX_ASSEMBLER
489 512
490 return FT_MULFIX_ASSEMBLER( a, b ); 513 return FT_MULFIX_ASSEMBLER( a_, b_ );
491 514
492 #elif 0 515 #elif 0
493 516
494 /* 517 /*
495 * This code is nonportable. See comment below. 518 * This code is nonportable. See comment below.
496 * 519 *
497 * However, on a platform where right-shift of a signed quantity fills 520 * However, on a platform where right-shift of a signed quantity fills
498 * the leftmost bits by copying the sign bit, it might be faster. 521 * the leftmost bits by copying the sign bit, it might be faster.
499 */ 522 */
500 523
501 FT_Long sa, sb; 524 FT_Long sa, sb;
502 FT_ULong ua, ub; 525 FT_UInt32 a, b;
503 526
504 527
505 if ( a == 0 || b == 0x10000L )
506 return a;
507
508 /* 528 /*
509 * This is a clever way of converting a signed number `a' into its 529 * This is a clever way of converting a signed number `a' into its
510 * absolute value (stored back into `a') and its sign. The sign is 530 * absolute value (stored back into `a') and its sign. The sign is
511 * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a' 531 * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a'
512 * was negative. (Similarly for `b' and `sb'). 532 * was negative. (Similarly for `b' and `sb').
513 * 533 *
514 * Unfortunately, it doesn't work (at least not portably). 534 * Unfortunately, it doesn't work (at least not portably).
515 * 535 *
516 * It makes the assumption that right-shift on a negative signed value 536 * It makes the assumption that right-shift on a negative signed value
517 * fills the leftmost bits by copying the sign bit. This is wrong. 537 * fills the leftmost bits by copying the sign bit. This is wrong.
518 * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206, 538 * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206,
519 * the result of right-shift of a negative signed value is 539 * the result of right-shift of a negative signed value is
520 * implementation-defined. At least one implementation fills the 540 * implementation-defined. At least one implementation fills the
521 * leftmost bits with 0s (i.e., it is exactly the same as an unsigned 541 * leftmost bits with 0s (i.e., it is exactly the same as an unsigned
522 * right shift). This means that when `a' is negative, `sa' ends up 542 * right shift). This means that when `a' is negative, `sa' ends up
523 * with the value 1 rather than -1. After that, everything else goes 543 * with the value 1 rather than -1. After that, everything else goes
524 * wrong. 544 * wrong.
525 */ 545 */
526 sa = ( a >> ( sizeof ( a ) * 8 - 1 ) ); 546 sa = ( a_ >> ( sizeof ( a_ ) * 8 - 1 ) );
527 a = ( a ^ sa ) - sa; 547 a = ( a_ ^ sa ) - sa;
528 sb = ( b >> ( sizeof ( b ) * 8 - 1 ) ); 548 sb = ( b_ >> ( sizeof ( b_ ) * 8 - 1 ) );
529 b = ( b ^ sb ) - sb; 549 b = ( b_ ^ sb ) - sb;
530 550
531 ua = (FT_ULong)a; 551 a = (FT_UInt32)a_;
532 ub = (FT_ULong)b; 552 b = (FT_UInt32)b_;
533 553
534 if ( ua + ( ub >> 8 ) <= 8190UL ) 554 if ( a + ( b >> 8 ) <= 8190UL )
535 ua = ( ua * ub + 0x8000U ) >> 16; 555 a = ( a * b + 0x8000U ) >> 16;
536 else 556 else
537 { 557 {
538 FT_ULong al = ua & 0xFFFFU; 558 FT_UInt32 al = a & 0xFFFFUL;
539 559
540 560
541 ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) + 561 a = ( a >> 16 ) * b + al * ( b >> 16 ) +
542 ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 ); 562 ( ( al * ( b & 0xFFFFUL ) + 0x8000UL ) >> 16 );
543 } 563 }
544 564
545 sa ^= sb, 565 sa ^= sb;
546 ua = (FT_ULong)(( ua ^ sa ) - sa); 566 a = ( a ^ sa ) - sa;
547 567
548 return (FT_Long)ua; 568 return (FT_Long)a;
549 569
550 #else /* 0 */ 570 #else /* 0 */
551 571
552 FT_Int s = 1; 572 FT_Int s = 1;
553 FT_ULong ua, ub; 573 FT_UInt32 a, b;
554 574
555 575
556 if ( a == 0 || b == 0x10000L ) 576 /* XXX: this function does not allow 64-bit arguments */
557 return a;
558 577
559 FT_MOVE_SIGN( a, s ); 578 FT_MOVE_SIGN( a_, s );
560 FT_MOVE_SIGN( b, s ); 579 FT_MOVE_SIGN( b_, s );
561 580
562 ua = (FT_ULong)a; 581 a = (FT_UInt32)a_;
563 ub = (FT_ULong)b; 582 b = (FT_UInt32)b_;
564 583
565 if ( ua + ( ub >> 8 ) <= 8190UL ) 584 if ( a + ( b >> 8 ) <= 8190UL )
566 ua = ( ua * ub + 0x8000UL ) >> 16; 585 a = ( a * b + 0x8000UL ) >> 16;
567 else 586 else
568 { 587 {
569 FT_ULong al = ua & 0xFFFFUL; 588 FT_UInt32 al = a & 0xFFFFUL;
570 589
571 590
572 ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) + 591 a = ( a >> 16 ) * b + al * ( b >> 16 ) +
573 ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 ); 592 ( ( al * ( b & 0xFFFFUL ) + 0x8000UL ) >> 16 );
574 } 593 }
575 594
576 return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua ); 595 a_ = (FT_Long)a;
596
597 return s < 0 ? -a_ : a_;
577 598
578 #endif /* 0 */ 599 #endif /* 0 */
579 600
580 } 601 }
581 602
582 603
583 /* documentation is in freetype.h */ 604 /* documentation is in freetype.h */
584 605
585 FT_EXPORT_DEF( FT_Long ) 606 FT_EXPORT_DEF( FT_Long )
586 FT_DivFix( FT_Long a, 607 FT_DivFix( FT_Long a_,
587 FT_Long b ) 608 FT_Long b_ )
588 { 609 {
589 FT_Int s = 1; 610 FT_Int s = 1;
590 FT_Long q; 611 FT_UInt32 a, b, q;
612 FT_Long q_;
591 613
592 614
593 /* XXX: this function does not allow 64-bit arguments */ 615 /* XXX: this function does not allow 64-bit arguments */
594 616
595 FT_MOVE_SIGN( a, s ); 617 FT_MOVE_SIGN( a_, s );
596 FT_MOVE_SIGN( b, s ); 618 FT_MOVE_SIGN( b_, s );
619
620 a = (FT_UInt32)a_;
621 b = (FT_UInt32)b_;
597 622
598 if ( b == 0 ) 623 if ( b == 0 )
599 { 624 {
600 /* check for division by 0 */ 625 /* check for division by 0 */
601 q = 0x7FFFFFFFL; 626 q = 0x7FFFFFFFUL;
602 } 627 }
603 else if ( a <= 65535L - ( b >> 17 ) ) 628 else if ( a <= 65535UL - ( b >> 17 ) )
604 { 629 {
605 /* compute result directly */ 630 /* compute result directly */
606 q = (FT_Long)( ( ( (FT_ULong)a << 16 ) + ( b >> 1 ) ) / b ); 631 q = ( ( a << 16 ) + ( b >> 1 ) ) / b;
607 } 632 }
608 else 633 else
609 { 634 {
610 /* we need more bits; we have to do it by hand */ 635 /* we need more bits; we have to do it by hand */
611 FT_Int64 temp, temp2; 636 FT_Int64 temp, temp2;
612 637
613 638
614 temp.hi = a >> 16; 639 temp.hi = a >> 16;
615 temp.lo = a << 16; 640 temp.lo = a << 16;
616 temp2.hi = 0; 641 temp2.hi = 0;
617 temp2.lo = b >> 1; 642 temp2.lo = b >> 1;
618 643
619 FT_Add64( &temp, &temp2, &temp ); 644 FT_Add64( &temp, &temp2, &temp );
620 q = (FT_Long)ft_div64by32( temp.hi, temp.lo, b ); 645 q = ft_div64by32( temp.hi, temp.lo, b );
621 } 646 }
622 647
623 return ( s < 0 ? -q : q ); 648 q_ = (FT_Long)q;
649
650 return s < 0 ? -q_ : q_;
624 } 651 }
625 652
626 653
627 #endif /* FT_LONG64 */ 654 #endif /* !FT_LONG64 */
628 655
629 656
630 /* documentation is in ftglyph.h */ 657 /* documentation is in ftglyph.h */
631 658
632 FT_EXPORT_DEF( void ) 659 FT_EXPORT_DEF( void )
633 FT_Matrix_Multiply( const FT_Matrix* a, 660 FT_Matrix_Multiply( const FT_Matrix* a,
634 FT_Matrix *b ) 661 FT_Matrix *b )
635 { 662 {
636 FT_Fixed xx, xy, yx, yy; 663 FT_Fixed xx, xy, yx, yy;
637 664
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 FT_MulDiv( vector->y, matrix->xy, val ); 751 FT_MulDiv( vector->y, matrix->xy, val );
725 752
726 yz = FT_MulDiv( vector->x, matrix->yx, val ) + 753 yz = FT_MulDiv( vector->x, matrix->yx, val ) +
727 FT_MulDiv( vector->y, matrix->yy, val ); 754 FT_MulDiv( vector->y, matrix->yy, val );
728 755
729 vector->x = xz; 756 vector->x = xz;
730 vector->y = yz; 757 vector->y = yz;
731 } 758 }
732 759
733 760
761 /* documentation is in ftcalc.h */
762
763 FT_BASE_DEF( FT_UInt32 )
764 FT_Vector_NormLen( FT_Vector* vector )
765 {
766 FT_Int32 x_ = vector->x;
767 FT_Int32 y_ = vector->y;
768 FT_Int32 b, z;
769 FT_UInt32 x, y, u, v, l;
770 FT_Int sx = 1, sy = 1, shift;
771
772
773 FT_MOVE_SIGN( x_, sx );
774 FT_MOVE_SIGN( y_, sy );
775
776 x = (FT_UInt32)x_;
777 y = (FT_UInt32)y_;
778
779 /* trivial cases */
780 if ( x == 0 )
781 {
782 if ( y > 0 )
783 vector->y = sy * 0x10000;
784 return y;
785 }
786 else if ( y == 0 )
787 {
788 if ( x > 0 )
789 vector->x = sx * 0x10000;
790 return x;
791 }
792
793 /* Estimate length and prenormalize by shifting so that */
794 /* the new approximate length is between 2/3 and 4/3. */
795 /* The magic constant 0xAAAAAAAAUL (2/3 of 2^32) helps */
796 /* achieve this in 16.16 fixed-point representation. */
797 l = x > y ? x + ( y >> 1 )
798 : y + ( x >> 1 );
799
800 shift = 31 - FT_MSB( l );
801 shift -= 15 + ( l >= ( 0xAAAAAAAAUL >> shift ) );
802
803 if ( shift > 0 )
804 {
805 x <<= shift;
806 y <<= shift;
807
808 /* re-estimate length for tiny vectors */
809 l = x > y ? x + ( y >> 1 )
810 : y + ( x >> 1 );
811 }
812 else
813 {
814 x >>= -shift;
815 y >>= -shift;
816 l >>= -shift;
817 }
818
819 /* lower linear approximation for reciprocal length minus one */
820 b = 0x10000 - (FT_Int32)l;
821
822 x_ = (FT_Int32)x;
823 y_ = (FT_Int32)y;
824
825 /* Newton's iterations */
826 do
827 {
828 u = (FT_UInt32)( x_ + ( x_ * b >> 16 ) );
829 v = (FT_UInt32)( y_ + ( y_ * b >> 16 ) );
830
831 /* Normalized squared length in the parentheses approaches 2^32. */
832 /* On two's complement systems, converting to signed gives the */
833 /* difference with 2^32 even if the expression wraps around. */
834 z = -(FT_Int32)( u * u + v * v ) / 0x200;
835 z = z * ( ( 0x10000 + b ) >> 8 ) / 0x10000;
836
837 b += z;
838
839 } while ( z > 0 );
840
841 vector->x = sx < 0 ? -(FT_Pos)u : (FT_Pos)u;
842 vector->y = sy < 0 ? -(FT_Pos)v : (FT_Pos)v;
843
844 /* Conversion to signed helps to recover from likely wrap around */
845 /* in calculating the prenormalized length, because it gives the */
846 /* correct difference with 2^32 on two's complement systems. */
847 l = (FT_UInt32)( 0x10000 + (FT_Int32)( u * x + v * y ) / 0x10000 );
848 if ( shift > 0 )
849 l = ( l + ( 1 << ( shift - 1 ) ) ) >> shift;
850 else
851 l <<= -shift;
852
853 return l;
854 }
855
856
734 #if 0 857 #if 0
735 858
736 /* documentation is in ftcalc.h */ 859 /* documentation is in ftcalc.h */
737 860
738 FT_BASE_DEF( FT_Int32 ) 861 FT_BASE_DEF( FT_Int32 )
739 FT_SqrtFixed( FT_Int32 x ) 862 FT_SqrtFixed( FT_Int32 x )
740 { 863 {
741 FT_UInt32 root, rem_hi, rem_lo, test_div; 864 FT_UInt32 root, rem_hi, rem_lo, test_div;
742 FT_Int count; 865 FT_Int count;
743 866
744 867
745 root = 0; 868 root = 0;
746 869
747 if ( x > 0 ) 870 if ( x > 0 )
748 { 871 {
749 rem_hi = 0; 872 rem_hi = 0;
750 rem_lo = x; 873 rem_lo = (FT_UInt32)x;
751 count = 24; 874 count = 24;
752 do 875 do
753 { 876 {
754 rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 ); 877 rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 );
755 rem_lo <<= 2; 878 rem_lo <<= 2;
756 root <<= 1; 879 root <<= 1;
757 test_div = ( root << 1 ) + 1; 880 test_div = ( root << 1 ) + 1;
758 881
759 if ( rem_hi >= test_div ) 882 if ( rem_hi >= test_div )
760 { 883 {
(...skipping 10 matching lines...) Expand all
771 894
772 895
773 /* documentation is in ftcalc.h */ 896 /* documentation is in ftcalc.h */
774 897
775 FT_BASE_DEF( FT_Int ) 898 FT_BASE_DEF( FT_Int )
776 ft_corner_orientation( FT_Pos in_x, 899 ft_corner_orientation( FT_Pos in_x,
777 FT_Pos in_y, 900 FT_Pos in_y,
778 FT_Pos out_x, 901 FT_Pos out_x,
779 FT_Pos out_y ) 902 FT_Pos out_y )
780 { 903 {
781 FT_Long result; /* avoid overflow on 16-bit system */ 904 #ifdef FT_LONG64
905
906 FT_Int64 delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;
782 907
783 908
784 /* deal with the trivial cases quickly */ 909 return ( delta > 0 ) - ( delta < 0 );
785 if ( in_y == 0 )
786 {
787 if ( in_x >= 0 )
788 result = out_y;
789 else
790 result = -out_y;
791 }
792 else if ( in_x == 0 )
793 {
794 if ( in_y >= 0 )
795 result = -out_x;
796 else
797 result = out_x;
798 }
799 else if ( out_y == 0 )
800 {
801 if ( out_x >= 0 )
802 result = in_y;
803 else
804 result = -in_y;
805 }
806 else if ( out_x == 0 )
807 {
808 if ( out_y >= 0 )
809 result = -in_x;
810 else
811 result = in_x;
812 }
813 else /* general case */
814 {
815 #ifdef FT_LONG64
816
817 FT_Int64 delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;
818
819
820 if ( delta == 0 )
821 result = 0;
822 else
823 result = 1 - 2 * ( delta < 0 );
824 910
825 #else 911 #else
826 912
913 FT_Int result;
914
915
916 if ( (FT_ULong)FT_ABS( in_x ) + (FT_ULong)FT_ABS( out_y ) <= 131071UL &&
917 (FT_ULong)FT_ABS( in_y ) + (FT_ULong)FT_ABS( out_x ) <= 131071UL )
918 {
919 FT_Long z1 = in_x * out_y;
920 FT_Long z2 = in_y * out_x;
921
922
923 if ( z1 > z2 )
924 result = +1;
925 else if ( z1 < z2 )
926 result = -1;
927 else
928 result = 0;
929 }
930 else /* products might overflow 32 bits */
931 {
827 FT_Int64 z1, z2; 932 FT_Int64 z1, z2;
828 933
829 934
830 /* XXX: this function does not allow 64-bit arguments */ 935 /* XXX: this function does not allow 64-bit arguments */
831 ft_multo64( (FT_Int32)in_x, (FT_Int32)out_y, &z1 ); 936 ft_multo64( (FT_UInt32)in_x, (FT_UInt32)out_y, &z1 );
832 ft_multo64( (FT_Int32)in_y, (FT_Int32)out_x, &z2 ); 937 ft_multo64( (FT_UInt32)in_y, (FT_UInt32)out_x, &z2 );
833 938
834 if ( z1.hi > z2.hi ) 939 if ( z1.hi > z2.hi )
835 result = +1; 940 result = +1;
836 else if ( z1.hi < z2.hi ) 941 else if ( z1.hi < z2.hi )
837 result = -1; 942 result = -1;
838 else if ( z1.lo > z2.lo ) 943 else if ( z1.lo > z2.lo )
839 result = +1; 944 result = +1;
840 else if ( z1.lo < z2.lo ) 945 else if ( z1.lo < z2.lo )
841 result = -1; 946 result = -1;
842 else 947 else
843 result = 0; 948 result = 0;
844
845 #endif
846 } 949 }
847 950
848 /* XXX: only the sign of return value, +1/0/-1 must be used */ 951 /* XXX: only the sign of return value, +1/0/-1 must be used */
849 return (FT_Int)result; 952 return result;
953
954 #endif
850 } 955 }
851 956
852 957
853 /* documentation is in ftcalc.h */ 958 /* documentation is in ftcalc.h */
854 959
855 FT_BASE_DEF( FT_Int ) 960 FT_BASE_DEF( FT_Int )
856 ft_corner_is_flat( FT_Pos in_x, 961 ft_corner_is_flat( FT_Pos in_x,
857 FT_Pos in_y, 962 FT_Pos in_y,
858 FT_Pos out_x, 963 FT_Pos out_x,
859 FT_Pos out_y ) 964 FT_Pos out_y )
(...skipping 29 matching lines...) Expand all
889 994
890 /* now do a simple length comparison: */ 995 /* now do a simple length comparison: */
891 /* */ 996 /* */
892 /* d_in + d_out < 17/16 d_hypot */ 997 /* d_in + d_out < 17/16 d_hypot */
893 998
894 return ( d_in + d_out - d_hypot ) < ( d_hypot >> 4 ); 999 return ( d_in + d_out - d_hypot ) < ( d_hypot >> 4 );
895 } 1000 }
896 1001
897 1002
898 /* END */ 1003 /* END */
OLDNEW
« no previous file with comments | « third_party/freetype/src/base/ftbitmap.c ('k') | third_party/freetype/src/base/ftcid.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698