2007-04-17 08:49:19 +00:00
|
|
|
// This code is in the public domain -- castanyo@yahoo.es
|
|
|
|
|
|
|
|
#ifndef NV_IMAGE_COLORBLOCK_H
|
|
|
|
#define NV_IMAGE_COLORBLOCK_H
|
|
|
|
|
|
|
|
#include <nvmath/Color.h>
|
|
|
|
|
|
|
|
namespace nv
|
|
|
|
{
|
|
|
|
class Image;
|
|
|
|
|
|
|
|
/// Uncompressed 4x4 color block.
|
|
|
|
struct ColorBlock
|
|
|
|
{
|
|
|
|
ColorBlock();
|
2007-07-09 10:32:39 +00:00
|
|
|
ColorBlock(const uint * linearImage);
|
2007-04-17 08:49:19 +00:00
|
|
|
ColorBlock(const ColorBlock & block);
|
|
|
|
ColorBlock(const Image * img, uint x, uint y);
|
|
|
|
|
|
|
|
void init(const Image * img, uint x, uint y);
|
2009-10-21 07:39:59 +00:00
|
|
|
void init(uint w, uint h, uint * data, uint x, uint y);
|
|
|
|
void init(uint w, uint h, float * data, uint x, uint y);
|
2007-04-17 08:49:19 +00:00
|
|
|
|
2009-10-21 07:39:59 +00:00
|
|
|
void swizzle(uint x, uint y, uint z, uint w); // 0=r, 1=g, 2=b, 3=a, 4=0xFF, 5=0
|
2007-04-17 08:49:19 +00:00
|
|
|
|
2008-02-16 09:53:07 +00:00
|
|
|
bool isSingleColor() const;
|
2008-04-26 08:02:30 +00:00
|
|
|
bool isSingleColorNoAlpha() const;
|
2007-04-17 08:49:19 +00:00
|
|
|
uint countUniqueColors() const;
|
|
|
|
Color32 averageColor() const;
|
2007-09-04 10:00:32 +00:00
|
|
|
bool hasAlpha() const;
|
2007-04-17 08:49:19 +00:00
|
|
|
|
|
|
|
void diameterRange(Color32 * start, Color32 * end) const;
|
|
|
|
void luminanceRange(Color32 * start, Color32 * end) const;
|
|
|
|
void boundsRange(Color32 * start, Color32 * end) const;
|
|
|
|
void boundsRangeAlpha(Color32 * start, Color32 * end) const;
|
|
|
|
|
|
|
|
void sortColorsByAbsoluteValue();
|
|
|
|
|
|
|
|
void computeRange(const Vector3 & axis, Color32 * start, Color32 * end) const;
|
|
|
|
void sortColors(const Vector3 & axis);
|
|
|
|
|
|
|
|
float volume() const;
|
|
|
|
|
|
|
|
// Accessors
|
|
|
|
const Color32 * colors() const;
|
|
|
|
|
|
|
|
Color32 color(uint i) const;
|
|
|
|
Color32 & color(uint i);
|
|
|
|
|
|
|
|
Color32 color(uint x, uint y) const;
|
|
|
|
Color32 & color(uint x, uint y);
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
Color32 m_color[4*4];
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/// Get pointer to block colors.
|
|
|
|
inline const Color32 * ColorBlock::colors() const
|
|
|
|
{
|
|
|
|
return m_color;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Get block color.
|
|
|
|
inline Color32 ColorBlock::color(uint i) const
|
|
|
|
{
|
|
|
|
nvDebugCheck(i < 16);
|
|
|
|
return m_color[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Get block color.
|
|
|
|
inline Color32 & ColorBlock::color(uint i)
|
|
|
|
{
|
|
|
|
nvDebugCheck(i < 16);
|
|
|
|
return m_color[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Get block color.
|
|
|
|
inline Color32 ColorBlock::color(uint x, uint y) const
|
|
|
|
{
|
|
|
|
nvDebugCheck(x < 4 && y < 4);
|
|
|
|
return m_color[y * 4 + x];
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Get block color.
|
|
|
|
inline Color32 & ColorBlock::color(uint x, uint y)
|
|
|
|
{
|
|
|
|
nvDebugCheck(x < 4 && y < 4);
|
|
|
|
return m_color[y * 4 + x];
|
|
|
|
}
|
|
|
|
|
|
|
|
} // nv namespace
|
|
|
|
|
|
|
|
#endif // NV_IMAGE_COLORBLOCK_H
|