|
|
|
//
|
|
|
|
// basics.hpp
|
|
|
|
// ImageStreams
|
|
|
|
//
|
|
|
|
// Created by Joshua Moerman on 9/7/12.
|
|
|
|
// Copyright (c) 2012 Vadovas. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef ImageStreams_basics_hpp
|
|
|
|
#define ImageStreams_basics_hpp
|
|
|
|
|
|
|
|
/*
|
|
|
|
A PixelFormat p should have the following constructors (depending on number
|
|
|
|
of colors):
|
|
|
|
p(int r, int g, int b, int a)
|
|
|
|
p(double r, double g, double b, double a)
|
|
|
|
|
|
|
|
p(int v)
|
|
|
|
p(double v)
|
|
|
|
|
|
|
|
The order in the ctor is rgb even though the internal structure may be
|
|
|
|
different
|
|
|
|
|
|
|
|
It should be trivially writable with memcpy (TODO: check exact requirement)
|
|
|
|
|
|
|
|
Furthermore it should have a static constexpr size_t num_colors indicating the
|
|
|
|
number of colors and a static constexpr size_t bit_per_color indicating the
|
|
|
|
number of bits per color (TODO: what to do with encodings like 565 ?)
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace pixel_formats {
|
|
|
|
inline uint8_t clamp(int n){
|
|
|
|
return std::min(255, std::max(0, n));
|
|
|
|
}
|
|
|
|
|
|
|
|
struct gray {
|
|
|
|
static constexpr size_t num_colors = 1;
|
|
|
|
static constexpr size_t bits_per_color = 8;
|
|
|
|
|
|
|
|
gray() : value(0) {}
|
|
|
|
gray(double intensity) : value(clamp(255*intensity)) {}
|
|
|
|
gray(int intensity) : value(clamp(intensity)) {}
|
|
|
|
|
|
|
|
private:
|
|
|
|
uint8_t value;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct rgb {
|
|
|
|
static constexpr size_t num_colors = 3;
|
|
|
|
static constexpr size_t bits_per_color = 8;
|
|
|
|
|
|
|
|
rgb()
|
|
|
|
: red(0)
|
|
|
|
, green(0)
|
|
|
|
, blue(0)
|
|
|
|
{}
|
|
|
|
|
|
|
|
rgb(double red, double green, double blue)
|
|
|
|
: red(clamp(255*red))
|
|
|
|
, green(clamp(255*green))
|
|
|
|
, blue(clamp(255*blue))
|
|
|
|
{}
|
|
|
|
|
|
|
|
rgb(int red, int green, int blue)
|
|
|
|
: red(clamp(red))
|
|
|
|
, green(clamp(green))
|
|
|
|
, blue(clamp(blue))
|
|
|
|
{}
|
|
|
|
|
|
|
|
private:
|
|
|
|
uint8_t red;
|
|
|
|
uint8_t green;
|
|
|
|
uint8_t blue;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct bgr{
|
|
|
|
static constexpr size_t num_colors = 3;
|
|
|
|
static constexpr size_t bits_per_color = 8;
|
|
|
|
|
|
|
|
bgr()
|
|
|
|
: blue(0)
|
|
|
|
, green(0)
|
|
|
|
, red(0)
|
|
|
|
{}
|
|
|
|
|
|
|
|
bgr(double red, double green, double blue)
|
|
|
|
: blue(clamp(255*blue))
|
|
|
|
, green(clamp(255*green))
|
|
|
|
, red(clamp(255*red))
|
|
|
|
{}
|
|
|
|
|
|
|
|
bgr(int red, int green, int blue)
|
|
|
|
: blue(clamp(blue))
|
|
|
|
, green(clamp(green))
|
|
|
|
, red(clamp(red))
|
|
|
|
{}
|
|
|
|
|
|
|
|
private:
|
|
|
|
uint8_t blue;
|
|
|
|
uint8_t green;
|
|
|
|
uint8_t red;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <typename PixelType>
|
|
|
|
struct traits {
|
|
|
|
static constexpr size_t num_colors = PixelType::num_colors;
|
|
|
|
static constexpr size_t bits_per_color = PixelType::bits_per_color;
|
|
|
|
static constexpr size_t bits_per_pixel = num_colors * bits_per_color;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|