39#if defined(VISP_HAVE_THREADS)
42struct vpImageLut_Param_t
44 unsigned int m_start_index;
45 unsigned int m_end_index;
47 unsigned char m_lut[256];
48 unsigned char *m_bitmap;
50 vpImageLut_Param_t(
unsigned int start_index,
unsigned int end_index,
unsigned char *bitmap)
51 : m_start_index(start_index), m_end_index(end_index), m_lut(), m_bitmap(bitmap)
55void performLutThread(vpImageLut_Param_t *imageLut_param)
57 unsigned int start_index = imageLut_param->m_start_index;
58 unsigned int end_index = imageLut_param->m_end_index;
60 unsigned char *bitmap = imageLut_param->m_bitmap;
62 unsigned char *ptrStart = bitmap + start_index;
63 unsigned char *ptrEnd = bitmap + end_index;
64 unsigned char *ptrCurrent = ptrStart;
66 if (end_index - start_index >= 8) {
68 for (; ptrCurrent <= ptrEnd - 8;) {
69 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent];
72 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent];
75 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent];
78 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent];
81 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent];
84 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent];
87 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent];
90 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent];
95 for (; ptrCurrent != ptrEnd; ++ptrCurrent) {
96 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent];
100struct vpImageLutRGBa_Param_t
102 unsigned int m_start_index;
103 unsigned int m_end_index;
105 VISP_NAMESPACE_ADDRESSING vpRGBa m_lut[256];
106 unsigned char *m_bitmap;
108 vpImageLutRGBa_Param_t(
unsigned int start_index,
unsigned int end_index,
unsigned char *bitmap)
109 : m_start_index(start_index), m_end_index(end_index), m_lut(), m_bitmap(bitmap)
113void performLutRGBaThread(vpImageLutRGBa_Param_t *imageLut_param)
115 unsigned int start_index = imageLut_param->m_start_index;
116 unsigned int end_index = imageLut_param->m_end_index;
118 unsigned char *bitmap = imageLut_param->m_bitmap;
120 unsigned char *ptrStart = bitmap + start_index * 4;
121 unsigned char *ptrEnd = bitmap + end_index * 4;
122 unsigned char *ptrCurrent = ptrStart;
124 if (end_index - start_index >= 4 * 2) {
126 for (; ptrCurrent <= ptrEnd - 4 * 2;) {
127 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
R;
129 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
G;
131 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
B;
133 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
A;
136 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
R;
138 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
G;
140 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
B;
142 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
A;
147 while (ptrCurrent != ptrEnd) {
148 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
R;
151 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
G;
154 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
B;
157 *ptrCurrent = imageLut_param->m_lut[*ptrCurrent].
A;
174 std::cerr <<
"Not implemented !" << std::endl;
190 unsigned char *ptrStart =
static_cast<unsigned char *
>(
bitmap);
191 unsigned char *ptrEnd = ptrStart + size;
192 unsigned char *ptrCurrent = ptrStart;
194 bool use_single_thread = ((nbThreads == 0) || (nbThreads == 1));
195#if !defined(VISP_HAVE_THREADS)
196 use_single_thread =
true;
199 if ((!use_single_thread) && (
getSize() <= nbThreads)) {
200 use_single_thread =
true;
203 if (use_single_thread) {
206 while (ptrCurrent != ptrEnd) {
207 *ptrCurrent = lut[*ptrCurrent];
212#if defined(VISP_HAVE_THREADS)
214 std::vector<std::thread *> threadpool;
215 std::vector<vpImageLut_Param_t *> imageLutParams;
217 unsigned int image_size =
getSize();
218 unsigned int step = image_size / nbThreads;
219 unsigned int last_step = image_size - step * (nbThreads - 1);
221 for (
unsigned int index = 0; index < nbThreads; ++index) {
222 unsigned int start_index = index * step;
223 unsigned int end_index = (index + 1) * step;
225 if (index == nbThreads - 1) {
226 end_index = start_index + last_step;
229 vpImageLut_Param_t *imageLut_param =
new vpImageLut_Param_t(start_index, end_index,
bitmap);
230 memcpy(imageLut_param->m_lut, lut, 256 *
sizeof(
unsigned char));
232 imageLutParams.push_back(imageLut_param);
235 std::thread *imageLut_thread =
new std::thread(&performLutThread, imageLut_param);
236 threadpool.push_back(imageLut_thread);
239 for (
size_t cpt = 0; cpt < threadpool.size(); ++cpt) {
241 threadpool[cpt]->join();
245 for (
size_t cpt = 0; cpt < threadpool.size(); ++cpt) {
246 delete threadpool[cpt];
249 for (
size_t cpt = 0; cpt < imageLutParams.size(); ++cpt) {
250 delete imageLutParams[cpt];
269 unsigned char *ptrStart =
reinterpret_cast<unsigned char *
>(
bitmap);
270 unsigned char *ptrEnd = ptrStart + (size * 4);
271 unsigned char *ptrCurrent = ptrStart;
273 bool use_single_thread = ((nbThreads == 0) || (nbThreads == 1));
274#if !defined(VISP_HAVE_THREADS)
275 use_single_thread =
true;
278 if ((!use_single_thread) && (
getSize() <= nbThreads)) {
279 use_single_thread =
true;
282 if (use_single_thread) {
284 while (ptrCurrent != ptrEnd) {
285 *ptrCurrent = lut[*ptrCurrent].R;
288 *ptrCurrent = lut[*ptrCurrent].G;
291 *ptrCurrent = lut[*ptrCurrent].B;
294 *ptrCurrent = lut[*ptrCurrent].A;
299#if defined(VISP_HAVE_THREADS)
301 std::vector<std::thread *> threadpool;
302 std::vector<vpImageLutRGBa_Param_t *> imageLutParams;
304 unsigned int image_size =
getSize();
305 unsigned int step = image_size / nbThreads;
306 unsigned int last_step = image_size - step * (nbThreads - 1);
308 for (
unsigned int index = 0; index < nbThreads; ++index) {
309 unsigned int start_index = index * step;
310 unsigned int end_index = (index + 1) * step;
312 if (index == nbThreads - 1) {
313 end_index = start_index + last_step;
316 vpImageLutRGBa_Param_t *imageLut_param =
new vpImageLutRGBa_Param_t(start_index, end_index,
reinterpret_cast<unsigned char *
>(
bitmap));
317 memcpy(
static_cast<void *
>(imageLut_param->m_lut), lut, 256 *
sizeof(
vpRGBa));
319 imageLutParams.push_back(imageLut_param);
322 std::thread *imageLut_thread =
new std::thread(&performLutRGBaThread, imageLut_param);
323 threadpool.push_back(imageLut_thread);
326 for (
size_t cpt = 0; cpt < threadpool.size(); ++cpt) {
328 threadpool[cpt]->join();
332 for (
size_t cpt = 0; cpt < threadpool.size(); ++cpt) {
333 delete threadpool[cpt];
336 for (
size_t cpt = 0; cpt < imageLutParams.size(); ++cpt) {
337 delete imageLutParams[cpt];
unsigned int getWidth() const
void performLut(const Type(&lut)[256], unsigned int nbThreads=1)
unsigned int getSize() const
unsigned int getHeight() const
unsigned char B
Blue component.
unsigned char R
Red component.
unsigned char G
Green component.
unsigned char A
Additional component.