| /*****************************************************************************/ |
| // Copyright 2006 Adobe Systems Incorporated |
| // All Rights Reserved. |
| // |
| // NOTICE: Adobe permits you to use, modify, and distribute this file in |
| // accordance with the terms of the Adobe license agreement accompanying it. |
| /*****************************************************************************/ |
| |
| /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_rational.cpp#1 $ */ |
| /* $DateTime: 2012/05/30 13:28:51 $ */ |
| /* $Change: 832332 $ */ |
| /* $Author: tknoll $ */ |
| |
| /*****************************************************************************/ |
| |
| #include "dng_rational.h" |
| |
| #include "dng_utils.h" |
| |
| /*****************************************************************************/ |
| |
| real64 dng_srational::As_real64 () const |
| { |
| |
| if (d) |
| return (real64) n / (real64) d; |
| |
| else |
| return 0.0; |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| void dng_srational::Set_real64 (real64 x, int32 dd) |
| { |
| |
| if (x == 0.0) |
| { |
| |
| *this = dng_srational (0, 1); |
| |
| } |
| |
| if (dd == 0) |
| { |
| |
| real64 y = Abs_real64 (x); |
| |
| if (y >= 32768.0) |
| { |
| dd = 1; |
| } |
| |
| else if (y >= 1.0) |
| { |
| dd = 32768; |
| } |
| |
| else |
| { |
| dd = 32768 * 32768; |
| } |
| |
| } |
| |
| *this = dng_srational (Round_int32 (x * dd), dd); |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| void dng_srational::ReduceByFactor (int32 factor) |
| { |
| |
| while (n % factor == 0 && |
| d % factor == 0 && |
| d >= factor) |
| { |
| n /= factor; |
| d /= factor; |
| } |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| real64 dng_urational::As_real64 () const |
| { |
| |
| if (d) |
| return (real64) n / (real64) d; |
| |
| else |
| return 0.0; |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| void dng_urational::Set_real64 (real64 x, uint32 dd) |
| { |
| |
| if (x <= 0.0) |
| { |
| |
| *this = dng_urational (0, 1); |
| |
| } |
| |
| if (dd == 0) |
| { |
| |
| if (x >= 32768.0) |
| { |
| dd = 1; |
| } |
| |
| else if (x >= 1.0) |
| { |
| dd = 32768; |
| } |
| |
| else |
| { |
| dd = 32768 * 32768; |
| } |
| |
| } |
| |
| *this = dng_urational (Round_uint32 (x * dd), dd); |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| void dng_urational::ReduceByFactor (uint32 factor) |
| { |
| |
| while (n % factor == 0 && |
| d % factor == 0 && |
| d >= factor) |
| { |
| n /= factor; |
| d /= factor; |
| } |
| |
| } |
| |
| /*****************************************************************************/ |