/*
 * Copyright 2022 Google LLC
 *
 * 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.
 */

#ifndef SAMPLES_RISP4ML_COMMON_TEST_UTILS_H_
#define SAMPLES_RISP4ML_COMMON_TEST_UTILS_H_

#include <stdio.h>
#include <stdlib.h>

#include "samples/risp4ml/common/image.h"

inline pixel_type_t Pattern(uint16_t c, uint16_t y, uint16_t x) {
  return (pixel_type_t)(x + y * 100 + c * 10000);
}

inline void FillImage(Image* img) {
  for (uint16_t c = 0; c < img->num_channels; ++c) {
    for (uint16_t y = 0; y < img->height; ++y) {
      for (uint16_t x = 0; x < img->width; ++x) {
        *image_pixel(img, c, y, x) = Pattern(c, y, x);
      }
    }
  }
}

// Initializes raw image to random value within min and max range
inline void InitImageRandom(Image* image, pixel_type_t min_val,
                            pixel_type_t max_val) {
  pixel_type_t range = max_val + 1 - min_val;
  for (uint16_t c = 0; c < image->num_channels; ++c) {
    for (uint16_t y = 0; y < image->height; ++y) {
      for (uint16_t x = 0; x < image->width; ++x) {
        *image_pixel(image, 0, y, x) = (pixel_type_t)(rand() % range + min_val);
      }
    }
  }
}

// Initializes raw image to raw pixel value
inline void InitImage(Image* image, pixel_type_t val) {
  for (uint16_t c = 0; c < image->num_channels; ++c) {
    for (uint16_t y = 0; y < image->height; ++y) {
      for (uint16_t x = 0; x < image->width; ++x) {
        *image_pixel(image, 0, y, x) = val;
      }
    }
  }
}

#endif  // SAMPLES_RISP4ML_COMMON_TEST_UTILS_H_
