int main(int argc, char **argv) { setlocale(LC_ALL, ""); g_test_init(&argc, &argv, NULL); GSList *slist = NULL; std::vector<bool> reverse; reverse.push_back(false); reverse.push_back(true); for(std::vector<bool>::iterator it_reverse = reverse.begin(); it_reverse != reverse.end(); ++it_reverse) { std::map<std::string, int> pixDesc; pixDesc["RGB"] = LF_CR_3(RED, GREEN, BLUE); pixDesc["RGBA"] = LF_CR_4(RED, GREEN, BLUE, UNKNOWN); pixDesc["ARGB"] = LF_CR_4(UNKNOWN, RED, GREEN, BLUE); for(std::map<std::string, int>::iterator it_pixDesc = pixDesc.begin(); it_pixDesc != pixDesc.end(); ++it_pixDesc) { std::vector<size_t> align; align.push_back(0); align.push_back(4 * sizeof(float)); // SSE //align.push_back(8 * sizeof(float)); // AVX //align.push_back(16 * sizeof(float)); // AVX512 for(std::vector<size_t>::iterator it_align = align.begin(); it_align != align.end(); ++it_align) { lfTestParams *p = (lfTestParams *)g_malloc(sizeof(lfTestParams)); p->reverse = *it_reverse; p->cpp = it_pixDesc->first.length(); p->pixDesc = g_strdup(it_pixDesc->first.c_str()); p->comp_role = it_pixDesc->second; p->alignment = *it_align; add_sets(p); slist = g_slist_append(slist, p); } } } const int res = g_test_run(); g_slist_free_full(slist, (GDestroyNotify)free_params); return res; }
static Image *ApplyModifier (int modflags, bool reverse, Image *img, const lfModifier *mod) { // Create a new image where we will copy the modified image Image *newimg = new Image (); // Output image always equals input image size, although // this is not a requirement of the library, it's just a // limitation of the testbed. newimg->Resize (img->width, img->height); #ifdef COMBINE_13 int lwidth = img->width * 2 * 3; #else int lwidth = img->width * 2; if (modflags & LF_MODIFY_TCA) lwidth *= 3; #endif float *pos = new float [lwidth]; int step_start = reverse ? 2 : 0; int step_delta = reverse ? -1 : +1; int step_finish = reverse ? -1 : 3; for (int step = step_start; step != step_finish; step += step_delta) { RGBpixel *dst = newimg->image; char *imgdata = (char *)img->image; bool ok = true; img->InitInterpolation (opts.Interpolation); for (unsigned y = 0; ok && y < img->height; y++) switch (step) { #ifdef COMBINE_13 case 0: ok = false; break; case 2: /* TCA and geometry correction */ ok = mod->ApplySubpixelGeometryDistortion (0.0, y, img->width, 1, pos); #else case 0: /* TCA correction */ ok = mod->ApplySubpixelDistortion (0.0, y, img->width, 1, pos); #endif if (ok) { float *src = pos; for (unsigned x = 0; x < img->width; x++) { dst->red = img->GetR (src [0], src [1]); dst->green = img->GetG (src [2], src [3]); dst->blue = img->GetB (src [4], src [5]); src += 2 * 3; dst++; } } break; case 1: /* Colour correction: vignetting */ ok = mod->ApplyColorModification (imgdata, 0.0, y, img->width, 1, LF_CR_4 (RED, GREEN, BLUE, UNKNOWN), 0); imgdata += img->width * 4; break; #ifndef COMBINE_13 case 2: /* Distortion and geometry correction, scaling */ ok = mod->ApplyGeometryDistortion (0.0, y, newimg->width, 1, pos); if (ok) { float *src = pos; for (unsigned x = 0; x < img->width; x++) { img->Get (*dst, src [0], src [1]); src += 2; dst++; } } break; #endif } // After TCA and distortion steps switch img and newimg. // This is crucial since newimg is now the input image // to the next stage. if (ok && (step == 0 || step == 2)) { Image *tmp = newimg; newimg = img; img = tmp; } } delete [] pos; delete newimg; return img; }