📄 skl_cmap.h
字号:
/******************************************************** * Some code. Copyright (C) 2003 by Pascal Massimino. * * All Rights Reserved. (http://skal.planet-d.net) * * For Educational/Academic use ONLY. See 'LICENSE.TXT'.* ********************************************************//* * skl_cmap.h * * cmap utilities ********************************************************/#ifndef _SKL_CMAP_H_#define _SKL_CMAP_H_#include "skl_2d/skl_color.h"//////////////////////////////////////////////////////////// Pixel format//////////////////////////////////////////////////////////class SKL_FORMAT { private: SKL_UINT32 _Bits; enum { BGR_ORDER = 0x8000000 }; public: enum { DFLT = 0x10000, COLORMAPPED=0x10000, ALPHA_FMT=0x18000 }; SKL_FORMAT(SKL_UINT32 f=0) : _Bits(f) {} SKL_FORMAT( SKL_ARGB R_msk, SKL_ARGB G_msk, SKL_ARGB B_msk, SKL_ARGB A_msk, int Depth=0 ); operator SKL_UINT32() const { return _Bits; } SKL_UINT32 Bits(int i) const { SKL_ASSERT(i>=0 && i<4); return (_Bits>>(4*i))&0xf; } SKL_UINT32 Bits() const { return (_Bits&0xffff); } int Raw_Depth() const { return (_Bits>>16)&0xf; } int Compute_Depth() const; int Depth() const; void Set_Depth(int d) { _Bits = Bits() | ((d&0xf)<<16); } int Is_BGR() const { return (_Bits & BGR_ORDER); } int Is_Compatible_With(SKL_FORMAT Fmt) const { return ( (_Bits&0xf0fff)==(Fmt._Bits&0xf0fff) ); } static SKL_FORMAT Colormapped() { return COLORMAPPED; } static SKL_FORMAT Alpha() { return ALPHA_FMT; } void Print_Infos() const; // debug};//////////////////////////////////////////////////////////// SKL_FORMAT_SHIFT//////////////////////////////////////////////////////////class SKL_FORMAT_SHIFT { private: enum { FIXED = 32 }; SKL_INT32 _Shift[4]; // a=3, r=2, g=1, b=0 SKL_ARGB _Mask[4]; void Store_Mask_And_Shift(const SKL_FORMAT f); public: SKL_FORMAT_SHIFT(SKL_FORMAT f) { Store_Mask_And_Shift(f); } int Shift(int i) const { return _Shift[i]; } SKL_ARGB Mask(int i) const { return _Mask[i]; } inline SKL_ARGB Unpack(SKL_UINT32 c) const { // unpack to SKL_COLOR return (((c&_Mask[0])<<_Shift[0])>>24) | (((c&_Mask[1])<<_Shift[1])>>16) | (((c&_Mask[2])<<_Shift[2])>> 8); } inline SKL_UINT32 Pack(SKL_ARGB c) const { return (((c<<24)>>_Shift[0])&_Mask[0]) | (((c<<16)>>_Shift[1])&_Mask[1]) | (((c<< 8)>>_Shift[2])&_Mask[2]); } inline SKL_ARGB UnpackA(SKL_UINT32 c) const { // unpack with Alpha return (((c&_Mask[0])<<_Shift[0])>>24) | (((c&_Mask[1])<<_Shift[1])>>16) | (((c&_Mask[2])<<_Shift[2])>> 8) | (((c&_Mask[3])<<_Shift[3])>> 0); } inline SKL_UINT32 PackA(SKL_ARGB c) const { return (((c<<24)>>_Shift[0])&_Mask[0]) | (((c<<16)>>_Shift[1])&_Mask[1]) | (((c<< 8)>>_Shift[2])&_Mask[2]) | (((c<< 0)>>_Shift[3])&_Mask[3]); } SKL_ARGB All_Mask() const { return _Mask[0] | _Mask[1] | _Mask[2] | _Mask[3]; } void Print_Infos() const; // debug void Print_Col(SKL_UINT32 c) const;};//////////////////////////////////////////////////////////// SKL_CMAP_X// class for exchanging color maps.// colors are in 0x48888 format//////////////////////////////////////////////////////////class SKL_CMAP;class SKL_CMAP_X{ protected: int _Nb; SKL_COLOR _Map[256]; public: SKL_CMAP_X(int Nb=256) : _Nb(Nb) { SKL_ASSERT(Nb>=0 && Nb<=256); SKL_BZERO(_Map, _Nb*sizeof(_Map[0])); } SKL_CMAP_X(const SKL_CMAP &); SKL_CMAP_X(const SKL_CMAP_X &In); int Get_Nb_Colors() const { return _Nb; } void Set_Nb_Colors(int Nb) { _Nb = Nb; } const SKL_COLOR *Get_Colors() const { return _Map; } const SKL_COLOR &operator[](int i) const { SKL_ASSERT(i>=0 && i<_Nb); return _Map[i]; } SKL_COLOR &operator[](int i) { SKL_ASSERT(i>=0 && i<_Nb); return _Map[i]; } // in skl_cmap_mix.cpp void Ramp(SKL_COLOR c1, SKL_COLOR c2, int Start=0, int End=256); void RGB_Cube( SKL_FORMAT Fmt );};//////////////////////////////////////////////////////////// SKL_CMAP// -- formatted CMAPs//////////////////////////////////////////////////////////class SKL_CMAP{ private: int _Nb; SKL_UINT32 _Map[256]; // <- not necessarly ARGB_8888... SKL_FORMAT _Format; public: SKL_CMAP(const SKL_FORMAT fmt, int Nb=256); SKL_CMAP(const SKL_CMAP_X &In, SKL_FORMAT fmt ); SKL_CMAP(const SKL_CMAP &In, SKL_FORMAT fmt=0 ); int Get_Nb_Colors() const { return _Nb; } const SKL_UINT32 *Get_Colors() const { return _Map; } SKL_UINT32 &operator[] (int i) { SKL_ASSERT(i>=0 && i<_Nb); return _Map[i]; } SKL_UINT32 operator[] (int i) const { SKL_ASSERT(i>=0 && i<_Nb); return _Map[i]; } SKL_FORMAT Get_Format() const { return _Format; } void Set_Format(SKL_FORMAT fmt) { _Format = fmt; } void Ramp(SKL_COLOR c1, SKL_COLOR c2, int Start=0, int End=256);};//////////////////////////////////////////////////////////#endif /* _SKL_CMAP_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -