| // 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_IMAGE_FORMAT_RGBA_H_ |
| #define SRC_CAMERA_LIB_IMAGE_UTILS_IMAGE_FORMAT_RGBA_H_ |
| |
| #include <fuchsia/sysmem/c/fidl.h> |
| #include <fuchsia/sysmem/cpp/fidl.h> |
| |
| namespace camera { |
| |
| // A convenient way to store RGBA values so they can be converted into various RGBA |
| // formats. If this struct is representing color values which have a bit width |
| // less than 8, the value is shifted to the most significant position. |
| struct Rgba { |
| uint8_t r, g, b, a; |
| |
| // Apply bitwise AND to each channel. |
| Rgba operator&(const Rgba& mask) const { |
| return {static_cast<uint8_t>(r & mask.r), static_cast<uint8_t>(g & mask.g), |
| static_cast<uint8_t>(b & mask.b), static_cast<uint8_t>(a & mask.a)}; |
| } |
| bool operator==(const Rgba& other) const { |
| return r == other.r && g == other.g && b == other.b && a == other.a; |
| } |
| }; |
| |
| // Converts the bit width (0-8) a field has into a mask |
| // for that value, assuming it is shifted into the most significant region |
| // of the byte. |
| Rgba BitWidthToByteMask(Rgba bit_width); |
| Rgba Min(const Rgba& a, const Rgba& b); |
| |
| // Returns the minimum shared bit width between the two formats: |format1| and |format2|. |
| // Each of the |r|, |g|, |b|, |a| return contain a bit width (0-8) for that channel. |
| Rgba RgbaMinRes(fuchsia::sysmem::PixelFormatType format1, fuchsia::sysmem::PixelFormatType format2); |
| |
| // Converts a packed RGB(A) format into 4 individual values. |
| // For formats that have fewer than 8 bits per color, the color values are shifted |
| // to their most significant bits. If the bitwidth of a channel is 0, |
| // (for example a format with no alpha channel), that value is 0. |
| Rgba RgbaUnpack(fuchsia::sysmem::PixelFormatType format, uint32_t packed); |
| |
| // Converts an r, g, b and a value into an RGB(A) format. The format may be smaller |
| // than 4 bytes, in which case the packed pixel value occupies to least significant |
| // position. |
| uint32_t RgbaPack(fuchsia::sysmem::PixelFormatType format, Rgba in); |
| |
| std::string ToString(const fuchsia::sysmem::PixelFormatType& type); |
| |
| // Get the width in bits of each of the components of an RGBA format. |
| Rgba BitWidth(const fuchsia::sysmem::PixelFormatType& type); |
| |
| // Return if |type| is a supported format for the above functions. |
| bool IsSupportedPixelFormat(const fuchsia::sysmem::PixelFormatType& type); |
| |
| std::vector<fuchsia::sysmem::PixelFormatType> GetSupportedFormats(); |
| |
| fuchsia_sysmem_PixelFormat ConvertPixelFormatToC(const fuchsia::sysmem::PixelFormat& format); |
| fuchsia_sysmem_ImageFormat_2 ConvertImageFormatToC(const fuchsia::sysmem::ImageFormat_2& format); |
| |
| } // namespace camera |
| |
| #endif // SRC_CAMERA_LIB_IMAGE_UTILS_IMAGE_FORMAT_RGBA_H_ |