// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_CAMERA_LIB_IMAGE_UTILS_BLC_H_
#define SRC_CAMERA_LIB_IMAGE_UTILS_BLC_H_

#include <lib/zx/vmo.h>

#include <vector>

namespace camera {

// Struct to pass around the results of the BLC algorithm.
struct BlcResult {
  uint32_t avg_r, avg_gr, avg_gb, avg_b;
};

// Comparator logic for blc_result
inline bool operator==(const BlcResult lhs, const BlcResult rhs) {
  return lhs.avg_r == rhs.avg_r && lhs.avg_gr == rhs.avg_gr && lhs.avg_gb == rhs.avg_gb &&
         lhs.avg_b == rhs.avg_b;
}

// Args:
//  |vmo| Memory object containing the image to run BLC on.
//  |width| The width of the image; needed to calculate image size and stride.
//  |height| The height of the image; needed to calculate image size.
//  |bytes_per_pixel| Integer denoting how many bytes each pixel consists of; needed to calculate
//                    image stride.
// Returns:
//  A struct containing the results of the BLC run on the passed-in image.
BlcResult BlcRaw12(const zx::vmo* vmo, uint32_t width, uint32_t height, uint8_t bytes_per_pixel);

// Helper method to add integers from a tuple to other integers, in their respective order.
// Args:
//  |first_val| The target integer to add the first tuple value to.
//  |second_val| The target integer to add the second tuple value to.
//  |p| The pair containing values to add to the target integers.
void AddValsFromPairToTargetInts(uint32_t* first_val, uint32_t* second_val,
                                 std::pair<uint16_t, uint16_t> p);

}  // namespace camera

#endif  // SRC_CAMERA_LIB_IMAGE_UTILS_BLC_H_
