/
palette.cpp
71 lines (57 loc) · 1.43 KB
/
palette.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "palette.h"
Palette::Palette( std::string Filename )
{
unsigned char colourblock[3];
std::string path = "data/";
path.append( Filename );
ALLEGRO_FILE* f = al_fopen( path.c_str(), "rb" );
colours = (Colour*)malloc( (al_fsize( f ) / 3) * sizeof( Colour ) );
int idx = 0;
while( !al_feof( f ) )
{
al_fread( f, (void*)&colourblock, 3 );
colours[idx].a = (idx == 0 ? 0 : 255);
colours[idx].r = colourblock[2] << 2;
colours[idx].g = colourblock[1] << 2;
colours[idx].b = colourblock[0] << 2;
idx++;
}
al_fclose( f );
}
Palette::~Palette()
{
free( (void*)colours );
}
Colour* Palette::GetColour(int Index)
{
return &colours[Index];
}
void Palette::SetColour(int Index, Colour* Col)
{
colours[Index].a = Col->a;
colours[Index].r = Col->r;
colours[Index].g = Col->g;
colours[Index].b = Col->b;
}
void Palette::DumpPalette( std::string Filename )
{
ALLEGRO_BITMAP* b = al_create_bitmap( 16, 16 );
ALLEGRO_LOCKED_REGION* r = al_lock_bitmap( b, ALLEGRO_PIXEL_FORMAT_ABGR_8888_LE, 0 );
int c = 0;
for( int y = 0; y < 16; y++ )
{
for( int x = 0; x < 16; x++ )
{
Colour* c1_rowptr = (Colour*)(&((char*)r->data)[ (y * r->pitch) + (x * 4) ]);
Colour* c1_palcol = GetColour( c );
c1_rowptr->a = c1_palcol->a;
c1_rowptr->r = c1_palcol->r;
c1_rowptr->g = c1_palcol->g;
c1_rowptr->b = c1_palcol->b;
c++;
}
}
al_unlock_bitmap( b );
al_save_bitmap( Filename.c_str(), b );
al_destroy_bitmap( b );
}