File: brightness_contrast.cpp

package info (click to toggle)
satdump 1.2.2%2Bgb79af48-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 81,648 kB
  • sloc: cpp: 276,768; ansic: 164,598; lisp: 1,219; sh: 283; xml: 106; makefile: 7
file content (31 lines) | stat: -rw-r--r-- 897 bytes parent folder | download | duplicates (2)
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
#include "brightness_contrast.h"
#include <cmath>

namespace image
{
    void brightness_contrast(Image &image, float brightness, float contrast)
    {
        int channelCount = image.channels();
        const float scale = image.maxval() - 1;

        float brightness_v = brightness / 2.0f;
        float slant = tanf((contrast + 1.0f) * 0.78539816339744830961566084581987572104929234984378f);

        if (channelCount == 4)
            channelCount = 3;

        for (size_t i = 0; i < image.height() * image.width() * channelCount; i++)
        {
            float v = float(image.get(i)) / scale;

            if (brightness_v < 0.0)
                v = v * (1.0 + brightness_v);
            else
                v = v + ((1.0 - v) * brightness_v);

            v = (v - 0.5) * slant + 0.5;

            image.set(i, std::min<float>(scale, std::max<float>(0, v * scale)));
        }
    }
}