| OLD | NEW |
| 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-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ | 7 /* Copyright 1996-2006, 2008, 2012 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 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 if ( r >= y ) | 300 if ( r >= y ) |
| 301 return (FT_UInt32)0x7FFFFFFFL; | 301 return (FT_UInt32)0x7FFFFFFFL; |
| 302 | 302 |
| 303 i = 32; | 303 i = 32; |
| 304 do | 304 do |
| 305 { | 305 { |
| 306 r <<= 1; | 306 r <<= 1; |
| 307 q <<= 1; | 307 q <<= 1; |
| 308 r |= lo >> 31; | 308 r |= lo >> 31; |
| 309 | 309 |
| 310 if ( r >= (FT_UInt32)y ) | 310 if ( r >= y ) |
| 311 { | 311 { |
| 312 r -= y; | 312 r -= y; |
| 313 q |= 1; | 313 q |= 1; |
| 314 } | 314 } |
| 315 lo <<= 1; | 315 lo <<= 1; |
| 316 } while ( --i ); | 316 } while ( --i ); |
| 317 | 317 |
| 318 return q; | 318 return q; |
| 319 } | 319 } |
| 320 | 320 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 if ( a == 0 || b == c ) | 366 if ( a == 0 || b == c ) |
| 367 return a; | 367 return a; |
| 368 | 368 |
| 369 s = a; a = FT_ABS( a ); | 369 s = a; a = FT_ABS( a ); |
| 370 s ^= b; b = FT_ABS( b ); | 370 s ^= b; b = FT_ABS( b ); |
| 371 s ^= c; c = FT_ABS( c ); | 371 s ^= c; c = FT_ABS( c ); |
| 372 | 372 |
| 373 if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 ) | 373 if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 ) |
| 374 a = ( a * b + ( c >> 1 ) ) / c; | 374 a = ( a * b + ( c >> 1 ) ) / c; |
| 375 | 375 |
| 376 else if ( c > 0 ) | 376 else if ( (FT_Int32)c > 0 ) |
| 377 { | 377 { |
| 378 FT_Int64 temp, temp2; | 378 FT_Int64 temp, temp2; |
| 379 | 379 |
| 380 | 380 |
| 381 ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp ); | 381 ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp ); |
| 382 | 382 |
| 383 temp2.hi = 0; | 383 temp2.hi = 0; |
| 384 temp2.lo = (FT_UInt32)(c >> 1); | 384 temp2.lo = (FT_UInt32)(c >> 1); |
| 385 FT_Add64( &temp, &temp2, &temp ); | 385 FT_Add64( &temp, &temp2, &temp ); |
| 386 a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c ); | 386 a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c ); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 405 if ( a == 0 || b == c ) | 405 if ( a == 0 || b == c ) |
| 406 return a; | 406 return a; |
| 407 | 407 |
| 408 s = a; a = FT_ABS( a ); | 408 s = a; a = FT_ABS( a ); |
| 409 s ^= b; b = FT_ABS( b ); | 409 s ^= b; b = FT_ABS( b ); |
| 410 s ^= c; c = FT_ABS( c ); | 410 s ^= c; c = FT_ABS( c ); |
| 411 | 411 |
| 412 if ( a <= 46340L && b <= 46340L && c > 0 ) | 412 if ( a <= 46340L && b <= 46340L && c > 0 ) |
| 413 a = a * b / c; | 413 a = a * b / c; |
| 414 | 414 |
| 415 else if ( c > 0 ) | 415 else if ( (FT_Int32)c > 0 ) |
| 416 { | 416 { |
| 417 FT_Int64 temp; | 417 FT_Int64 temp; |
| 418 | 418 |
| 419 | 419 |
| 420 ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp ); | 420 ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp ); |
| 421 a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c ); | 421 a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c ); |
| 422 } | 422 } |
| 423 else | 423 else |
| 424 a = 0x7FFFFFFFL; | 424 a = 0x7FFFFFFFL; |
| 425 | 425 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 | 457 |
| 458 /* | 458 /* |
| 459 * This is a clever way of converting a signed number `a' into its | 459 * This is a clever way of converting a signed number `a' into its |
| 460 * absolute value (stored back into `a') and its sign. The sign is | 460 * absolute value (stored back into `a') and its sign. The sign is |
| 461 * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a' | 461 * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a' |
| 462 * was negative. (Similarly for `b' and `sb'). | 462 * was negative. (Similarly for `b' and `sb'). |
| 463 * | 463 * |
| 464 * Unfortunately, it doesn't work (at least not portably). | 464 * Unfortunately, it doesn't work (at least not portably). |
| 465 * | 465 * |
| 466 * It makes the assumption that right-shift on a negative signed value | 466 * It makes the assumption that right-shift on a negative signed value |
| 467 * fills the leftmost bits by copying the sign bit. This is wrong. | 467 * fills the leftmost bits by copying the sign bit. This is wrong. |
| 468 * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206, | 468 * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206, |
| 469 * the result of right-shift of a negative signed value is | 469 * the result of right-shift of a negative signed value is |
| 470 * implementation-defined. At least one implementation fills the | 470 * implementation-defined. At least one implementation fills the |
| 471 * leftmost bits with 0s (i.e., it is exactly the same as an unsigned | 471 * leftmost bits with 0s (i.e., it is exactly the same as an unsigned |
| 472 * right shift). This means that when `a' is negative, `sa' ends up | 472 * right shift). This means that when `a' is negative, `sa' ends up |
| 473 * with the value 1 rather than -1. After that, everything else goes | 473 * with the value 1 rather than -1. After that, everything else goes |
| 474 * wrong. | 474 * wrong. |
| 475 */ | 475 */ |
| 476 sa = ( a >> ( sizeof ( a ) * 8 - 1 ) ); | 476 sa = ( a >> ( sizeof ( a ) * 8 - 1 ) ); |
| 477 a = ( a ^ sa ) - sa; | 477 a = ( a ^ sa ) - sa; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 FT_Long b ) | 537 FT_Long b ) |
| 538 { | 538 { |
| 539 FT_Int32 s; | 539 FT_Int32 s; |
| 540 FT_UInt32 q; | 540 FT_UInt32 q; |
| 541 | 541 |
| 542 | 542 |
| 543 /* XXX: this function does not allow 64-bit arguments */ | 543 /* XXX: this function does not allow 64-bit arguments */ |
| 544 s = (FT_Int32)a; a = FT_ABS( a ); | 544 s = (FT_Int32)a; a = FT_ABS( a ); |
| 545 s ^= (FT_Int32)b; b = FT_ABS( b ); | 545 s ^= (FT_Int32)b; b = FT_ABS( b ); |
| 546 | 546 |
| 547 if ( b == 0 ) | 547 if ( (FT_UInt32)b == 0 ) |
| 548 { | 548 { |
| 549 /* check for division by 0 */ | 549 /* check for division by 0 */ |
| 550 q = (FT_UInt32)0x7FFFFFFFL; | 550 q = (FT_UInt32)0x7FFFFFFFL; |
| 551 } | 551 } |
| 552 else if ( ( a >> 16 ) == 0 ) | 552 else if ( ( a >> 16 ) == 0 ) |
| 553 { | 553 { |
| 554 /* compute result directly */ | 554 /* compute result directly */ |
| 555 q = (FT_UInt32)( (a << 16) + (b >> 1) ) / (FT_UInt32)b; | 555 q = (FT_UInt32)( ( a << 16 ) + ( b >> 1 ) ) / (FT_UInt32)b; |
| 556 } | 556 } |
| 557 else | 557 else |
| 558 { | 558 { |
| 559 /* we need more bits; we have to do it by hand */ | 559 /* we need more bits; we have to do it by hand */ |
| 560 FT_Int64 temp, temp2; | 560 FT_Int64 temp, temp2; |
| 561 | 561 |
| 562 temp.hi = (FT_Int32) (a >> 16); | 562 |
| 563 temp.lo = (FT_UInt32)(a << 16); | 563 temp.hi = (FT_Int32) ( a >> 16 ); |
| 564 temp.lo = (FT_UInt32)( a << 16 ); |
| 564 temp2.hi = 0; | 565 temp2.hi = 0; |
| 565 temp2.lo = (FT_UInt32)( b >> 1 ); | 566 temp2.lo = (FT_UInt32)( b >> 1 ); |
| 566 FT_Add64( &temp, &temp2, &temp ); | 567 FT_Add64( &temp, &temp2, &temp ); |
| 567 q = ft_div64by32( temp.hi, temp.lo, (FT_Int32)b ); | 568 q = ft_div64by32( temp.hi, temp.lo, (FT_Int32)b ); |
| 568 } | 569 } |
| 569 | 570 |
| 570 return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); | 571 return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); |
| 571 } | 572 } |
| 572 | 573 |
| 573 | 574 |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 948 ay = out_y + in_y; | 949 ay = out_y + in_y; |
| 949 if ( ay < 0 ) | 950 if ( ay < 0 ) |
| 950 ay = -ay; | 951 ay = -ay; |
| 951 d_corner = ax + ay; | 952 d_corner = ax + ay; |
| 952 | 953 |
| 953 return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); | 954 return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); |
| 954 } | 955 } |
| 955 | 956 |
| 956 | 957 |
| 957 /* END */ | 958 /* END */ |
| OLD | NEW |