From 6063c6a017d00a2572b6691b055ba22b7de2991e Mon Sep 17 00:00:00 2001 From: dooglus Date: Sun, 15 Apr 2007 15:11:32 +0000 Subject: [PATCH] Fix 1698604: Moved the quick_rng class into its own header, since it was present in 2 different source files. Use 'uint32_t' rather than 'long' as the return type of the methods which expect to be returning 32 bit values. git-svn-id: http://svn.voria.com/code@469 1f10aa63-cdf2-0310-b900-c93c546f37ac --- synfig-core/trunk/NEWS | 1 + synfig-core/trunk/src/modules/mod_noise/random.cpp | 34 +-------- synfig-core/trunk/src/synfig/guid.cpp | 45 +----------- synfig-core/trunk/src/synfig/quick_rng.h | 85 ++++++++++++++++++++++ 4 files changed, 88 insertions(+), 77 deletions(-) create mode 100644 synfig-core/trunk/src/synfig/quick_rng.h diff --git a/synfig-core/trunk/NEWS b/synfig-core/trunk/NEWS index 257cad3..767dc3c 100644 --- a/synfig-core/trunk/NEWS +++ b/synfig-core/trunk/NEWS @@ -11,6 +11,7 @@ * Fix some doxygen warnings * Some MacOS fixes * Misc bug fixes + * Fix random number generation for 64 bit CPUs (#1698604) 0.61.05 (SVN 126) - February 27, 2005 - Misc fixes diff --git a/synfig-core/trunk/src/modules/mod_noise/random.cpp b/synfig-core/trunk/src/modules/mod_noise/random.cpp index 7ebaefa..d84f97e 100644 --- a/synfig-core/trunk/src/modules/mod_noise/random.cpp +++ b/synfig-core/trunk/src/modules/mod_noise/random.cpp @@ -30,43 +30,11 @@ #endif #include "random.h" +#include #include #include #endif -// A fast 32-bit linear congruential random number generator -class quick_rng -{ - unsigned long next; -public: - quick_rng(unsigned long seed):next(seed) { } - - void set_seed(unsigned long x) - { - next=x; - } - - unsigned long i32() - { - static const unsigned long a(1664525); - static const unsigned long c(1013904223); - - return next=next*a+c; - } - - unsigned long i16() - { - return i32()>>16; - } - - float f() - { - static const float m(int(65535)); - - return float(i16())/m; - } -}; - /* === M A C R O S ========================================================= */ #define PI (3.1415927) diff --git a/synfig-core/trunk/src/synfig/guid.cpp b/synfig-core/trunk/src/synfig/guid.cpp index a2a4ac4..1369aba 100644 --- a/synfig-core/trunk/src/synfig/guid.cpp +++ b/synfig-core/trunk/src/synfig/guid.cpp @@ -33,6 +33,7 @@ #endif #include "guid.h" +#include "quick_rng.h" #include #include #include @@ -76,50 +77,6 @@ using namespace synfig; /* === M E T H O D S ======================================================= */ -// A fast 32-bit linear congruential random number generator -class quick_rng -{ - unsigned long next; -public: - quick_rng(unsigned long seed=0):next(seed) { } - - void set_seed(unsigned long x) - { - next=x; - } - - unsigned long i32() - { - static const unsigned long a(1664525); - static const unsigned long c(1013904223); - - return next=next*a+c; - } - - unsigned long i16() - { - return i32()>>16; - } - - float f() - { - static const float m(int(65535)); - - return float(i16())/m; - } - - unsigned long operator()(const unsigned long& m) - { - if(m==65536) - return i16(); - else - if(m<=65536) - return i16()%m; - else - return i32()%m; - } -}; - #define GUID_RNG quick_rng //#define GUID_RNG subtractive_rng diff --git a/synfig-core/trunk/src/synfig/quick_rng.h b/synfig-core/trunk/src/synfig/quick_rng.h new file mode 100644 index 0000000..9f63556 --- /dev/null +++ b/synfig-core/trunk/src/synfig/quick_rng.h @@ -0,0 +1,85 @@ +/* === S Y N F I G ========================================================= */ +/*! \file quick_rng.h +** \brief Template Header +** +** $Id: guid.h 335 2007-03-16 00:39:09Z dooglus $ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007 Chris Moore +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** \endlegal +*/ +/* ========================================================================= */ + +/* === S T A R T =========================================================== */ + +#ifndef __SYNFIG_QUICK_RNG_H +#define __SYNFIG_QUICK_RNG_H + +/* === H E A D E R S ======================================================= */ + +#include + +/* === M A C R O S ========================================================= */ + +/* === T Y P E D E F S ===================================================== */ + +/* === C L A S S E S & S T R U C T S ======================================= */ + +// A fast 32-bit linear congruential random number generator +class quick_rng +{ + uint32_t next; +public: + quick_rng(uint32_t seed=0):next(seed) { } + + void set_seed(uint32_t x) + { + next=x; + } + + uint32_t i32() + { + static const uint32_t a(1664525); + static const uint32_t c(1013904223); + + return next=next*a+c; + } + + uint32_t i16() + { + return i32()>>16; + } + + float f() + { + static const float m(int(65535)); + + return float(i16())/m; + } + + uint32_t operator()(const uint32_t& m) + { + if(m==65536) + return i16(); + else + if(m<=65536) + return i16()%m; + else + return i32()%m; + } +}; + +/* === E N D =============================================================== */ + +#endif -- 2.7.4