1/*****************************************************************************/ 2// Copyright 2006 Adobe Systems Incorporated 3// All Rights Reserved. 4// 5// NOTICE: Adobe permits you to use, modify, and distribute this file in 6// accordance with the terms of the Adobe license agreement accompanying it. 7/*****************************************************************************/ 8 9/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_rational.cpp#1 $ */ 10/* $DateTime: 2012/05/30 13:28:51 $ */ 11/* $Change: 832332 $ */ 12/* $Author: tknoll $ */ 13 14/*****************************************************************************/ 15 16#include "dng_rational.h" 17 18#include "dng_utils.h" 19 20/*****************************************************************************/ 21 22real64 dng_srational::As_real64 () const 23 { 24 25 if (d) 26 return (real64) n / (real64) d; 27 28 else 29 return 0.0; 30 31 } 32 33/*****************************************************************************/ 34 35void dng_srational::Set_real64 (real64 x, int32 dd) 36 { 37 38 if (x == 0.0) 39 { 40 41 *this = dng_srational (0, 1); 42 43 } 44 45 if (dd == 0) 46 { 47 48 real64 y = Abs_real64 (x); 49 50 if (y >= 32768.0) 51 { 52 dd = 1; 53 } 54 55 else if (y >= 1.0) 56 { 57 dd = 32768; 58 } 59 60 else 61 { 62 dd = 32768 * 32768; 63 } 64 65 } 66 67 *this = dng_srational (Round_int32 (x * dd), dd); 68 69 } 70 71/*****************************************************************************/ 72 73void dng_srational::ReduceByFactor (int32 factor) 74 { 75 76 while (n % factor == 0 && 77 d % factor == 0 && 78 d >= factor) 79 { 80 n /= factor; 81 d /= factor; 82 } 83 84 } 85 86/*****************************************************************************/ 87 88real64 dng_urational::As_real64 () const 89 { 90 91 if (d) 92 return (real64) n / (real64) d; 93 94 else 95 return 0.0; 96 97 } 98 99/*****************************************************************************/ 100 101void dng_urational::Set_real64 (real64 x, uint32 dd) 102 { 103 104 if (x <= 0.0) 105 { 106 107 *this = dng_urational (0, 1); 108 109 } 110 111 if (dd == 0) 112 { 113 114 if (x >= 32768.0) 115 { 116 dd = 1; 117 } 118 119 else if (x >= 1.0) 120 { 121 dd = 32768; 122 } 123 124 else 125 { 126 dd = 32768 * 32768; 127 } 128 129 } 130 131 *this = dng_urational (Round_uint32 (x * dd), dd); 132 133 } 134 135/*****************************************************************************/ 136 137void dng_urational::ReduceByFactor (uint32 factor) 138 { 139 140 while (n % factor == 0 && 141 d % factor == 0 && 142 d >= factor) 143 { 144 n /= factor; 145 d /= factor; 146 } 147 148 } 149 150/*****************************************************************************/ 151