Coverage Report

Created: 2026-01-09 06:04

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openexr/src/lib/OpenEXR/ImfDeepCompositing.cpp
Line
Count
Source
1
//
2
// SPDX-License-Identifier: BSD-3-Clause
3
// Copyright (c) Weta Digital, Ltd and Contributors to the OpenEXR Project.
4
//
5
6
#include "ImfDeepCompositing.h"
7
8
#include "ImfNamespace.h"
9
#include <algorithm>
10
#include <vector>
11
12
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
13
14
using std::sort;
15
using std::vector;
16
DeepCompositing::DeepCompositing ()
17
728
{}
18
19
DeepCompositing::~DeepCompositing ()
20
728
{}
21
22
void
23
DeepCompositing::composite_pixel (
24
    float        outputs[],
25
    const float* inputs[],
26
    const char*  channel_names[],
27
    int          num_channels,
28
    int          num_samples,
29
    int          sources)
30
2.07k
{
31
23.3k
    for (int i = 0; i < num_channels; i++)
32
21.3k
        outputs[i] = 0.0;
33
    // no samples? do nothing
34
2.07k
    if (num_samples == 0) { return; }
35
36
955
    vector<int> sort_order;
37
955
    if (sources > 1)
38
0
    {
39
0
        sort_order.resize (num_samples);
40
0
        for (int i = 0; i < num_samples; i++)
41
0
            sort_order[i] = i;
42
0
        sort (
43
0
            &sort_order[0],
44
0
            inputs,
45
0
            channel_names,
46
0
            num_channels,
47
0
            num_samples,
48
0
            sources);
49
0
    }
50
51
27.4M
    for (int i = 0; i < num_samples; i++)
52
27.4M
    {
53
27.4M
        int   s     = (sources > 1) ? sort_order[i] : i;
54
27.4M
        float alpha = outputs[2];
55
27.4M
        if (alpha >= 1.0f) return;
56
57
149M
        for (int c = 0; c < num_channels; c++)
58
121M
        {
59
121M
            outputs[c] += (1.0f - alpha) * inputs[c][s];
60
121M
        }
61
27.4M
    }
62
955
}
63
64
struct sort_helper
65
{
66
    const float** inputs;
67
    bool          operator() (int a, int b)
68
0
    {
69
0
        if (inputs[0][a] < inputs[0][b]) return true;
70
0
        if (inputs[0][a] > inputs[0][b]) return false;
71
0
        if (inputs[1][a] < inputs[1][b]) return true;
72
0
        if (inputs[1][a] > inputs[1][b]) return false;
73
0
        return a < b;
74
0
    }
75
0
    sort_helper (const float** i) : inputs (i) {}
76
};
77
78
void
79
DeepCompositing::sort (
80
    int          order[],
81
    const float* inputs[],
82
    const char*  channel_names[],
83
    int          num_channels,
84
    int          num_samples,
85
    int          sources)
86
0
{
87
0
    std::sort (order + 0, order + num_samples, sort_helper (inputs));
88
0
}
89
90
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT