Archived
1
Fork 0
This repository has been archived on 2025-04-09. You can view files and clone it, but cannot push or open issues or pull requests.
compress/include/basics.hpp

112 lines
2.2 KiB
C++

//
// 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 copyable (for memcpy).
Furthermore it should have a static const size_t num_colors indicating the
number of colors and a static const size_t bit_per_color indicating the
number of bits per color (TODO: what to do with encodings like 565 ?)
*/
#include <cstdint>
#include <algorithm>
namespace pixel_formats {
template <typename T>
uint8_t clamp(T n){
return uint8_t(std::min<T>(255, std::max<T>(0, n)));
}
struct gray {
static const size_t num_colors = 1;
static const 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 const size_t num_colors = 3;
static const size_t bits_per_color = 8;
rgb()
: r(0)
, g(0)
, b(0)
{}
rgb(double red, double green, double blue)
: r(clamp(255*red))
, g(clamp(255*green))
, b(clamp(255*blue))
{}
rgb(int red, int green, int blue)
: r(clamp(red))
, g(clamp(green))
, b(clamp(blue))
{}
private:
uint8_t r, g, b;
};
struct bgr{
static const size_t num_colors = 3;
static const size_t bits_per_color = 8;
bgr()
: b(0)
, g(0)
, r(0)
{}
bgr(double red, double green, double blue)
: b(clamp(255*blue))
, g(clamp(255*green))
, r(clamp(255*red))
{}
bgr(int red, int green, int blue)
: b(clamp(blue))
, g(clamp(green))
, r(clamp(red))
{}
private:
uint8_t b, g, r;
};
template <typename PixelType>
struct traits {
static const size_t num_colors = PixelType::num_colors;
static const size_t bits_per_color = PixelType::bits_per_color;
static const size_t bits_per_pixel = num_colors * bits_per_color;
};
}
#endif