SourcePP
Several modern C++20 libraries for sanely parsing Valve's formats.
Loading...
Searching...
No Matches
ImagePixel.h File Reference
#include <bit>
#include <concepts>
#include <cstring>
#include <BufferStream.h>
#include "ImageFormats.h"
Include dependency graph for ImagePixel.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Namespaces

namespace  vtfpp
namespace  vtfpp::ImagePixel

Concepts

concept  vtfpp::ImagePixel::PixelType

Macros

#define VTFPP_FORMAT_ACCESSOR(channel, channelCaps)
#define VTFPP_A   VTFPP_FORMAT_ACCESSOR(a, A)
#define VTFPP_B   VTFPP_FORMAT_ACCESSOR(b, B)
#define VTFPP_G   VTFPP_FORMAT_ACCESSOR(g, G)
#define VTFPP_I   VTFPP_FORMAT_ACCESSOR(i, I)
#define VTFPP_L   VTFPP_FORMAT_ACCESSOR(l, L)
#define VTFPP_P   VTFPP_FORMAT_ACCESSOR(p, P)
#define VTFPP_Q   VTFPP_FORMAT_ACCESSOR(q, Q)
#define VTFPP_R   VTFPP_FORMAT_ACCESSOR(r, R)
#define VTFPP_U   VTFPP_FORMAT_ACCESSOR(u, U)
#define VTFPP_V   VTFPP_FORMAT_ACCESSOR(v, V)
#define VTFPP_W   VTFPP_FORMAT_ACCESSOR(w, W)
#define VTFPP_X   VTFPP_FORMAT_ACCESSOR(x, X)
#define VTFPP_FORMAT_ACCESSOR_BSWAP(format, channel, channelCaps)
#define VTFPP_A_BSWAP(format)
#define VTFPP_B_BSWAP(format)
#define VTFPP_G_BSWAP(format)
#define VTFPP_R_BSWAP(format)
#define VTFPP_X_BSWAP(format)
#define VTFPP_FORMAT_INTERNAL(bo, ...)
#define VTFPP_FORMAT_LE(...)
#define VTFPP_FORMAT_BE(...)
#define VTFPP_FORMAT(format, internalFormatClasses, accessors)

Functions

 vtfpp::ImagePixel::VTFPP_FORMAT (RGBA8888, VTFPP_FORMAT_BE(uint8_t a, b, g, r), VTFPP_R VTFPP_G VTFPP_B VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (ABGR8888, VTFPP_FORMAT_BE(uint8_t r, g, b, a), VTFPP_A VTFPP_B VTFPP_G VTFPP_R)
 vtfpp::ImagePixel::VTFPP_FORMAT (RGB888, VTFPP_FORMAT_BE(uint8_t b, g, r), VTFPP_R VTFPP_G VTFPP_B)
 vtfpp::ImagePixel::VTFPP_FORMAT (BGR888, VTFPP_FORMAT_BE(uint8_t r, g, b), VTFPP_B VTFPP_G VTFPP_R)
 vtfpp::ImagePixel::VTFPP_FORMAT (RGB565, VTFPP_FORMAT_BE(uint16_t data), VTFPP_R_BSWAP(RGB565) VTFPP_G_BSWAP(RGB565) VTFPP_B_BSWAP(RGB565))
 vtfpp::ImagePixel::VTFPP_FORMAT (I8, VTFPP_FORMAT_BE(uint8_t i), VTFPP_I)
 vtfpp::ImagePixel::VTFPP_FORMAT (IA88, VTFPP_FORMAT_BE(uint8_t a, i), VTFPP_I VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (P8, VTFPP_FORMAT_BE(uint8_t p), VTFPP_P)
 vtfpp::ImagePixel::VTFPP_FORMAT (A8, VTFPP_FORMAT_BE(uint8_t a), VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (RGB888_BLUESCREEN, VTFPP_FORMAT_BE(uint8_t b, g, r), VTFPP_R VTFPP_G VTFPP_B)
 vtfpp::ImagePixel::VTFPP_FORMAT (BGR888_BLUESCREEN, VTFPP_FORMAT_BE(uint8_t r, g, b), VTFPP_B VTFPP_G VTFPP_R)
 vtfpp::ImagePixel::VTFPP_FORMAT (ARGB8888, VTFPP_FORMAT_BE(uint8_t b, g, r, a), VTFPP_A VTFPP_R VTFPP_G VTFPP_B)
 vtfpp::ImagePixel::VTFPP_FORMAT (BGRA8888, VTFPP_FORMAT_BE(uint8_t a, r, g, b), VTFPP_B VTFPP_G VTFPP_R VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (BGRX8888, VTFPP_FORMAT_BE(uint8_t x, r, g, b), VTFPP_B VTFPP_G VTFPP_R VTFPP_X)
 vtfpp::ImagePixel::VTFPP_FORMAT (BGR565, VTFPP_FORMAT_BE(uint16_t data), VTFPP_B_BSWAP(BGR565) VTFPP_G_BSWAP(BGR565) VTFPP_R_BSWAP(BGR565))
 vtfpp::ImagePixel::VTFPP_FORMAT (BGRX5551, VTFPP_FORMAT_BE(uint16_t data), VTFPP_B_BSWAP(BGRX5551) VTFPP_G_BSWAP(BGRX5551) VTFPP_R_BSWAP(BGRX5551) VTFPP_X_BSWAP(BGRX5551))
 vtfpp::ImagePixel::VTFPP_FORMAT (BGRA4444, VTFPP_FORMAT_BE(uint16_t data), VTFPP_B_BSWAP(BGRA4444) VTFPP_G_BSWAP(BGRA4444) VTFPP_R_BSWAP(BGRA4444) VTFPP_A_BSWAP(BGRA4444))
 vtfpp::ImagePixel::VTFPP_FORMAT (BGRA5551, VTFPP_FORMAT_BE(uint16_t data), VTFPP_B_BSWAP(BGRA5551) VTFPP_G_BSWAP(BGRA5551) VTFPP_R_BSWAP(BGRA5551) VTFPP_A_BSWAP(BGRA5551))
 vtfpp::ImagePixel::VTFPP_FORMAT (UV88, VTFPP_FORMAT_BE(uint8_t v, u), VTFPP_U VTFPP_V)
 vtfpp::ImagePixel::VTFPP_FORMAT (UVWQ8888, VTFPP_FORMAT_BE(uint8_t q, w, v, u), VTFPP_U VTFPP_V VTFPP_W VTFPP_Q)
 vtfpp::ImagePixel::VTFPP_FORMAT (RGBA16161616F, VTFPP_FORMAT_BE(half a, b, g, r), VTFPP_R VTFPP_G VTFPP_B VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (RGBA16161616, VTFPP_FORMAT_BE(uint16_t a, b, g, r), VTFPP_R VTFPP_G VTFPP_B VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (UVLX8888, VTFPP_FORMAT_BE(uint8_t x, l, v, u), VTFPP_U VTFPP_V VTFPP_L VTFPP_X)
 vtfpp::ImagePixel::VTFPP_FORMAT (R32F, VTFPP_FORMAT_BE(float r), VTFPP_R)
 vtfpp::ImagePixel::VTFPP_FORMAT (RGB323232F, VTFPP_FORMAT_BE(float b, g, r), VTFPP_R VTFPP_G VTFPP_B)
 vtfpp::ImagePixel::VTFPP_FORMAT (RGBA32323232F, VTFPP_FORMAT_BE(float a, b, g, r), VTFPP_R VTFPP_G VTFPP_B VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (RG1616F, VTFPP_FORMAT_BE(half g, r), VTFPP_R VTFPP_G)
 vtfpp::ImagePixel::VTFPP_FORMAT (RG3232F, VTFPP_FORMAT_BE(float g, r), VTFPP_R VTFPP_G)
 vtfpp::ImagePixel::VTFPP_FORMAT (RGBX8888, VTFPP_FORMAT_BE(uint8_t x, b, g, r), VTFPP_R VTFPP_G VTFPP_B VTFPP_X)
 vtfpp::ImagePixel::VTFPP_FORMAT (RGBA1010102, VTFPP_FORMAT_BE(uint32_t data), VTFPP_R_BSWAP(RGBA1010102) VTFPP_G_BSWAP(RGBA1010102) VTFPP_B_BSWAP(RGBA1010102) VTFPP_A_BSWAP(RGBA1010102))
 vtfpp::ImagePixel::VTFPP_FORMAT (BGRA1010102, VTFPP_FORMAT_BE(uint32_t data), VTFPP_B_BSWAP(RGBA1010102) VTFPP_G_BSWAP(RGBA1010102) VTFPP_R_BSWAP(RGBA1010102) VTFPP_A_BSWAP(RGBA1010102))
 vtfpp::ImagePixel::VTFPP_FORMAT (R16F, VTFPP_FORMAT_BE(half r), VTFPP_R)
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_BGRX8888_LINEAR, VTFPP_FORMAT_BE(uint8_t x, r, g, b), VTFPP_B VTFPP_G VTFPP_R VTFPP_X)
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_RGBA8888_LINEAR, VTFPP_FORMAT_BE(uint8_t a, b, g, r), VTFPP_R VTFPP_G VTFPP_B VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_ABGR8888_LINEAR, VTFPP_FORMAT_BE(uint8_t r, g, b, a), VTFPP_A VTFPP_B VTFPP_G VTFPP_R)
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_ARGB8888_LINEAR, VTFPP_FORMAT_BE(uint8_t b, g, r, a), VTFPP_A VTFPP_R VTFPP_G VTFPP_B)
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_BGRA8888_LINEAR, VTFPP_FORMAT_BE(uint8_t a, r, g, b), VTFPP_B VTFPP_G VTFPP_R VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_RGB888_LINEAR, VTFPP_FORMAT_BE(uint8_t b, g, r), VTFPP_R VTFPP_G VTFPP_B)
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_BGR888_LINEAR, VTFPP_FORMAT_BE(uint8_t r, g, b), VTFPP_B VTFPP_G VTFPP_R)
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_BGRX5551_LINEAR, VTFPP_FORMAT_BE(uint16_t data), VTFPP_B_BSWAP(CONSOLE_BGRX5551_LINEAR) VTFPP_G_BSWAP(CONSOLE_BGRX5551_LINEAR) VTFPP_R_BSWAP(CONSOLE_BGRX5551_LINEAR) VTFPP_X_BSWAP(CONSOLE_BGRX5551_LINEAR))
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_I8_LINEAR, VTFPP_FORMAT_BE(uint8_t i), VTFPP_I)
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_RGBA16161616_LINEAR, VTFPP_FORMAT_BE(uint16_t a, b, g, r), VTFPP_R VTFPP_G VTFPP_B VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_BGRX8888_LE, VTFPP_FORMAT_BE(uint8_t x, r, g, b), VTFPP_B VTFPP_G VTFPP_R VTFPP_X)
 vtfpp::ImagePixel::VTFPP_FORMAT (CONSOLE_BGRA8888_LE, VTFPP_FORMAT_BE(uint8_t a, r, g, b), VTFPP_B VTFPP_G VTFPP_R VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (STRATA_R8, VTFPP_FORMAT_BE(uint8_t r), VTFPP_R)
 vtfpp::ImagePixel::VTFPP_FORMAT (SOURCEPP_BGRA8888_HDR, VTFPP_FORMAT_BE(uint8_t a, b, g, r), VTFPP_R VTFPP_G VTFPP_B VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (SOURCEPP_RGBA16161616_HDR, VTFPP_FORMAT_BE(uint16_t a, b, g, r), VTFPP_R VTFPP_G VTFPP_B VTFPP_A)
 vtfpp::ImagePixel::VTFPP_FORMAT (SOURCEPP_CONSOLE_RGBA16161616_HDR, VTFPP_FORMAT_BE(uint16_t a, b, g, r), VTFPP_R VTFPP_G VTFPP_B VTFPP_A)
template<PixelType P, typename C>
std::vector< std::byte > vtfpp::ImagePixel::extractChannelFromImageData (std::span< const std::byte > imageData, C(P::*channel)() const)
 Extracts a single channel from the given image data.
template<PixelType InputPixel, typename Func>
void vtfpp::ImagePixel::transformInPlace (std::span< std::byte > imageData, Func callback)
 Run a parallelizable/vectorizable operation on the given image data.
template<PixelType InputPixel, PixelType OutputPixel, typename Func>
std::vector< std::byte > vtfpp::ImagePixel::transform (std::span< const std::byte > imageData, Func callback)
 Run a parallelizable/vectorizable operation on the given image data, and return new image data.

Macro Definition Documentation

◆ VTFPP_A

#define VTFPP_A   VTFPP_FORMAT_ACCESSOR(a, A)

Definition at line 33 of file ImagePixel.h.

◆ VTFPP_A_BSWAP

#define VTFPP_A_BSWAP ( format)
Value:
#define VTFPP_FORMAT_ACCESSOR_BSWAP(format, channel, channelCaps)
Definition ImagePixel.h:46

Definition at line 68 of file ImagePixel.h.

◆ VTFPP_B

#define VTFPP_B   VTFPP_FORMAT_ACCESSOR(b, B)

Definition at line 34 of file ImagePixel.h.

◆ VTFPP_B_BSWAP

#define VTFPP_B_BSWAP ( format)
Value:

Definition at line 69 of file ImagePixel.h.

◆ VTFPP_FORMAT

#define VTFPP_FORMAT ( format,
internalFormatClasses,
accessors )
Value:
class format { \
public: \
static constexpr auto FORMAT = ImageFormat::format; \
internalFormatClasses \
protected: \
union Pixel { \
LE le; \
BE be; \
Pixel() { std::memset(this, 0, sizeof(Pixel)); } \
} pixel; \
public: \
format() = default; \
format(LE le) { \
if constexpr (std::endian::native == std::endian::little) { \
this->pixel.le = le; \
} else { \
BufferStream::swap_endian(&le); \
this->pixel.be = std::bit_cast<BE>(le); \
} \
} \
accessors \
}; static_assert(std::is_trivially_copyable_v<format> && sizeof(format) == ImageFormatDetails::bpp(ImageFormat::format) / 8)

Definition at line 82 of file ImagePixel.h.

◆ VTFPP_FORMAT_ACCESSOR

#define VTFPP_FORMAT_ACCESSOR ( channel,
channelCaps )
Value:
[[nodiscard]] constexpr auto channel() const { \
if constexpr (std::endian::native == std::endian::little) { \
return pixel.le.channel; \
} else { \
return pixel.be.channel; \
} \
} \
constexpr void set##channelCaps(decltype(pixel.le.channel) value) { \
if constexpr (std::endian::native == std::endian::little) { \
pixel.le.channel = value; \
} else { \
pixel.be.channel = value; \
} \
}

Definition at line 17 of file ImagePixel.h.

◆ VTFPP_FORMAT_ACCESSOR_BSWAP

#define VTFPP_FORMAT_ACCESSOR_BSWAP ( format,
channel,
channelCaps )
Value:
[[nodiscard]] constexpr auto channel() const { \
if constexpr (std::endian::native == std::endian::little) { \
return pixel.le.channel; \
} else { \
auto swapped = pixel.be.data; \
BufferStream::swap_endian(&swapped); \
return std::bit_cast<LE>(swapped).channel; \
} \
} \
constexpr void set##channelCaps(decltype(pixel.le.channel) value) { \
if constexpr (std::endian::native == std::endian::little) { \
pixel.le.channel = value; \
} else { \
auto pixelLE = std::bit_cast<LE>(pixel.be.data); \
pixelLE.channel = value; \
auto swapped = std::bit_cast<decltype(pixel.be.data)>(pixelLE); \
BufferStream::swap_endian(&swapped); \
pixel.be.data = swapped; \
} \
}

Definition at line 46 of file ImagePixel.h.

◆ VTFPP_FORMAT_BE

#define VTFPP_FORMAT_BE ( ...)
Value:
VTFPP_FORMAT_INTERNAL(BE, __VA_ARGS__)
#define VTFPP_FORMAT_INTERNAL(bo,...)
Definition ImagePixel.h:74

Definition at line 80 of file ImagePixel.h.

◆ VTFPP_FORMAT_INTERNAL

#define VTFPP_FORMAT_INTERNAL ( bo,
... )
Value:
struct bo { \
__VA_ARGS__; \
}; static_assert(std::is_trivially_copyable_v<bo> && sizeof(bo) == ImageFormatDetails::bpp(FORMAT) / 8);

Definition at line 74 of file ImagePixel.h.

◆ VTFPP_FORMAT_LE

#define VTFPP_FORMAT_LE ( ...)
Value:
VTFPP_FORMAT_INTERNAL(LE, __VA_ARGS__)

Definition at line 79 of file ImagePixel.h.

◆ VTFPP_G

#define VTFPP_G   VTFPP_FORMAT_ACCESSOR(g, G)

Definition at line 35 of file ImagePixel.h.

◆ VTFPP_G_BSWAP

#define VTFPP_G_BSWAP ( format)
Value:

Definition at line 70 of file ImagePixel.h.

◆ VTFPP_I

#define VTFPP_I   VTFPP_FORMAT_ACCESSOR(i, I)

Definition at line 36 of file ImagePixel.h.

◆ VTFPP_L

#define VTFPP_L   VTFPP_FORMAT_ACCESSOR(l, L)

Definition at line 37 of file ImagePixel.h.

◆ VTFPP_P

#define VTFPP_P   VTFPP_FORMAT_ACCESSOR(p, P)

Definition at line 38 of file ImagePixel.h.

◆ VTFPP_Q

#define VTFPP_Q   VTFPP_FORMAT_ACCESSOR(q, Q)

Definition at line 39 of file ImagePixel.h.

◆ VTFPP_R

#define VTFPP_R   VTFPP_FORMAT_ACCESSOR(r, R)

Definition at line 40 of file ImagePixel.h.

◆ VTFPP_R_BSWAP

#define VTFPP_R_BSWAP ( format)
Value:

Definition at line 71 of file ImagePixel.h.

◆ VTFPP_U

#define VTFPP_U   VTFPP_FORMAT_ACCESSOR(u, U)

Definition at line 41 of file ImagePixel.h.

◆ VTFPP_V

#define VTFPP_V   VTFPP_FORMAT_ACCESSOR(v, V)

Definition at line 42 of file ImagePixel.h.

◆ VTFPP_W

#define VTFPP_W   VTFPP_FORMAT_ACCESSOR(w, W)

Definition at line 43 of file ImagePixel.h.

◆ VTFPP_X

#define VTFPP_X   VTFPP_FORMAT_ACCESSOR(x, X)

Definition at line 44 of file ImagePixel.h.

◆ VTFPP_X_BSWAP

#define VTFPP_X_BSWAP ( format)
Value:

Definition at line 72 of file ImagePixel.h.