105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifndef GrRandom_DEFINED
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrRandom_DEFINED
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrRandom {
1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrRandom() : fSeed(0) {}
1705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrRandom(uint32_t seed) : fSeed(seed) {}
1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    uint32_t seed() const { return fSeed; }
2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    uint32_t nextU() {
2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fSeed = fSeed * kMUL + kADD;
2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return fSeed;
2405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
2505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int32_t nextS() { return (int32_t)this->nextU(); }
2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
2905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  Returns value [0...1) as a float
3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    float nextF() {
3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        // const is 1 / (2^32 - 1)
3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return (float)(this->nextU() * 2.32830644e-10);
3405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  Returns value [min...max) as a float
3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    float nextF(float min, float max) {
4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return min + this->nextF() * (max - min);
4105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
4205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /*
4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  These constants taken from "Numerical Recipes in C", reprinted 1999
4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    enum {
4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kMUL = 1664525,
4905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kADD = 1013904223
5005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    uint32_t    fSeed;
5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
56