45 const unsigned int output_resolution,
float *
const output_clut_data,
46 const char *
const filename)
48 gmic_list<float> image_list;
49 gmic_list<char> image_names;
51 g_instance.verbosity = -1;
54 gmic_image<float> &img = image_list[0];
55 img.assign(1, nb_input_keypoints, 1, 6);
58 for(
size_t i = 0;
i < nb_input_keypoints * 6; ++
i) *(ptr++) = (float)input_keypoints[
i];
62 std::snprintf(gmic_cmd,
sizeof(gmic_cmd),
"-decompress_clut %u,%u,%u -cut 0,255", output_resolution,
63 output_resolution, output_resolution);
66 g_instance.run(gmic_cmd, image_list, image_names);
68 catch(gmic_exception &e)
70 std::printf(
"[lut3d gmic] error: \"%s\"\n", e.what());
77 std::snprintf(gmic_cmd,
sizeof(gmic_cmd),
"-o \"%s\",uchar", filename);
78 g_instance.run(gmic_cmd, image_list, image_names);
82 std::fprintf(stderr,
"[lut3d gmic] error - saving cache lut (does the cache folder exist ?)\n");
87 g_instance.run(
"-div 255.0 -permute cxyz", image_list, image_names);
89 catch(gmic_exception &e)
91 std::printf(
"[lut3d gmic] error: \"%s\"\n", e.what());
96 = image_list[0]._width * image_list[0]._height * image_list[0]._depth * image_list[0]._spectrum;
97 std::memcpy(output_clut_data, image_list[0]._data, img_size *
sizeof(
float));
102 const char *
const filename)
104 gmic_list<float> image_list;
105 gmic_list<char> image_names;
108 g_instance.verbosity = -1;
112 std::snprintf(gmic_cmd,
sizeof(gmic_cmd),
"-i \"%s\"", filename);
113 g_instance.run(gmic_cmd, image_list, image_names);
117 image_list.assign(0);
121 const unsigned int output_size = 3 * output_resolution * output_resolution * output_resolution;
122 unsigned int output_res = output_resolution;
123 size_t img_size = image_list[0]._width * image_list[0]._height * image_list[0]._depth * image_list[0]._spectrum;
124 if(output_size < img_size)
126 std::snprintf(gmic_cmd,
sizeof(gmic_cmd),
"-r %u,%u,%u,3,3", output_resolution, output_resolution,
130 g_instance.run(gmic_cmd, image_list, image_names);
132 catch(gmic_exception &e)
134 std::printf(
"[lut3d gmic] error: \"%s\"\n", e.what());
135 image_list.assign(0);
138 img_size = image_list[0]._width * image_list[0]._height * image_list[0]._depth * image_list[0]._spectrum;
140 else if(output_size > img_size)
142 output_res = image_list[0]._width;
147 g_instance.run(
"-div 255.0 -permute cxyz", image_list, image_names);
149 catch(gmic_exception &e)
151 std::printf(
"[lut3d gmic] error: \"%s\"\n", e.what());
152 image_list.assign(0);
155 std::memcpy(output_clut_data, image_list[0]._data, img_size *
sizeof(
float));
156 image_list.assign(0);
160gboolean
lut3d_read_gmz(
int *
const nb_keypoints,
unsigned char *
const keypoints,
const char *
const filename,
161 int *
const nb_lut,
void *
g,
const char *
const lutname,
const gboolean newlutname)
163 gmic_list<float> image_list;
164 gmic_list<char> image_names;
167 g_instance.verbosity = -1;
168 gboolean lut_found =
FALSE;
172 std::snprintf(gmic_cmd,
sizeof(gmic_cmd),
"-i \"%s\"", filename);
173 g_instance.run(gmic_cmd, image_list, image_names);
175 catch(gmic_exception &e)
177 std::printf(
"[lut3d gmic] error: \"%s\"\n", e.what());
179 image_list.assign(0);
180 image_names.assign(0);
186 for(
unsigned int i = 0;
i < image_names._width; ++
i)
188 if(strcmp(image_names[
i]._data, lutname) == 0)
196 *nb_lut = (int)image_names._width;
200 for(
unsigned int i = 0;
i < image_names._width; ++
i)
206 int nb_kp = *nb_keypoints = (int)image_list[l]._height;
207 if(image_list[l]._width == 1 && image_list[l]._height <= 2048 && image_list[l]._depth == 1
208 && image_list[l]._spectrum == 6)
210 gmic_image<float> &img = image_list[l];
211 for(
int i = 0;
i < nb_kp * 6; ++
i) keypoints[
i] = (
unsigned char)img[
i];
213 else if(image_list[l]._width == 1 && image_list[l]._height <= 2048 && image_list[l]._depth == 1
214 && image_list[l]._spectrum == 4)
216 gmic_image<float> &img = image_list[l];
217 for(
int i = 0;
i < nb_kp * 3; ++
i) keypoints[
i] = (
unsigned char)img[
i];
218 for(
int i = 0;
i < nb_kp; ++
i)
219 keypoints[nb_kp * 3 +
i] = keypoints[nb_kp * 4 +
i] = keypoints[nb_kp * 5 +
i]
220 = (
unsigned char)img[nb_kp * 3 +
i];
223 std::printf(
"[lut3d gmic] error: incompatible compressed LUT [%u] %s\n", l, image_names[l]._data);
225 image_list.assign(0);
226 image_names.assign(0);
void lut3d_decompress_clut(const unsigned char *const input_keypoints, const unsigned int nb_input_keypoints, const unsigned int output_resolution, float *const output_clut_data, const char *const filename)
gboolean lut3d_read_gmz(int *const nb_keypoints, unsigned char *const keypoints, const char *const filename, int *const nb_lut, void *widget, const char *const lutname, const gboolean newlutname)