- replaced G.{edve,eded,edvl} with G.editMesh, atm just a structure to
[blender.git] / source / blender / blenlib / intern / rand.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32 #include "PIL_time.h"
33 #include "BLI_rand.h"
34
35 #ifdef HAVE_CONFIG_H
36 #include <config.h>
37 #endif
38
39 #if defined(WIN32) && !defined(FREE_WINDOWS)
40 typedef unsigned __int64        r_uint64;
41 #else
42 typedef unsigned long long      r_uint64;
43 #endif
44
45 #define MULTIPLIER      0x5DEECE66D
46 #define ADDEND          0xB
47
48 #define LOWSEED         0x330E
49
50 static r_uint64 X= 0;
51
52 void BLI_srand(unsigned int seed) {
53         X= (((r_uint64) seed)<<16) | LOWSEED;
54 }
55
56 int BLI_rand(void) {
57         X= (MULTIPLIER*X + ADDEND)&0x0000FFFFFFFFFFFF;
58         return (int) (X>>17);
59 }
60
61 double BLI_drand(void) {
62         return (double) BLI_rand()/0x80000000;
63 }
64
65 float BLI_frand(void) {
66         return (float) BLI_rand()/0x80000000;
67 }
68
69 void BLI_storerand(unsigned int loc_r[2]) {
70         loc_r[0]= (unsigned int) (X>>32);
71         loc_r[1]= (unsigned int) (X&0xFFFFFFFF);
72 }
73
74 void BLI_restorerand(unsigned int loc[2]) {
75         X= ((r_uint64) loc[0])<<32;
76         X|= loc[1];
77 }
78
79 void BLI_fillrand(void *addr, int len) {
80         unsigned char *p= addr;
81         unsigned int save[2];
82
83         BLI_storerand(save);
84         
85         BLI_srand((unsigned int) (PIL_check_seconds_timer()*0x7FFFFFFF));
86         while (len--) *p++= BLI_rand()&0xFF;
87         BLI_restorerand(save);
88 }