File indexing completed on 2025-01-19 03:55:12
0001 /*****************************************************************************/ 0002 // Copyright 2006-2019 Adobe Systems Incorporated 0003 // All Rights Reserved. 0004 // 0005 // NOTICE: Adobe permits you to use, modify, and distribute this file in 0006 // accordance with the terms of the Adobe license agreement accompanying it. 0007 /*****************************************************************************/ 0008 0009 #include "dng_rational.h" 0010 0011 #include "dng_utils.h" 0012 0013 /*****************************************************************************/ 0014 0015 real64 dng_srational::As_real64 () const 0016 { 0017 0018 if (d) 0019 return (real64) n / (real64) d; 0020 0021 else 0022 return 0.0; 0023 0024 } 0025 0026 /*****************************************************************************/ 0027 0028 void dng_srational::Set_real64 (real64 x, int32 dd) 0029 { 0030 0031 if (x == 0.0) 0032 { 0033 0034 *this = dng_srational (0, 1); 0035 0036 } 0037 0038 if (dd == 0) 0039 { 0040 0041 real64 y = Abs_real64 (x); 0042 0043 if (y >= 32768.0) 0044 { 0045 dd = 1; 0046 } 0047 0048 else if (y >= 1.0) 0049 { 0050 dd = 32768; 0051 } 0052 0053 else 0054 { 0055 dd = 32768 * 32768; 0056 } 0057 0058 } 0059 0060 *this = dng_srational (Round_int32 (x * dd), dd); 0061 0062 } 0063 0064 /*****************************************************************************/ 0065 0066 void dng_srational::ReduceByFactor (int32 factor) 0067 { 0068 0069 while (n % factor == 0 && 0070 d % factor == 0 && 0071 d >= factor) 0072 { 0073 n /= factor; 0074 d /= factor; 0075 } 0076 0077 } 0078 0079 /*****************************************************************************/ 0080 0081 real64 dng_urational::As_real64 () const 0082 { 0083 0084 if (d) 0085 return (real64) n / (real64) d; 0086 0087 else 0088 return 0.0; 0089 0090 } 0091 0092 /*****************************************************************************/ 0093 0094 void dng_urational::Set_real64 (real64 x, uint32 dd) 0095 { 0096 0097 if (x <= 0.0) 0098 { 0099 0100 *this = dng_urational (0, 1); 0101 0102 } 0103 0104 if (dd == 0) 0105 { 0106 0107 if (x >= 32768.0) 0108 { 0109 dd = 1; 0110 } 0111 0112 else if (x >= 1.0) 0113 { 0114 dd = 32768; 0115 } 0116 0117 else 0118 { 0119 dd = 32768 * 32768; 0120 } 0121 0122 } 0123 0124 *this = dng_urational (Round_uint32 (x * dd), dd); 0125 0126 } 0127 0128 /*****************************************************************************/ 0129 0130 void dng_urational::ReduceByFactor (uint32 factor) 0131 { 0132 0133 while (n % factor == 0 && 0134 d % factor == 0 && 0135 d >= factor) 0136 { 0137 n /= factor; 0138 d /= factor; 0139 } 0140 0141 } 0142 0143 /*****************************************************************************/