summaryrefslogtreecommitdiff
path: root/src/graphics/ContribDefs.h
blob: 8032aef24871a7bdd0437ad150771d52dc6c90ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Fast and accurate bitmap scaling. Original code by Eran Yariv and Jake Montgomery,
// posted on codeguru.com.

#ifndef _ContribDefs_h_
#define _ContribDefs_h_

#include "../base/MathHelper.h"

#include <math.h>

namespace avg {

class ContribDef
{
public:
    ContribDef(float dWidth) 
        : m_dWidth (dWidth)
    {}

    virtual ~ContribDef() {}

    float GetWidth() const   
    { 
        return m_dWidth; 
    }

    void SetWidth(float dWidth)
    { 
        m_dWidth = dWidth; 
    }

    virtual float Filter(float dVal) const = 0;

protected:
    float  m_dWidth;
};

class BilinearContribDef : public ContribDef
{
public:
    BilinearContribDef(float dWidth = 1.0) 
        : ContribDef(dWidth)
    {}

    virtual ~BilinearContribDef() {}

    virtual float Filter(float dVal) const
    {
        dVal = fabs(dVal);
        return (dVal < m_dWidth ? m_dWidth - dVal : 0.0f);
    }
};

class GaussianContribDef : public ContribDef
{
public:
    GaussianContribDef(float dWidth = 3.0)
        : ContribDef(dWidth) 
    {}

    virtual ~GaussianContribDef() {}

    virtual float Filter(float dVal) const
    {
        if (fabs (dVal) > m_dWidth)
        {
            return 0.0;
        }
        return float(exp(-dVal * dVal/m_dWidth-1) / sqrt(2*PI));
    }
};

}

#endif