daedalus/Source/HLEGraphics/N64PixelFormat.h

228 lines
5 KiB
C++

/*
Copyright (C) 2001 StrmnNrmn
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef HLEGRAPHICS_N64PIXELFORMAT_H_
#define HLEGRAPHICS_N64PIXELFORMAT_H_
template< typename PixelFormatA, typename PixelFormatB >
inline PixelFormatA ConvertPixelFormat( PixelFormatB colour )
{
return PixelFormatA( colour.GetR(), colour.GetG(), colour.GetB(), colour.GetA() );
}
struct N64Pf5551
{
u16 Bits;
static u16 Make( u8 r, u8 g, u8 b, u8 a )
{
return ((r >> (8-BitsR)) << ShiftR) |
((g >> (8-BitsG)) << ShiftG) |
((b >> (8-BitsB)) << ShiftB) |
((a >> (8-BitsA)) << ShiftA); // Or could do 'a ? MaskA : 0'
}
N64Pf5551()
{
}
// Would like to remove this
explicit N64Pf5551( u16 bits )
: Bits( bits )
{
}
N64Pf5551( u8 r, u8 g, u8 b, u8 a )
: Bits( Make( r,g,b,a ) )
{
}
u8 GetR() const { u8 r( u8( ( Bits & MaskR ) >> ShiftR ) ); return (r << (8 - BitsR)) | (r >> (BitsR - (8 - BitsR))); }
u8 GetG() const { u8 g( u8( ( Bits & MaskG ) >> ShiftG ) ); return (g << (8 - BitsG)) | (g >> (BitsG - (8 - BitsG))); }
u8 GetB() const { u8 b( u8( ( Bits & MaskB ) >> ShiftB ) ); return (b << (8 - BitsB)) | (b >> (BitsB - (8 - BitsB))); }
u8 GetA() const { return (Bits & MaskA) ? 255 : 0; }
static const u32 MaskR = 0xf800;
static const u32 MaskG = 0x07c0;
static const u32 MaskB = 0x003e;
static const u32 MaskA = 0x0001;
static const u32 ShiftR = 11;
static const u32 ShiftG = 6;
static const u32 ShiftB = 1;
static const u32 ShiftA = 0;
static const u32 BitsR = 5;
static const u32 BitsG = 5;
static const u32 BitsB = 5;
static const u32 BitsA = 1;
};
DAEDALUS_STATIC_ASSERT( sizeof( N64Pf5551 ) == 2 );
struct N64Pf8888
{
union
{
struct
{
u8 A;
u8 B;
u8 G;
u8 R;
};
u32 Bits;
};
static u32 Make( u8 r, u8 g, u8 b, u8 a )
{
return (r << ShiftR) |
(g << ShiftG) |
(b << ShiftB) |
(a << ShiftA);
}
template< typename T >
static N64Pf8888 Make( T c )
{
return N64Pf8888( c.GetR(), c.GetG(), c.GetB(), c.GetA() );
}
N64Pf8888()
{
}
explicit N64Pf8888( u32 bits )
: Bits( bits )
{
}
N64Pf8888( u8 r, u8 g, u8 b, u8 a )
: Bits( Make( r,g,b,a ) )
{
}
u8 GetR() const { return R; }
u8 GetG() const { return G; }
u8 GetB() const { return B; }
u8 GetA() const { return A; }
static const u32 MaskR = 0xff000000;
static const u32 MaskG = 0x00ff0000;
static const u32 MaskB = 0x0000ff00;
static const u32 MaskA = 0x000000ff;
static const u32 ShiftR = 24;
static const u32 ShiftG = 16;
static const u32 ShiftB = 8;
static const u32 ShiftA = 0;
static const u32 BitsR = 8;
static const u32 BitsG = 8;
static const u32 BitsB = 8;
static const u32 BitsA = 8;
};
DAEDALUS_STATIC_ASSERT( sizeof( N64Pf8888 ) == 4 );
struct N64PfIA8
{
u8 Bits;
N64PfIA8()
{
}
u8 GetR() const { return GetI(); }
u8 GetG() const { return GetI(); }
u8 GetB() const { return GetI(); }
u8 GetI() const { u8 i( ( Bits & MaskI ) >> ShiftI ); return (i << (8 - BitsI)) | (i >> (BitsI - (8 - BitsI))); }
u8 GetA() const { u8 a( ( Bits & MaskA ) >> ShiftA ); return (a << (8 - BitsA)) | (a >> (BitsA - (8 - BitsA))); }
static const u32 MaskI = 0xf0;
static const u32 MaskA = 0x0f;
static const u32 ShiftI = 4;
static const u32 ShiftA = 0;
static const u32 BitsI = 4;
static const u32 BitsA = 4;
};
DAEDALUS_STATIC_ASSERT( sizeof( N64PfIA8 ) == 1 );
struct N64PfIA16
{
union
{
struct
{
u8 A;
u8 I;
};
u16 Bits;
};
N64PfIA16()
{
}
u8 GetR() const { return I; }
u8 GetG() const { return I; }
u8 GetB() const { return I; }
u8 GetA() const { return A; }
static const u32 MaskI = 0xff00;
static const u32 MaskA = 0x00ff;
static const u32 ShiftI = 8;
static const u32 ShiftA = 0;
static const u32 BitsI = 8;
static const u32 BitsA = 8;
};
DAEDALUS_STATIC_ASSERT( sizeof( N64PfIA16 ) == 2 );
struct N64PfI8
{
union
{
struct
{
u8 I;
};
u8 Bits;
};
N64PfI8()
{
}
u8 GetR() const { return I; }
u8 GetG() const { return I; }
u8 GetB() const { return I; }
u8 GetA() const { return I; } // Always I and not 255?
static const u32 MaskI = 0xff;
static const u32 ShiftI = 0;
static const u32 BitsI = 0;
};
DAEDALUS_STATIC_ASSERT( sizeof( N64PfI8 ) == 1 );
#endif // HLEGRAPHICS_N64PIXELFORMAT_H_