Blame tests/test_modifier_coord_geometry.cpp

Packit Service 48484a
#include <glib.h>
Packit Service 48484a
Packit Service 48484a
#include <clocale>
Packit Service 48484a
#include <vector>
Packit Service 48484a
#include <string>
Packit Service 48484a
#include <map>
Packit Service 48484a
#include <limits>
Packit Service 48484a
Packit Service 48484a
#include <cstdlib>
Packit Service 48484a
#include <cstdio>
Packit Service 48484a
#include <cmath>
Packit Service 48484a
Packit Service 48484a
#include "lensfun.h"
Packit Service 48484a
Packit Service 48484a
#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__)
Packit Service 48484a
#include <malloc.h>
Packit Service 48484a
#endif
Packit Service 48484a
#ifdef __APPLE__
Packit Service 48484a
#include <sys/malloc.h>
Packit Service 48484a
#endif
Packit Service 48484a
Packit Service 48484a
#include "common_code.hpp"
Packit Service 48484a
Packit Service 48484a
typedef struct
Packit Service 48484a
{
Packit Service 48484a
  void       *coordBuff;
Packit Service 48484a
  size_t      img_width, img_height;
Packit Service 48484a
  lfLens     *lens;
Packit Service 48484a
  lfModifier *mod;
Packit Service 48484a
} lfFixture;
Packit Service 48484a
Packit Service 48484a
typedef struct
Packit Service 48484a
{
Packit Service 48484a
  bool        reverse;
Packit Service 48484a
  gchar      *sourceType;
Packit Service 48484a
  lfLensType  sourceLensType;
Packit Service 48484a
  gchar      *targetType;
Packit Service 48484a
  lfLensType  targetLensType;
Packit Service 48484a
  size_t      alignment;
Packit Service 48484a
} lfTestParams;
Packit Service 48484a
Packit Service 48484a
// setup a standard lens
Packit Service 48484a
void mod_setup(lfFixture *lfFix, gconstpointer data)
Packit Service 48484a
{
Packit Service 48484a
  lfTestParams *p = (lfTestParams *)data;
Packit Service 48484a
Packit Service 48484a
  lfFix->lens             = new lfLens();
Packit Service 48484a
  lfFix->lens->CropFactor = 1.0f;
Packit Service 48484a
  lfFix->lens->Type       = p->sourceLensType;
Packit Service 48484a
Packit Service 48484a
  lfFix->img_height = 300;
Packit Service 48484a
  lfFix->img_width  = 300;
Packit Service 48484a
Packit Service 48484a
  lfFix->mod = lfModifier::Create(lfFix->lens, 1.0f, lfFix->img_width, lfFix->img_height);
Packit Service 48484a
Packit Service 48484a
  lfFix->mod->Initialize(
Packit Service 48484a
    lfFix->lens, LF_PF_F32,
Packit Service 48484a
    24.0f, 2.8f, 1000.0f, 1.0f, p->targetLensType,
Packit Service 48484a
    LF_MODIFY_GEOMETRY, p->reverse);
Packit Service 48484a
Packit Service 48484a
  lfFix->coordBuff = NULL;
Packit Service 48484a
Packit Service 48484a
  const size_t bufsize = 2 * lfFix->img_width * lfFix->img_height * sizeof(float);
Packit Service 48484a
  if(p->alignment == 0)
Packit Service 48484a
    lfFix->coordBuff = g_malloc(bufsize);
Packit Service 48484a
  else
Packit Service 48484a
    lfFix->coordBuff = lf_alloc_align(p->alignment, bufsize);
Packit Service 48484a
}
Packit Service 48484a
Packit Service 48484a
void mod_teardown(lfFixture *lfFix, gconstpointer data)
Packit Service 48484a
{
Packit Service 48484a
  lfTestParams *p = (lfTestParams *)data;
Packit Service 48484a
Packit Service 48484a
  if(p->alignment == 0)
Packit Service 48484a
    g_free(lfFix->coordBuff);
Packit Service 48484a
  else
Packit Service 48484a
    lf_free_align(lfFix->coordBuff);
Packit Service 48484a
Packit Service 48484a
  lfFix->mod->Destroy();
Packit Service 48484a
  delete lfFix->lens;
Packit Service 48484a
}
Packit Service 48484a
Packit Service 48484a
void test_mod_coord_geometry(lfFixture *lfFix, gconstpointer data)
Packit Service 48484a
{
Packit Service 48484a
  for(size_t y = 0; y < lfFix->img_height; y++)
Packit Service 48484a
  {
Packit Service 48484a
    float *coordData = (float *)lfFix->coordBuff + (size_t)2 * y * lfFix->img_width;
Packit Service 48484a
Packit Service 48484a
    g_assert_true(
Packit Service 48484a
      lfFix->mod->ApplyGeometryDistortion(0.0, y, lfFix->img_width, 1, coordData)
Packit Service 48484a
    );
Packit Service 48484a
  }
Packit Service 48484a
}
Packit Service 48484a
Packit Service 48484a
#ifdef _OPENMP
Packit Service 48484a
void test_mod_coord_geometry_parallel(lfFixture *lfFix, gconstpointer data)
Packit Service 48484a
{
Packit Service 48484a
  #pragma omp parallel for schedule(static)
Packit Service 48484a
  for(size_t y = 0; y < lfFix->img_height; y++)
Packit Service 48484a
  {
Packit Service 48484a
    float *coordData = (float *)lfFix->coordBuff + (size_t)2 * y * lfFix->img_width;
Packit Service 48484a
Packit Service 48484a
    g_assert_true(
Packit Service 48484a
      lfFix->mod->ApplyGeometryDistortion(0.0, y, lfFix->img_width, 1, coordData)
Packit Service 48484a
    );
Packit Service 48484a
  }
Packit Service 48484a
}
Packit Service 48484a
#endif
Packit Service 48484a
Packit Service 48484a
gchar *describe(lfTestParams *p, const char *prefix)
Packit Service 48484a
{
Packit Service 48484a
  gchar alignment[32] = "";
Packit Service 48484a
  g_snprintf(alignment, sizeof(alignment), "%lu-byte", p->alignment);
Packit Service 48484a
Packit Service 48484a
  return g_strdup_printf(
Packit Service 48484a
           "/%s/%s/%s/%s/%s",
Packit Service 48484a
           prefix,
Packit Service 48484a
           p->reverse ? "unGeom" : "Geom",
Packit Service 48484a
           p->sourceType,
Packit Service 48484a
           p->targetType,
Packit Service 48484a
           p->alignment == 0 ? "unaligned" : alignment
Packit Service 48484a
         );
Packit Service 48484a
}
Packit Service 48484a
Packit Service 48484a
void add_set_item(lfTestParams *p)
Packit Service 48484a
{
Packit Service 48484a
  gchar *desc = NULL;
Packit Service 48484a
Packit Service 48484a
  desc = describe(p, "modifier/coord/serialFor");
Packit Service 48484a
  g_test_add(desc, lfFixture, p, mod_setup, test_mod_coord_geometry, mod_teardown);
Packit Service 48484a
  g_free(desc);
Packit Service 48484a
  desc = NULL;
Packit Service 48484a
Packit Service 48484a
#ifdef _OPENMP
Packit Service 48484a
  desc = describe(p, "modifier/coord/parallelFor");
Packit Service 48484a
  g_test_add(desc, lfFixture, p, mod_setup, test_mod_coord_geometry_parallel, mod_teardown);
Packit Service 48484a
  g_free(desc);
Packit Service 48484a
  desc = NULL;
Packit Service 48484a
#endif
Packit Service 48484a
}
Packit Service 48484a
Packit Service 48484a
void free_params(gpointer mem)
Packit Service 48484a
{
Packit Service 48484a
  lfTestParams *p = (lfTestParams *)mem;
Packit Service 48484a
Packit Service 48484a
  g_free(p->sourceType);
Packit Service 48484a
  g_free(p->targetType);
Packit Service 48484a
  g_free(mem);
Packit Service 48484a
}
Packit Service 48484a
Packit Service 48484a
int main(int argc, char **argv)
Packit Service 48484a
{
Packit Service 48484a
  setlocale(LC_ALL, "");
Packit Service 48484a
Packit Service 48484a
  g_test_init(&argc, &argv, NULL);
Packit Service 48484a
Packit Service 48484a
  GSList *slist = NULL;
Packit Service 48484a
Packit Service 48484a
  std::vector<bool> reverse;
Packit Service 48484a
  reverse.push_back(false);
Packit Service 48484a
  reverse.push_back(true);
Packit Service 48484a
Packit Service 48484a
  for(std::vector<bool>::iterator it_reverse = reverse.begin(); it_reverse != reverse.end(); ++it_reverse)
Packit Service 48484a
  {
Packit Service 48484a
    std::map<std::string, lfLensType> lensType;
Packit Service 48484a
    lensType["LF_RECTILINEAR"]           = LF_RECTILINEAR;
Packit Service 48484a
    lensType["LF_FISHEYE"]               = LF_FISHEYE;
Packit Service 48484a
    lensType["LF_PANORAMIC"]             = LF_PANORAMIC;
Packit Service 48484a
    lensType["LF_EQUIRECTANGULAR"]       = LF_EQUIRECTANGULAR;
Packit Service 48484a
    lensType["LF_FISHEYE_ORTHOGRAPHIC"]  = LF_FISHEYE_ORTHOGRAPHIC;
Packit Service 48484a
    lensType["LF_FISHEYE_STEREOGRAPHIC"] = LF_FISHEYE_STEREOGRAPHIC;
Packit Service 48484a
    lensType["LF_FISHEYE_EQUISOLID"]     = LF_FISHEYE_EQUISOLID;
Packit Service 48484a
    lensType["LF_FISHEYE_THOBY"]         = LF_FISHEYE_THOBY;
Packit Service 48484a
Packit Service 48484a
    for(std::map<std::string, lfLensType>::iterator it_sourceType = lensType.begin(); it_sourceType != lensType.end(); ++it_sourceType)
Packit Service 48484a
    {
Packit Service 48484a
      for(std::map<std::string, lfLensType>::iterator it_targetType = lensType.begin(); it_targetType != lensType.end(); ++it_targetType)
Packit Service 48484a
      {
Packit Service 48484a
        if(it_sourceType->second == it_targetType->second)
Packit Service 48484a
          continue;
Packit Service 48484a
Packit Service 48484a
        std::vector<size_t> align;
Packit Service 48484a
        align.push_back(0);
Packit Service 48484a
        align.push_back(4  * sizeof(float)); // SSE
Packit Service 48484a
        //align.push_back(8  * sizeof(float)); // AVX
Packit Service 48484a
        //align.push_back(16 * sizeof(float)); // AVX512
Packit Service 48484a
Packit Service 48484a
        for(std::vector<size_t>::iterator it_align = align.begin(); it_align != align.end(); ++it_align)
Packit Service 48484a
        {
Packit Service 48484a
          lfTestParams *p = (lfTestParams *)g_malloc(sizeof(lfTestParams));
Packit Service 48484a
Packit Service 48484a
          p->reverse        = *it_reverse;
Packit Service 48484a
          p->sourceType     = g_strdup(it_sourceType->first.c_str());
Packit Service 48484a
          p->sourceLensType = it_sourceType->second;
Packit Service 48484a
          p->targetType     = g_strdup(it_targetType->first.c_str());
Packit Service 48484a
          p->targetLensType = it_targetType->second;
Packit Service 48484a
          p->alignment      = *it_align;
Packit Service 48484a
Packit Service 48484a
          add_set_item(p);
Packit Service 48484a
Packit Service 48484a
          slist = g_slist_append(slist, p);
Packit Service 48484a
        }
Packit Service 48484a
      }
Packit Service 48484a
    }
Packit Service 48484a
  }
Packit Service 48484a
Packit Service 48484a
  const int res = g_test_run();
Packit Service 48484a
Packit Service 48484a
  g_slist_free_full(slist, (GDestroyNotify)free_params);
Packit Service 48484a
Packit Service 48484a
  return res;
Packit Service 48484a
}