Coverage Report

Created: 2025-10-28 08:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/moxcms-0.7.9/src/conversions/gray2rgb.rs
Line
Count
Source
1
/*
2
 * // Copyright (c) Radzivon Bartoshyk 2/2025. All rights reserved.
3
 * //
4
 * // Redistribution and use in source and binary forms, with or without modification,
5
 * // are permitted provided that the following conditions are met:
6
 * //
7
 * // 1.  Redistributions of source code must retain the above copyright notice, this
8
 * // list of conditions and the following disclaimer.
9
 * //
10
 * // 2.  Redistributions in binary form must reproduce the above copyright notice,
11
 * // this list of conditions and the following disclaimer in the documentation
12
 * // and/or other materials provided with the distribution.
13
 * //
14
 * // 3.  Neither the name of the copyright holder nor the names of its
15
 * // contributors may be used to endorse or promote products derived from
16
 * // this software without specific prior written permission.
17
 * //
18
 * // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
 * // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
 * // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
 * // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
 * // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
 * // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
 * // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
 * // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
 * // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
 * // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
 */
29
use crate::transform::PointeeSizeExpressible;
30
use crate::{CmsError, Layout, TransformExecutor};
31
use num_traits::AsPrimitive;
32
33
#[derive(Clone)]
34
struct TransformGray2RgbFusedExecutor<T, const SRC_LAYOUT: u8, const DEST_LAYOUT: u8> {
35
    fused_gamma: Box<[T; 65536]>,
36
    bit_depth: usize,
37
}
38
39
0
pub(crate) fn make_gray_to_x<
40
0
    T: Copy + Default + PointeeSizeExpressible + 'static + Send + Sync,
41
0
    const BUCKET: usize,
42
0
>(
43
0
    src_layout: Layout,
44
0
    dst_layout: Layout,
45
0
    gray_linear: &[f32; BUCKET],
46
0
    gray_gamma: &[T; 65536],
47
0
    bit_depth: usize,
48
0
    gamma_lut: usize,
49
0
) -> Result<Box<dyn TransformExecutor<T> + Sync + Send>, CmsError>
50
0
where
51
0
    u32: AsPrimitive<T>,
52
{
53
0
    if src_layout != Layout::Gray && src_layout != Layout::GrayAlpha {
54
0
        return Err(CmsError::UnsupportedProfileConnection);
55
0
    }
56
57
0
    let mut fused_gamma = Box::new([T::default(); 65536]);
58
0
    let max_lut_size = (gamma_lut - 1) as f32;
59
0
    for (&src, dst) in gray_linear.iter().zip(fused_gamma.iter_mut()) {
60
0
        let possible_value = ((src * max_lut_size).round() as u32).min(max_lut_size as u32) as u16;
61
0
        *dst = gray_gamma[possible_value as usize];
62
0
    }
63
64
0
    match src_layout {
65
0
        Layout::Gray => match dst_layout {
66
0
            Layout::Rgb => Ok(Box::new(TransformGray2RgbFusedExecutor::<
67
0
                T,
68
0
                { Layout::Gray as u8 },
69
0
                { Layout::Rgb as u8 },
70
0
            > {
71
0
                fused_gamma,
72
0
                bit_depth,
73
0
            })),
74
0
            Layout::Rgba => Ok(Box::new(TransformGray2RgbFusedExecutor::<
75
0
                T,
76
0
                { Layout::Gray as u8 },
77
0
                { Layout::Rgba as u8 },
78
0
            > {
79
0
                fused_gamma,
80
0
                bit_depth,
81
0
            })),
82
0
            Layout::Gray => Ok(Box::new(TransformGray2RgbFusedExecutor::<
83
0
                T,
84
0
                { Layout::Gray as u8 },
85
0
                { Layout::Gray as u8 },
86
0
            > {
87
0
                fused_gamma,
88
0
                bit_depth,
89
0
            })),
90
0
            Layout::GrayAlpha => Ok(Box::new(TransformGray2RgbFusedExecutor::<
91
0
                T,
92
0
                { Layout::Gray as u8 },
93
0
                { Layout::GrayAlpha as u8 },
94
0
            > {
95
0
                fused_gamma,
96
0
                bit_depth,
97
0
            })),
98
0
            _ => Err(CmsError::UnsupportedProfileConnection),
99
        },
100
0
        Layout::GrayAlpha => match dst_layout {
101
0
            Layout::Rgb => Ok(Box::new(TransformGray2RgbFusedExecutor::<
102
0
                T,
103
0
                { Layout::Gray as u8 },
104
0
                { Layout::GrayAlpha as u8 },
105
0
            > {
106
0
                fused_gamma,
107
0
                bit_depth,
108
0
            })),
109
0
            Layout::Rgba => Ok(Box::new(TransformGray2RgbFusedExecutor::<
110
0
                T,
111
0
                { Layout::Gray as u8 },
112
0
                { Layout::Rgba as u8 },
113
0
            > {
114
0
                fused_gamma,
115
0
                bit_depth,
116
0
            })),
117
0
            Layout::Gray => Ok(Box::new(TransformGray2RgbFusedExecutor::<
118
0
                T,
119
0
                { Layout::Gray as u8 },
120
0
                { Layout::Gray as u8 },
121
0
            > {
122
0
                fused_gamma,
123
0
                bit_depth,
124
0
            })),
125
0
            Layout::GrayAlpha => Ok(Box::new(TransformGray2RgbFusedExecutor::<
126
0
                T,
127
0
                { Layout::GrayAlpha as u8 },
128
0
                { Layout::GrayAlpha as u8 },
129
0
            > {
130
0
                fused_gamma,
131
0
                bit_depth,
132
0
            })),
133
0
            _ => Err(CmsError::UnsupportedProfileConnection),
134
        },
135
0
        _ => Err(CmsError::UnsupportedProfileConnection),
136
    }
137
0
}
Unexecuted instantiation: moxcms::conversions::gray2rgb::make_gray_to_x::<f64, 65536>
Unexecuted instantiation: moxcms::conversions::gray2rgb::make_gray_to_x::<f32, 65536>
Unexecuted instantiation: moxcms::conversions::gray2rgb::make_gray_to_x::<u8, 256>
Unexecuted instantiation: moxcms::conversions::gray2rgb::make_gray_to_x::<u16, 65536>
138
139
impl<
140
    T: Copy + Default + PointeeSizeExpressible + 'static,
141
    const SRC_LAYOUT: u8,
142
    const DST_LAYOUT: u8,
143
> TransformExecutor<T> for TransformGray2RgbFusedExecutor<T, SRC_LAYOUT, DST_LAYOUT>
144
where
145
    u32: AsPrimitive<T>,
146
{
147
0
    fn transform(&self, src: &[T], dst: &mut [T]) -> Result<(), CmsError> {
148
0
        let src_cn = Layout::from(SRC_LAYOUT);
149
0
        let dst_cn = Layout::from(DST_LAYOUT);
150
0
        let src_channels = src_cn.channels();
151
0
        let dst_channels = dst_cn.channels();
152
153
0
        if src.len() / src_channels != dst.len() / dst_channels {
154
0
            return Err(CmsError::LaneSizeMismatch);
155
0
        }
156
0
        if src.len() % src_channels != 0 {
157
0
            return Err(CmsError::LaneMultipleOfChannels);
158
0
        }
159
0
        if dst.len() % dst_channels != 0 {
160
0
            return Err(CmsError::LaneMultipleOfChannels);
161
0
        }
162
163
0
        let is_gray_alpha = src_cn == Layout::GrayAlpha;
164
165
0
        let max_value: T = ((1u32 << self.bit_depth as u32) - 1u32).as_();
166
167
0
        for (src, dst) in src
168
0
            .chunks_exact(src_channels)
169
0
            .zip(dst.chunks_exact_mut(dst_channels))
170
        {
171
0
            let g = self.fused_gamma[src[0]._as_usize()];
172
0
            let a = if is_gray_alpha { src[1] } else { max_value };
173
174
0
            dst[0] = g;
175
0
            if dst_cn == Layout::GrayAlpha {
176
0
                dst[1] = a;
177
0
            } else if dst_cn == Layout::Rgb {
178
0
                dst[1] = g;
179
0
                dst[2] = g;
180
0
            } else if dst_cn == Layout::Rgba {
181
0
                dst[1] = g;
182
0
                dst[2] = g;
183
0
                dst[3] = a;
184
0
            }
185
        }
186
187
0
        Ok(())
188
0
    }
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<f64, 2, 2> as moxcms::transform::TransformExecutor<f64>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<f64, 2, 0> as moxcms::transform::TransformExecutor<f64>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<f64, 2, 1> as moxcms::transform::TransformExecutor<f64>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<f64, 2, 3> as moxcms::transform::TransformExecutor<f64>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<f64, 3, 3> as moxcms::transform::TransformExecutor<f64>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<f32, 2, 2> as moxcms::transform::TransformExecutor<f32>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<f32, 2, 0> as moxcms::transform::TransformExecutor<f32>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<f32, 2, 1> as moxcms::transform::TransformExecutor<f32>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<f32, 2, 3> as moxcms::transform::TransformExecutor<f32>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<f32, 3, 3> as moxcms::transform::TransformExecutor<f32>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<u8, 2, 2> as moxcms::transform::TransformExecutor<u8>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<u8, 2, 0> as moxcms::transform::TransformExecutor<u8>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<u8, 2, 1> as moxcms::transform::TransformExecutor<u8>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<u8, 2, 3> as moxcms::transform::TransformExecutor<u8>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<u8, 3, 3> as moxcms::transform::TransformExecutor<u8>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<u16, 2, 2> as moxcms::transform::TransformExecutor<u16>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<u16, 2, 0> as moxcms::transform::TransformExecutor<u16>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<u16, 2, 1> as moxcms::transform::TransformExecutor<u16>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<u16, 2, 3> as moxcms::transform::TransformExecutor<u16>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGray2RgbFusedExecutor<u16, 3, 3> as moxcms::transform::TransformExecutor<u16>>::transform
189
}
190
191
#[derive(Clone)]
192
struct TransformGrayToRgbExecutor<T, const SRC_LAYOUT: u8, const DEST_LAYOUT: u8> {
193
    gray_linear: Box<[f32; 65536]>,
194
    red_gamma: Box<[T; 65536]>,
195
    green_gamma: Box<[T; 65536]>,
196
    blue_gamma: Box<[T; 65536]>,
197
    bit_depth: usize,
198
    gamma_lut: usize,
199
}
200
201
#[allow(clippy::too_many_arguments)]
202
0
pub(crate) fn make_gray_to_unfused<
203
0
    T: Copy + Default + PointeeSizeExpressible + 'static + Send + Sync,
204
0
    const BUCKET: usize,
205
0
>(
206
0
    src_layout: Layout,
207
0
    dst_layout: Layout,
208
0
    gray_linear: Box<[f32; 65536]>,
209
0
    red_gamma: Box<[T; 65536]>,
210
0
    green_gamma: Box<[T; 65536]>,
211
0
    blue_gamma: Box<[T; 65536]>,
212
0
    bit_depth: usize,
213
0
    gamma_lut: usize,
214
0
) -> Result<Box<dyn TransformExecutor<T> + Sync + Send>, CmsError>
215
0
where
216
0
    u32: AsPrimitive<T>,
217
{
218
0
    if src_layout != Layout::Gray && src_layout != Layout::GrayAlpha {
219
0
        return Err(CmsError::UnsupportedProfileConnection);
220
0
    }
221
0
    if dst_layout != Layout::Rgb && dst_layout != Layout::Rgba {
222
0
        return Err(CmsError::UnsupportedProfileConnection);
223
0
    }
224
0
    match src_layout {
225
0
        Layout::Gray => match dst_layout {
226
0
            Layout::Rgb => Ok(Box::new(TransformGrayToRgbExecutor::<
227
0
                T,
228
0
                { Layout::Gray as u8 },
229
0
                { Layout::Rgb as u8 },
230
0
            > {
231
0
                gray_linear,
232
0
                red_gamma,
233
0
                green_gamma,
234
0
                blue_gamma,
235
0
                bit_depth,
236
0
                gamma_lut,
237
0
            })),
238
0
            Layout::Rgba => Ok(Box::new(TransformGrayToRgbExecutor::<
239
0
                T,
240
0
                { Layout::Gray as u8 },
241
0
                { Layout::Rgba as u8 },
242
0
            > {
243
0
                gray_linear,
244
0
                red_gamma,
245
0
                green_gamma,
246
0
                blue_gamma,
247
0
                bit_depth,
248
0
                gamma_lut,
249
0
            })),
250
0
            Layout::Gray => Ok(Box::new(TransformGrayToRgbExecutor::<
251
0
                T,
252
0
                { Layout::Gray as u8 },
253
0
                { Layout::Gray as u8 },
254
0
            > {
255
0
                gray_linear,
256
0
                red_gamma,
257
0
                green_gamma,
258
0
                blue_gamma,
259
0
                bit_depth,
260
0
                gamma_lut,
261
0
            })),
262
0
            Layout::GrayAlpha => Ok(Box::new(TransformGrayToRgbExecutor::<
263
0
                T,
264
0
                { Layout::Gray as u8 },
265
0
                { Layout::GrayAlpha as u8 },
266
0
            > {
267
0
                gray_linear,
268
0
                red_gamma,
269
0
                green_gamma,
270
0
                blue_gamma,
271
0
                bit_depth,
272
0
                gamma_lut,
273
0
            })),
274
0
            _ => Err(CmsError::UnsupportedProfileConnection),
275
        },
276
0
        Layout::GrayAlpha => match dst_layout {
277
0
            Layout::Rgb => Ok(Box::new(TransformGrayToRgbExecutor::<
278
0
                T,
279
0
                { Layout::Gray as u8 },
280
0
                { Layout::GrayAlpha as u8 },
281
0
            > {
282
0
                gray_linear,
283
0
                red_gamma,
284
0
                green_gamma,
285
0
                blue_gamma,
286
0
                bit_depth,
287
0
                gamma_lut,
288
0
            })),
289
0
            Layout::Rgba => Ok(Box::new(TransformGrayToRgbExecutor::<
290
0
                T,
291
0
                { Layout::Gray as u8 },
292
0
                { Layout::Rgba as u8 },
293
0
            > {
294
0
                gray_linear,
295
0
                red_gamma,
296
0
                green_gamma,
297
0
                blue_gamma,
298
0
                bit_depth,
299
0
                gamma_lut,
300
0
            })),
301
0
            Layout::Gray => Ok(Box::new(TransformGrayToRgbExecutor::<
302
0
                T,
303
0
                { Layout::Gray as u8 },
304
0
                { Layout::Gray as u8 },
305
0
            > {
306
0
                gray_linear,
307
0
                red_gamma,
308
0
                green_gamma,
309
0
                blue_gamma,
310
0
                bit_depth,
311
0
                gamma_lut,
312
0
            })),
313
0
            Layout::GrayAlpha => Ok(Box::new(TransformGrayToRgbExecutor::<
314
0
                T,
315
0
                { Layout::GrayAlpha as u8 },
316
0
                { Layout::GrayAlpha as u8 },
317
0
            > {
318
0
                gray_linear,
319
0
                red_gamma,
320
0
                green_gamma,
321
0
                blue_gamma,
322
0
                bit_depth,
323
0
                gamma_lut,
324
0
            })),
325
0
            _ => Err(CmsError::UnsupportedProfileConnection),
326
        },
327
0
        _ => Err(CmsError::UnsupportedProfileConnection),
328
    }
329
0
}
Unexecuted instantiation: moxcms::conversions::gray2rgb::make_gray_to_unfused::<f64, 65536>
Unexecuted instantiation: moxcms::conversions::gray2rgb::make_gray_to_unfused::<f32, 65536>
Unexecuted instantiation: moxcms::conversions::gray2rgb::make_gray_to_unfused::<u8, 256>
Unexecuted instantiation: moxcms::conversions::gray2rgb::make_gray_to_unfused::<u16, 65536>
330
331
impl<
332
    T: Copy + Default + PointeeSizeExpressible + 'static,
333
    const SRC_LAYOUT: u8,
334
    const DST_LAYOUT: u8,
335
> TransformExecutor<T> for TransformGrayToRgbExecutor<T, SRC_LAYOUT, DST_LAYOUT>
336
where
337
    u32: AsPrimitive<T>,
338
{
339
0
    fn transform(&self, src: &[T], dst: &mut [T]) -> Result<(), CmsError> {
340
0
        let src_cn = Layout::from(SRC_LAYOUT);
341
0
        let dst_cn = Layout::from(DST_LAYOUT);
342
0
        let src_channels = src_cn.channels();
343
0
        let dst_channels = dst_cn.channels();
344
345
0
        if src.len() / src_channels != dst.len() / dst_channels {
346
0
            return Err(CmsError::LaneSizeMismatch);
347
0
        }
348
0
        if src.len() % src_channels != 0 {
349
0
            return Err(CmsError::LaneMultipleOfChannels);
350
0
        }
351
0
        if dst.len() % dst_channels != 0 {
352
0
            return Err(CmsError::LaneMultipleOfChannels);
353
0
        }
354
355
0
        let is_gray_alpha = src_cn == Layout::GrayAlpha;
356
357
0
        let max_value: T = ((1u32 << self.bit_depth as u32) - 1u32).as_();
358
0
        let max_lut_size = (self.gamma_lut - 1) as f32;
359
360
0
        for (src, dst) in src
361
0
            .chunks_exact(src_channels)
362
0
            .zip(dst.chunks_exact_mut(dst_channels))
363
        {
364
0
            let g = self.gray_linear[src[0]._as_usize()];
365
0
            let a = if is_gray_alpha { src[1] } else { max_value };
366
367
0
            let possible_value = ((g * max_lut_size).round() as u16) as usize;
368
0
            let red_value = self.red_gamma[possible_value];
369
0
            let green_value = self.green_gamma[possible_value];
370
0
            let blue_value = self.blue_gamma[possible_value];
371
372
0
            if dst_cn == Layout::Rgb {
373
0
                dst[0] = red_value;
374
0
                dst[1] = green_value;
375
0
                dst[2] = blue_value;
376
0
            } else if dst_cn == Layout::Rgba {
377
0
                dst[0] = red_value;
378
0
                dst[1] = green_value;
379
0
                dst[2] = blue_value;
380
0
                dst[3] = a;
381
0
            } else {
382
0
                return Err(CmsError::UnsupportedProfileConnection);
383
            }
384
        }
385
386
0
        Ok(())
387
0
    }
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<f64, 2, 2> as moxcms::transform::TransformExecutor<f64>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<f64, 2, 0> as moxcms::transform::TransformExecutor<f64>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<f64, 2, 1> as moxcms::transform::TransformExecutor<f64>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<f64, 2, 3> as moxcms::transform::TransformExecutor<f64>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<f64, 3, 3> as moxcms::transform::TransformExecutor<f64>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<f32, 2, 2> as moxcms::transform::TransformExecutor<f32>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<f32, 2, 0> as moxcms::transform::TransformExecutor<f32>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<f32, 2, 1> as moxcms::transform::TransformExecutor<f32>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<f32, 2, 3> as moxcms::transform::TransformExecutor<f32>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<f32, 3, 3> as moxcms::transform::TransformExecutor<f32>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<u8, 2, 2> as moxcms::transform::TransformExecutor<u8>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<u8, 2, 0> as moxcms::transform::TransformExecutor<u8>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<u8, 2, 1> as moxcms::transform::TransformExecutor<u8>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<u8, 2, 3> as moxcms::transform::TransformExecutor<u8>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<u8, 3, 3> as moxcms::transform::TransformExecutor<u8>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<u16, 2, 2> as moxcms::transform::TransformExecutor<u16>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<u16, 2, 0> as moxcms::transform::TransformExecutor<u16>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<u16, 2, 1> as moxcms::transform::TransformExecutor<u16>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<u16, 2, 3> as moxcms::transform::TransformExecutor<u16>>::transform
Unexecuted instantiation: <moxcms::conversions::gray2rgb::TransformGrayToRgbExecutor<u16, 3, 3> as moxcms::transform::TransformExecutor<u16>>::transform
388
}