Home | History | Annotate | Download | only in source
      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 
     22 real64 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 
     35 void 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 
     73 void 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 
     88 real64 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 
    101 void 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 
    137 void 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