@@ -58,11 +58,11 @@ class FunctionColorOKLCHToSRGB : public ITupleFunction
5858 const auto * tuple_type = checkAndGetDataType<DataTypeTuple>(first_arg);
5959 const auto & tuple_inner_types = tuple_type->getElements ();
6060
61- if (tuple_inner_types.size () != channels)
61+ if (tuple_inner_types.size () != ColorConversion:: channels)
6262 throw Exception (
6363 ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
6464 " First argument of function {} must be a tuple of size {}, a tuple of size {} was provided" ,
65- getName (), channels, tuple_inner_types.size ());
65+ getName (), ColorConversion:: channels, tuple_inner_types.size ());
6666
6767 for (const auto & tuple_inner_type : tuple_inner_types)
6868 {
@@ -80,24 +80,28 @@ class FunctionColorOKLCHToSRGB : public ITupleFunction
8080 getName ());
8181
8282 auto float64_type = std::make_shared<DataTypeFloat64>();
83- return std::make_shared<DataTypeTuple>(DataTypes (channels, float64_type));
83+ return std::make_shared<DataTypeTuple>(DataTypes (ColorConversion:: channels, float64_type));
8484 }
8585
8686 ColumnPtr executeImpl (const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override
8787 {
8888 auto float64_type = std::make_shared<DataTypeFloat64>();
89- auto tuple_f64_type = std::make_shared<DataTypeTuple>(DataTypes (channels, float64_type));
89+ auto tuple_f64_type = std::make_shared<DataTypeTuple>(DataTypes (ColorConversion:: channels, float64_type));
9090
9191 auto tuple_f64_arg = castColumn (arguments[0 ], tuple_f64_type);
9292 auto rgb_cols = getTupleElements (*tuple_f64_arg);
9393
9494 ColumnPtr gamma;
9595 if (arguments.size () == 2 )
96- gamma = castColumn (arguments[1 ], float64_type);
96+ gamma = castColumn (arguments[1 ], float64_type)-> convertToFullColumnIfConst () ;
9797
98- const auto & lightness_data = assert_cast<const ColumnFloat64 &>(*rgb_cols[0 ]).getData ();
99- const auto & chroma_data = assert_cast<const ColumnFloat64 &>(*rgb_cols[1 ]).getData ();
100- const auto & hue_data = assert_cast<const ColumnFloat64 &>(*rgb_cols[2 ]).getData ();
98+ ColumnPtr lightness_column = rgb_cols[0 ]->convertToFullColumnIfConst ();
99+ ColumnPtr chroma_column = rgb_cols[1 ]->convertToFullColumnIfConst ();
100+ ColumnPtr hue_column = rgb_cols[2 ]->convertToFullColumnIfConst ();
101+
102+ const auto & lightness_data = assert_cast<const ColumnFloat64 &>(*lightness_column).getData ();
103+ const auto & chroma_data = assert_cast<const ColumnFloat64 &>(*chroma_column).getData ();
104+ const auto & hue_data = assert_cast<const ColumnFloat64 &>(*hue_column).getData ();
101105 const auto * gamma_data = gamma ? &assert_cast<const ColumnFloat64 &>(*gamma).getData () : nullptr ;
102106
103107 auto col_red = ColumnFloat64::create ();
@@ -114,9 +118,9 @@ class FunctionColorOKLCHToSRGB : public ITupleFunction
114118
115119 for (size_t row = 0 ; row < input_rows_count; ++row)
116120 {
117- Color lch_data{lightness_data[row], chroma_data[row], hue_data[row]};
118- Float64 gamma_cur = gamma_data ? (*gamma_data)[row] : default_gamma;
119- Color res = convertOklchToSrgb (lch_data, gamma_cur);
121+ ColorConversion:: Color lch_data{lightness_data[row], chroma_data[row], hue_data[row]};
122+ Float64 gamma_cur = gamma_data ? (*gamma_data)[row] : ColorConversion:: default_gamma;
123+ ColorConversion:: Color res = convertOklchToSrgb (lch_data, gamma_cur);
120124 red_data.push_back (res[0 ]);
121125 green_data.push_back (res[1 ]);
122126 blue_data.push_back (res[2 ]);
@@ -127,36 +131,36 @@ class FunctionColorOKLCHToSRGB : public ITupleFunction
127131
128132private:
129133 // / OKLCH -> sRGB. Follows the step-by-step pipeline described in Ottosson’s article. See ColorConversion.h
130- Color convertOklchToSrgb (const Color & oklch, Float64 gamma) const
134+ ColorConversion:: Color convertOklchToSrgb (const ColorConversion:: Color & oklch, Float64 gamma) const
131135 {
132136 Float64 chroma = oklch[1 ];
133- Float64 hue_rad = oklch[2 ] * deg2rad;
137+ Float64 hue_rad = oklch[2 ] * ColorConversion:: deg2rad;
134138
135- Color oklab = oklch;
139+ ColorConversion:: Color oklab = oklch;
136140
137141 oklab[1 ] = chroma * std::cos (hue_rad);
138142 oklab[2 ] = chroma * std::sin (hue_rad);
139143
140- Color lms{};
141- for (size_t i = 0 ; i < channels; ++i)
144+ ColorConversion:: Color lms{};
145+ for (size_t i = 0 ; i < ColorConversion:: channels; ++i)
142146 {
143- for (size_t channel = 0 ; channel < channels; ++channel)
144- lms[i] = std::fma (oklab[channel], oklab_to_lms_base[(3 * i) + channel], lms[i]);
147+ for (size_t channel = 0 ; channel < ColorConversion:: channels; ++channel)
148+ lms[i] = std::fma (oklab[channel], ColorConversion:: oklab_to_lms_base[(3 * i) + channel], lms[i]);
145149 lms[i] = lms[i] * lms[i] * lms[i];
146150 }
147151
148- Color rgb{};
149- for (size_t i = 0 ; i < channels; ++i)
152+ ColorConversion:: Color rgb{};
153+ for (size_t i = 0 ; i < ColorConversion:: channels; ++i)
150154 {
151- for (size_t channel = 0 ; channel < channels; ++channel)
152- rgb[i] = std::fma (lms[channel], lms_to_linear_base[(3 * i) + channel], rgb[i]);
155+ for (size_t channel = 0 ; channel < ColorConversion:: channels; ++channel)
156+ rgb[i] = std::fma (lms[channel], ColorConversion:: lms_to_linear_base[(3 * i) + channel], rgb[i]);
153157 }
154158
155159 if (gamma == 0 )
156- gamma = gamma_fallback;
160+ gamma = ColorConversion:: gamma_fallback;
157161
158162 Float64 power = 1 / gamma;
159- for (size_t i = 0 ; i < channels; ++i)
163+ for (size_t i = 0 ; i < ColorConversion:: channels; ++i)
160164 {
161165 rgb[i] = std::clamp (rgb[i], 0.0 , 1.0 );
162166 rgb[i] = std::pow (rgb[i], power) * 255.0 ;
0 commit comments