/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 |