/*
 * Copyright 2023 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 RISP4ML_COMMON_IMAGE_H_
#define RISP4ML_COMMON_IMAGE_H_

#include <stdbool.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif  // __cplusplus

typedef uint16_t pixel_type_t;

typedef struct {
  uint16_t num_channels;
  uint16_t height;
  uint16_t width;
  pixel_type_t* data;
} Image;

typedef struct {
  uint16_t num_channels;
  uint16_t height;
  uint16_t width;
  uint8_t* data;
} ImageU8;

Image* image_new(uint16_t num_channels, uint16_t height, uint16_t width);

void image_delete(Image* image);

pixel_type_t* image_pixel(Image* image, uint16_t c, uint16_t y, uint16_t x);

static inline pixel_type_t image_pixel_val(Image* image, uint16_t c, uint16_t y,
                                           uint16_t x) {
  return *image_pixel(image, c, y, x);
}

pixel_type_t* image_row(Image* image, uint16_t c, uint16_t y);

#ifdef __cplusplus
}  // extern "C"
#endif  // __cplusplus

#endif  // RISP4ML_COMMON_IMAGE_H_
