1 /*
2  *  Abuse - dark 2D side-scrolling platform game
3  *  Copyright (c) 1995 Crack dot Com
4  *  Copyright (c) 2005-2011 Sam Hocevar <sam@hocevar.net>
5  *
6  *  This software was released into the Public Domain. As with most public
7  *  domain software, no warranty is made or implied by Crack dot Com, by
8  *  Jonathan Clark, or by Sam Hocevar.
9  */
10 
11 #ifndef _PALETTE_H_
12 #define _PALETTE_H_
13 #include "linked.h"
14 #include "specs.h"
15 #define COLOR_BITS 6    // On PC-6, most others -8
16 #define COLOR_SHIFT (8-COLOR_BITS)
17 #define MAX_COLOR ((1<<COLOR_BITS)-1)
18 #define RED3(x)  (unsigned char) ((((int)x&(7<<5))>>5)*(int)255/(int)7)
19 #define GREEN3(x) (unsigned char) (((x&(7<<2))>>2)*(int)255/(int)7)
20 #define BLUE2(x) (unsigned char) ((x&3)*(int)255/(int)3)
21 
22 
23 struct color
24 {
25   unsigned char red,green,blue;
26 } ;
27 
28 class palette : public linked_node
29 {
30   color *pal;
31   unsigned char *usd;           // bit array
32   short ncolors;
33   int bg;
34 public :
35   palette(int number_colors=256);
36   palette(spec_entry *e, bFILE *fp);
37   palette(bFILE *fp);
38   void set(int x, unsigned char red, unsigned char green, unsigned char blue);
39   void get(int x, unsigned char &red, unsigned char &green, unsigned char &blue);
40   uint32_t getquad(int x);
red(int x)41   unsigned int red(int x) { return pal[x].red; }
green(int x)42   unsigned int green(int x) { return pal[x].green; }
blue(int x)43   unsigned int blue(int x) { return pal[x].blue; }
addr()44   void *addr() { return (void *) pal; }
45   void shift(int amount);
46   void load();
47   void load_nice();
48   void fade_to(int total_fades, int fade_on, int dest_r, int dest_g, int dest_b);
49 
50   void defaults();
51   void set_rgbs();
52   void make_black_white();
53   void black_white();
54 
pal_size()55   int pal_size() { return ncolors; }
56   void set_used(int color_num);
57   void set_unused(int color_num);
58   int used(int color_num);
59   void set_all_used();
60   void set_all_unused();
set_background(unsigned char b)61   void set_background(unsigned char b)  { bg=b; }
background(unsigned char b)62   int background(unsigned char b)  { return bg; }
63   int add_color(unsigned int r, unsigned int g, unsigned int b,
64              int closest_only=0);
65   int find_color(unsigned char r, unsigned char g, unsigned char b);
66   int find_closest(unsigned char r, unsigned char g, unsigned char b);
67   int find_closest_non0(unsigned char r, unsigned char g, unsigned char b);
68   palette *copy();
69   unsigned char brightest(int all=0);
70   unsigned char darkest(int all=0, int noblack=1);
71   int write(bFILE *fp);
72   int size();
73   ~palette();
74 } ;
75 
76 class quant_node : public linked_node
77 {
78   quant_node *padre;
79 public :
80   unsigned tot;
81   quant_node *children[8];
is_leaf()82   int is_leaf() { return children[0]==this; }
be_childish()83   void be_childish() { children[0]=this; }
father()84   quant_node *father() { return padre; }
85   quant_node(int level, quant_node *dad,
86     unsigned char r=0, unsigned char g=0, unsigned char b=0);
87   void total(int &tnodes, int &tr, int &tg, int &tb);
88 //  void prune();
set(int r,int g,int b)89   void set(int r,int g,int b) { red=r; green=g; blue=b; }
90   unsigned char red,green,blue;
91   ~quant_node();
92 } ;
93 
94 
95 class quant_palette
96 {
97   linked_list level[8];
98   quant_node *root;
99   int nc,mx;
100   void prune();
101   void re_delete(quant_node *who, int lev);
102 public :
103   void add_color(unsigned char r, unsigned char g, unsigned char b);
104   quant_palette(int max_colors=256);
105   palette *create_pal();
106   ~quant_palette();
107 } ;
108 
109 palette *last_loaded();
110 #endif
111