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 /*****************************************************************************/