// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#include "../gpuKernelDef.h"

#define lut_ptr global_mem
static __constant sampler_t smp = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_LINEAR;

static inline float4 read_texture_vs(read_only image2d_t tex, float2 uv) { return read_imagef(tex, smp, uv); }

static inline float2 read_coord_vs(read_only image2d_t tex, float2 uv) { return read_imagef(tex, smp, uv).xy; }

static inline void write_texture_vs(float4 color, write_only image2d_t img, int2 coords) {
  write_imagef(img, coords, color);
}

static inline void surface_read_depth(float *depth, surface_t surf, int x, int y) {
  // TODO FIXME
  // no way to write a float to a 2D surface in OpenCL yet
}

static inline void surface_write_depth(float depth, surface_t surf, int x, int y) {
  // TODO FIXME
  // no way to write a float to a 2D surface in OpenCL yet
}

#include "../core/photoStack.h"

#define LinearPhotoCorrection_setup PhotoCorrection_linear_setup
#define LinearPhotoCorrection_corr PhotoCorrection_linear_corr
#define LinearPhotoCorrection_invCorr PhotoCorrection_linear_invCorr

#define GammaPhotoCorrection_setup PhotoCorrection_gamma_setup
#define GammaPhotoCorrection_corr PhotoCorrection_gamma_corr
#define GammaPhotoCorrection_invCorr PhotoCorrection_gamma_invCorr

#define EmorPhotoCorrection_setup PhotoCorrection_emor_setup
#define EmorPhotoCorrection_corr PhotoCorrection_emor_corr
#define EmorPhotoCorrection_invCorr PhotoCorrection_emor_invCorr

static inline bool OutputRectCropper_isPanoPointVisible(int x, int y, int panoWidth, int panoHeight) { return true; }

static inline bool OutputCircleCropper_isPanoPointVisible(int x, int y, int panoWidth, int panoHeight) { return true; }

static inline bool isWithinCropRect(const float2 uv, float width, float height, float cLeft, float cRight, float cTop,
                                    float cBottom) {
  return 0.0f <= uv.x && uv.x < width && 0.0f <= uv.y && uv.y < height && cLeft <= uv.x && uv.x <= cRight &&
         cTop <= uv.y && uv.y <= cBottom;
}

static inline bool isWithinCropCircle(const float2 uv, float width, float height, float cLeft, float cRight, float cTop,
                                      float cBottom) {
  const float centerX = (cRight + cLeft) / 2.0f;
  const float centerY = (cBottom + cTop) / 2.0f;
  const float radius = fmin(cRight - cLeft, cBottom - cTop) / 2.0f;
  return 0.0f <= uv.x && uv.x < width && 0.0f <= uv.y && uv.y < height &&
         (uv.x - centerX) * (uv.x - centerX) + (uv.y - centerY) * (uv.y - centerY) < radius * radius;
}

static inline float3 get_xyz(float4 val) { return val.xyz; }

#define __float2int_rn convert_int_rte

#ifndef make_float2
#define make_float2(A, B) (float2)((A), (B))
#endif  // make_float2

#include "../image/imageFormat.h"

#include "backend/common/core/types.hpp"
#include "backend/common/core/transformPhotoParam.hpp"
#include "warpMergerKernelDef.h"

#include "mapFunction.h"
#include "photoCorrectionFunction.h"