/*

 * Copyright (c) 2017-2017 The Khronos Group Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "test_engine/test.h"
#include <VX/vx.h>
#include <VX/vxu.h>

typedef struct
{
    const char* name;
    vx_enum type;
} method_type_arg;
TESTCASE(MatchTemplate, CT_VXContext, ct_setup_vx_context, 0)

TEST(MatchTemplate, testNodeCreation)
{
    vx_context context = context_->vx_context_;
    vx_graph graph = 0;
    vx_node node = 0;
    vx_image vx_template_image, vx_source_image, vx_result_image;
    CT_Image ct_template_image, ct_source_image;
    ASSERT_NO_FAILURE(ct_template_image = ct_read_image("lena_gray_template.bmp", 1));
    ASSERT_NO_FAILURE(vx_template_image = ct_image_to_vx_image(ct_template_image, context));
    ASSERT_NO_FAILURE(ct_source_image = ct_read_image("lena_gray_source.bmp", 1));
    ASSERT_NO_FAILURE(vx_source_image = ct_image_to_vx_image(ct_source_image, context));

    vx_uint32 source_width;
    vx_uint32 source_height;
    vxQueryImage(vx_source_image, VX_IMAGE_WIDTH, &source_width, sizeof(vx_uint32));
    vxQueryImage(vx_source_image, VX_IMAGE_HEIGHT, &source_height, sizeof(vx_uint32));

    ASSERT_VX_OBJECT(vx_result_image = vxCreateImage(context, source_width, source_height, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(node = vxMatchTemplateNode(graph, vx_source_image, vx_template_image, VX_COMPARE_HAMMING, vx_result_image), VX_TYPE_NODE);

    VX_CALL(vxReleaseNode(&node));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&vx_template_image));
    VX_CALL(vxReleaseImage(&vx_source_image));
    VX_CALL(vxReleaseImage(&vx_result_image));

    ASSERT(vx_template_image == 0);
    ASSERT(vx_source_image == 0);
    ASSERT(vx_result_image == 0);
}

TEST_WITH_ARG(MatchTemplate, testGraphProcessing, method_type_arg,
        ARG_ENUM(VX_COMPARE_HAMMING),
        ARG_ENUM(VX_COMPARE_L1),
        ARG_ENUM(VX_COMPARE_L2),
        //ARG_ENUM(VX_COMPARE_CCORR),
        ARG_ENUM(VX_COMPARE_L2_NORM),
        ARG_ENUM(VX_COMPARE_CCORR_NORM))
{
    vx_context context = context_->vx_context_;
    vx_graph graph = 0;
    vx_node node = 0;
    vx_image vx_template_image, vx_source_image, vx_result_image;
    CT_Image ct_template_image, ct_source_image;
    ASSERT_NO_FAILURE(ct_template_image = ct_read_image("lena_gray_template.bmp", 1));
    ASSERT_NO_FAILURE(vx_template_image = ct_image_to_vx_image(ct_template_image, context));
    ASSERT_NO_FAILURE(ct_source_image = ct_read_image("lena_gray_source.bmp", 1));
    ASSERT_NO_FAILURE(vx_source_image = ct_image_to_vx_image(ct_source_image, context));

    vx_uint32 template_width, template_height, source_width, source_height, result_width, result_height;
    vxQueryImage(vx_source_image, VX_IMAGE_WIDTH, &source_width, sizeof(vx_uint32));
    vxQueryImage(vx_source_image, VX_IMAGE_HEIGHT, &source_height, sizeof(vx_uint32));
    vxQueryImage(vx_template_image, VX_IMAGE_WIDTH, &template_width, sizeof(vx_uint32));
    vxQueryImage(vx_template_image, VX_IMAGE_HEIGHT, &template_height, sizeof(vx_uint32));
    result_width = source_width - template_width + 1;
    result_height = source_height - template_height + 1;
    ASSERT_VX_OBJECT(vx_result_image = vxCreateImage(context, result_width, result_height, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
    ASSERT_VX_OBJECT(node = vxMatchTemplateNode(graph, vx_source_image, vx_template_image, arg_->type, vx_result_image), VX_TYPE_NODE);
    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    uint32_t mincount = 0, maxcount = 0;
    vx_scalar minval_, maxval_, mincount_, maxcount_;
    vx_array minloc_ = 0, maxloc_ = 0;
    vx_enum sctype = VX_TYPE_INT16;
    minval_ = ct_scalar_from_int(context, sctype, 0);
    maxval_ = ct_scalar_from_int(context, sctype, 0);
    mincount_ = ct_scalar_from_int(context, VX_TYPE_UINT32, 0);
    maxcount_ = ct_scalar_from_int(context, VX_TYPE_UINT32, 0);
    minloc_ = vxCreateArray(context, VX_TYPE_COORDINATES2D, 300);
    maxloc_ = vxCreateArray(context, VX_TYPE_COORDINATES2D, 300);
    node = vxMinMaxLocNode(graph, vx_result_image, minval_, maxval_,
                                   minloc_,
                                   maxloc_,
                                   mincount_,
                                   maxcount_);
    ASSERT_VX_OBJECT(node, VX_TYPE_NODE);
    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));
    vxCopyScalar(mincount_, &mincount, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
    vxCopyScalar(maxcount_, &maxcount, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
    vx_array resultloc = minloc_;
    if(arg_->type == VX_COMPARE_CCORR || arg_->type == VX_COMPARE_CCORR_NORM)
    {
        resultloc = maxloc_;
    }
    vx_size stride = 0;
    vx_coordinates2d_t *p = NULL;
    vx_map_id map_id;
    vx_coordinates2d_t result = {0,0};
    VX_CALL(vxMapArrayRange(resultloc, 0, 1, &map_id, &stride, (void **)&p, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X));
    result = p[0];
    VX_CALL(vxUnmapArrayRange(resultloc, map_id));

    //The correct match point is (24, 24), and error range is +/- 1 pixel.
    ASSERT(result.x > 24 - 2 && result.x < 24 + 2);
    ASSERT(result.y > 24 - 2 && result.y < 24 + 2);

    VX_CALL(vxReleaseScalar(&minval_));
    VX_CALL(vxReleaseScalar(&maxval_));
    VX_CALL(vxReleaseScalar(&mincount_));
    VX_CALL(vxReleaseScalar(&maxcount_));
    VX_CALL(vxReleaseArray(&minloc_));
    VX_CALL(vxReleaseArray(&maxloc_));
    VX_CALL(vxReleaseNode(&node));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&vx_template_image));
    VX_CALL(vxReleaseImage(&vx_source_image));
    VX_CALL(vxReleaseImage(&vx_result_image));

    ASSERT(vx_template_image == 0);
    ASSERT(vx_source_image == 0);
    ASSERT(vx_result_image == 0);
}
TEST_WITH_ARG(MatchTemplate,  testImmediateProcessing, method_type_arg,
        ARG_ENUM(VX_COMPARE_HAMMING),
        ARG_ENUM(VX_COMPARE_L1),
        ARG_ENUM(VX_COMPARE_L2),
        //ARG_ENUM(VX_COMPARE_CCORR),
        ARG_ENUM(VX_COMPARE_L2_NORM),
        ARG_ENUM(VX_COMPARE_CCORR_NORM))
{
    vx_context context = context_->vx_context_;
    vx_image vx_template_image, vx_source_image, vx_result_image;
    CT_Image ct_template_image, ct_source_image;
    ASSERT_NO_FAILURE(ct_template_image = ct_read_image("lena_gray_template.bmp", 1));
    ASSERT_NO_FAILURE(vx_template_image = ct_image_to_vx_image(ct_template_image, context));
    ASSERT_NO_FAILURE(ct_source_image = ct_read_image("lena_gray_source.bmp", 1));
    ASSERT_NO_FAILURE(vx_source_image = ct_image_to_vx_image(ct_source_image, context));

    vx_uint32 template_width, template_height, source_width, source_height, result_width, result_height;
    vxQueryImage(vx_source_image, VX_IMAGE_WIDTH, &source_width, sizeof(vx_uint32));
    vxQueryImage(vx_source_image, VX_IMAGE_HEIGHT, &source_height, sizeof(vx_uint32));
    vxQueryImage(vx_template_image, VX_IMAGE_WIDTH, &template_width, sizeof(vx_uint32));
    vxQueryImage(vx_template_image, VX_IMAGE_HEIGHT, &template_height, sizeof(vx_uint32));
    result_width = source_width - template_width + 1;
    result_height = source_height - template_height + 1;
    ASSERT_VX_OBJECT(vx_result_image = vxCreateImage(context, result_width, result_height, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);

    VX_CALL(vxuMatchTemplate(context, vx_source_image, vx_template_image, arg_->type, vx_result_image));

    uint32_t mincount = 0, maxcount = 0;
    vx_scalar minval_, maxval_, mincount_, maxcount_;
    vx_array minloc_ = 0, maxloc_ = 0;
    vx_enum sctype = VX_TYPE_INT16;
    minval_ = ct_scalar_from_int(context, sctype, 0);
    maxval_ = ct_scalar_from_int(context, sctype, 0);
    mincount_ = ct_scalar_from_int(context, VX_TYPE_UINT32, 0);
    maxcount_ = ct_scalar_from_int(context, VX_TYPE_UINT32, 0);
    minloc_ = vxCreateArray(context, VX_TYPE_COORDINATES2D, 300);
    maxloc_ = vxCreateArray(context, VX_TYPE_COORDINATES2D, 300);
    VX_CALL(vxuMinMaxLoc(context, vx_result_image, minval_, maxval_,
                                   minloc_,
                                   maxloc_,
                                   mincount_,
                                   maxcount_));
    vxCopyScalar(mincount_, &mincount, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
    vxCopyScalar(maxcount_, &maxcount, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
    vx_array resultloc = minloc_;
    if(arg_->type == VX_COMPARE_CCORR || arg_->type == VX_COMPARE_CCORR_NORM)
    {
        resultloc = maxloc_;
    }
    vx_size stride = 0;
    vx_coordinates2d_t *p = NULL;
    vx_map_id map_id;
    vx_coordinates2d_t result = {0,0};
    VX_CALL(vxMapArrayRange(resultloc, 0, 1, &map_id, &stride, (void **)&p, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X));
    result = p[0];
    VX_CALL(vxUnmapArrayRange(resultloc, map_id));

    //The correct match point is (24, 24), and error range is +/- 1 pixel.
    ASSERT(result.x > 24 - 2 && result.x < 24 + 2);
    ASSERT(result.y > 24 - 2 && result.y < 24 + 2);

    VX_CALL(vxReleaseScalar(&minval_));
    VX_CALL(vxReleaseScalar(&maxval_));
    VX_CALL(vxReleaseScalar(&mincount_));
    VX_CALL(vxReleaseScalar(&maxcount_));
    VX_CALL(vxReleaseArray(&minloc_));
    VX_CALL(vxReleaseArray(&maxloc_));
    VX_CALL(vxReleaseImage(&vx_template_image));
    VX_CALL(vxReleaseImage(&vx_source_image));
    VX_CALL(vxReleaseImage(&vx_result_image));

    ASSERT(vx_template_image == 0);
    ASSERT(vx_source_image == 0);
    ASSERT(vx_result_image == 0);}

TESTCASE_TESTS(MatchTemplate, testNodeCreation, testGraphProcessing, testImmediateProcessing)
