1
/* Grafx2 - The Ultimate 256-color bitmap paint program
3
Copyright 2007 Adrien Destugues
4
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
6
Grafx2 is free software; you can redistribute it and/or
7
modify it under the terms of the GNU General Public License
8
as published by the Free Software Foundation; version 2
11
Grafx2 is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with Grafx2; if not, see <http://www.gnu.org/licenses/>
20
//////////////////////////////////////////////////////////////////////////////
22
/// Color reduction and color conversion (24b->8b, RGB<->HSL).
23
/// This is called op_c because half of the process was originally
24
/// coded in op_asm, in assembler.
25
//////////////////////////////////////////////////////////////////////////////
32
//////////////////////////////////////////////// D�finition des types de base
34
typedef T_Components * T_Bitmap24B;
35
typedef byte * T_Bitmap256;
39
//////////////////////////////////////// D�finition d'une table de conversion
43
int nbb_r; // Nb de bits de pr�cision sur les rouges
44
int nbb_g; // Nb de bits de pr�cision sur les verts
45
int nbb_b; // Nb de bits de pr�cision sur les bleu
47
int rng_r; // Nb de valeurs sur les rouges (= 1<<nbb_r)
48
int rng_g; // Nb de valeurs sur les verts (= 1<<nbb_g)
49
int rng_b; // Nb de valeurs sur les bleus (= 1<<nbb_b)
51
int dec_r; // Coefficient multiplicateur d'acc�s dans la table (= nbb_g+nbb_b)
52
int dec_g; // Coefficient multiplicateur d'acc�s dans la table (= nbb_b)
53
int dec_b; // Coefficient multiplicateur d'acc�s dans la table (= 0)
55
int red_r; // Coefficient r�ducteur de traduction d'une couleur rouge (= 8-nbb_r)
56
int red_g; // Coefficient r�ducteur de traduction d'une couleur verte (= 8-nbb_g)
57
int red_b; // Coefficient r�ducteur de traduction d'une couleur bleue (= 8-nbb_b)
64
///////////////////////////////////////// D�finition d'une table d'occurences
68
int nbb_r; // Nb de bits de pr�cision sur les rouges
69
int nbb_g; // Nb de bits de pr�cision sur les verts
70
int nbb_b; // Nb de bits de pr�cision sur les bleu
72
int rng_r; // Nb de valeurs sur les rouges (= 1<<nbb_r)
73
int rng_g; // Nb de valeurs sur les verts (= 1<<nbb_g)
74
int rng_b; // Nb de valeurs sur les bleus (= 1<<nbb_b)
76
int dec_r; // Coefficient multiplicateur d'acc�s dans la table (= nbb_g+nbb_b)
77
int dec_g; // Coefficient multiplicateur d'acc�s dans la table (= nbb_b)
78
int dec_b; // Coefficient multiplicateur d'acc�s dans la table (= 0)
80
int red_r; // Coefficient r�ducteur de traduction d'une couleur rouge (= 8-nbb_r)
81
int red_g; // Coefficient r�ducteur de traduction d'une couleur verte (= 8-nbb_g)
82
int red_b; // Coefficient r�ducteur de traduction d'une couleur bleue (= 8-nbb_b)
89
///////////////////////////////////////// D�finition d'un ensemble de couleur
93
int occurences; // Nb total d'occurences des couleurs de l'ensemble
100
// Couverture minimale
105
byte plus_large; // Composante ayant la plus grande variation (0=red,1=green,2=blue)
106
byte r,g,b; // color synth�tisant l'ensemble
107
byte h; // Chrominance
108
byte l; // Luminosit�
113
//////////////////////////////////////// D�finition d'un ensemble de clusters
119
T_Cluster * clusters;
124
///////////////////////////////////////////////////// D�finition d'un d�grad�
128
int nb_colors; // Nombre de couleurs dans le d�grad�
129
float min; // Chrominance minimale du d�grad�
130
float max; // Chrominance maximale du d�grad�
131
float hue; // Chrominance moyenne du d�grad�
136
///////////////////////////////////////// D�finition d'un ensemble de d�grad�
140
int nb; // Nombre de d�grad�s dans l'ensemble
141
int nb_max; // Nombre maximum de d�grad�s
142
T_Gradient * gradients; // Les d�grad�s
147
/////////////////////////////////////////////////////////////////////////////
148
///////////////////////////// M�thodes de gestion des tables de conversion //
149
/////////////////////////////////////////////////////////////////////////////
151
T_Conversion_table * CT_new(int nbb_r,int nbb_g,int nbb_b);
152
void CT_delete(T_Conversion_table * t);
153
byte CT_get(T_Conversion_table * t,int r,int g,int b);
154
void CT_set(T_Conversion_table * t,int r,int g,int b,byte i);
156
void RGB_to_HSL(int r, int g,int b, byte* h, byte*s, byte* l);
157
void HSL_to_RGB(byte h, byte s, byte l, byte* r, byte* g, byte* b);
160
/////////////////////////////////////////////////////////////////////////////
161
/////////////////////////////// M�thodes de gestion des tables d'occurence //
162
/////////////////////////////////////////////////////////////////////////////
164
void OT_init(T_Occurrence_table * t);
165
T_Occurrence_table * OT_new(int nbb_r,int nbb_g,int nbb_b);
166
void OT_delete(T_Occurrence_table * t);
167
int OT_get(T_Occurrence_table * t,int r,int g,int b);
168
void OT_inc(T_Occurrence_table * t,int r,int g,int b);
169
void OT_count_occurrences(T_Occurrence_table * t,T_Bitmap24B image,int size);
173
/////////////////////////////////////////////////////////////////////////////
174
///////////////////////////////////////// M�thodes de gestion des clusters //
175
/////////////////////////////////////////////////////////////////////////////
177
void Cluster_analyser(T_Cluster * c,T_Occurrence_table * to);
178
void Cluster_split(T_Cluster * c,T_Cluster * c1,T_Cluster * c2,int hue,T_Occurrence_table * to);
179
void Cluster_compute_hue(T_Cluster * c,T_Occurrence_table * to);
183
/////////////////////////////////////////////////////////////////////////////
184
//////////////////////////// M�thodes de gestion des ensembles de clusters //
185
/////////////////////////////////////////////////////////////////////////////
187
void CS_Init(T_Cluster_set * cs,T_Occurrence_table * to);
188
T_Cluster_set * CS_New(int nbmax,T_Occurrence_table * to);
189
void CS_Delete(T_Cluster_set * cs);
190
void CS_Get(T_Cluster_set * cs,T_Cluster * c);
191
void CS_Set(T_Cluster_set * cs,T_Cluster * c);
192
void CS_Generate(T_Cluster_set * cs,T_Occurrence_table * to);
193
void CS_Compute_colors(T_Cluster_set * cs,T_Occurrence_table * to);
194
void CS_Generate_color_table_and_palette(T_Cluster_set * cs,T_Conversion_table * tc,T_Components * palette);
196
/////////////////////////////////////////////////////////////////////////////
197
//////////////////////////// M�thodes de gestion des ensembles de d�grad�s //
198
/////////////////////////////////////////////////////////////////////////////
200
void GS_Init(T_Gradient_set * ds,T_Cluster_set * cs);
201
T_Gradient_set * GS_New(T_Cluster_set * cs);
202
void GS_Delete(T_Gradient_set * ds);
203
void GS_Generate(T_Gradient_set * ds,T_Cluster_set * cs);
207
// Convertie avec le plus de pr�cision possible une image 24b en 256c
208
// Renvoie s'il y a eu une erreur ou pas..
209
int Convert_24b_bitmap_to_256(T_Bitmap256 dest,T_Bitmap24B source,int width,int height,T_Components * palette);
1
/* Grafx2 - The Ultimate 256-color bitmap paint program
3
Copyright 2007 Adrien Destugues
4
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
6
Grafx2 is free software; you can redistribute it and/or
7
modify it under the terms of the GNU General Public License
8
as published by the Free Software Foundation; version 2
11
Grafx2 is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with Grafx2; if not, see <http://www.gnu.org/licenses/>
20
//////////////////////////////////////////////////////////////////////////////
22
/// Color reduction and color conversion (24b->8b, RGB<->HSL).
23
/// This is called op_c because half of the process was originally
24
/// coded in op_asm, in assembler.
25
//////////////////////////////////////////////////////////////////////////////
32
//////////////////////////////////////////////// D�finition des types de base
34
typedef T_Components * T_Bitmap24B;
35
typedef byte * T_Bitmap256;
39
//////////////////////////////////////// D�finition d'une table de conversion
43
int nbb_r; // Nb de bits de pr�cision sur les rouges
44
int nbb_g; // Nb de bits de pr�cision sur les verts
45
int nbb_b; // Nb de bits de pr�cision sur les bleu
47
int rng_r; // Nb de valeurs sur les rouges (= 1<<nbb_r)
48
int rng_g; // Nb de valeurs sur les verts (= 1<<nbb_g)
49
int rng_b; // Nb de valeurs sur les bleus (= 1<<nbb_b)
51
int dec_r; // Coefficient multiplicateur d'acc�s dans la table (= nbb_g+nbb_b)
52
int dec_g; // Coefficient multiplicateur d'acc�s dans la table (= nbb_b)
53
int dec_b; // Coefficient multiplicateur d'acc�s dans la table (= 0)
55
int red_r; // Coefficient r�ducteur de traduction d'une couleur rouge (= 8-nbb_r)
56
int red_g; // Coefficient r�ducteur de traduction d'une couleur verte (= 8-nbb_g)
57
int red_b; // Coefficient r�ducteur de traduction d'une couleur bleue (= 8-nbb_b)
64
///////////////////////////////////////// D�finition d'une table d'occurences
68
int nbb_r; // Nb de bits de pr�cision sur les rouges
69
int nbb_g; // Nb de bits de pr�cision sur les verts
70
int nbb_b; // Nb de bits de pr�cision sur les bleu
72
int rng_r; // Nb de valeurs sur les rouges (= 1<<nbb_r)
73
int rng_g; // Nb de valeurs sur les verts (= 1<<nbb_g)
74
int rng_b; // Nb de valeurs sur les bleus (= 1<<nbb_b)
76
int dec_r; // Coefficient multiplicateur d'acc�s dans la table (= nbb_g+nbb_b)
77
int dec_g; // Coefficient multiplicateur d'acc�s dans la table (= nbb_b)
78
int dec_b; // Coefficient multiplicateur d'acc�s dans la table (= 0)
80
int red_r; // Coefficient r�ducteur de traduction d'une couleur rouge (= 8-nbb_r)
81
int red_g; // Coefficient r�ducteur de traduction d'une couleur verte (= 8-nbb_g)
82
int red_b; // Coefficient r�ducteur de traduction d'une couleur bleue (= 8-nbb_b)
89
///////////////////////////////////////// D�finition d'un ensemble de couleur
91
typedef struct S_Cluster
93
int occurences; // Nb total d'occurences des couleurs de l'ensemble
100
// Couverture minimale
105
byte plus_large; // Composante ayant la plus grande variation (0=red,1=green,2=blue)
106
byte r,g,b; // color synth�tisant l'ensemble
107
byte h; // Chrominance
108
byte l; // Luminosit�
110
struct S_Cluster* next;
115
//////////////////////////////////////// D�finition d'un ensemble de clusters
121
T_Cluster * clusters;
126
///////////////////////////////////////////////////// D�finition d'un d�grad�
130
int nb_colors; // Nombre de couleurs dans le d�grad�
131
float min; // Chrominance minimale du d�grad�
132
float max; // Chrominance maximale du d�grad�
133
float hue; // Chrominance moyenne du d�grad�
138
///////////////////////////////////////// D�finition d'un ensemble de d�grad�
142
int nb; // Nombre de d�grad�s dans l'ensemble
143
int nb_max; // Nombre maximum de d�grad�s
144
T_Gradient * gradients; // Les d�grad�s
149
/////////////////////////////////////////////////////////////////////////////
150
///////////////////////////// M�thodes de gestion des tables de conversion //
151
/////////////////////////////////////////////////////////////////////////////
153
T_Conversion_table * CT_new(int nbb_r,int nbb_g,int nbb_b);
154
void CT_delete(T_Conversion_table * t);
155
byte CT_get(T_Conversion_table * t,int r,int g,int b);
156
void CT_set(T_Conversion_table * t,int r,int g,int b,byte i);
158
void RGB_to_HSL(int r, int g,int b, byte* h, byte*s, byte* l);
159
void HSL_to_RGB(byte h, byte s, byte l, byte* r, byte* g, byte* b);
162
/////////////////////////////////////////////////////////////////////////////
163
/////////////////////////////// M�thodes de gestion des tables d'occurence //
164
/////////////////////////////////////////////////////////////////////////////
166
void OT_init(T_Occurrence_table * t);
167
T_Occurrence_table * OT_new(int nbb_r,int nbb_g,int nbb_b);
168
void OT_delete(T_Occurrence_table * t);
169
int OT_get(T_Occurrence_table * t,int r,int g,int b);
170
void OT_inc(T_Occurrence_table * t,int r,int g,int b);
171
void OT_count_occurrences(T_Occurrence_table * t,T_Bitmap24B image,int size);
175
/////////////////////////////////////////////////////////////////////////////
176
///////////////////////////////////////// M�thodes de gestion des clusters //
177
/////////////////////////////////////////////////////////////////////////////
179
void Cluster_pack(T_Cluster * c,T_Occurrence_table * to);
180
void Cluster_split(T_Cluster * c,T_Cluster * c1,T_Cluster * c2,int hue,T_Occurrence_table * to);
181
void Cluster_compute_hue(T_Cluster * c,T_Occurrence_table * to);
185
/////////////////////////////////////////////////////////////////////////////
186
//////////////////////////// M�thodes de gestion des ensembles de clusters //
187
/////////////////////////////////////////////////////////////////////////////
189
void CS_Init(T_Cluster_set * cs,T_Occurrence_table * to);
190
T_Cluster_set * CS_New(int nbmax,T_Occurrence_table * to);
191
void CS_Delete(T_Cluster_set * cs);
192
void CS_Get(T_Cluster_set * cs,T_Cluster * c);
193
void CS_Set(T_Cluster_set * cs,T_Cluster * c);
194
void CS_Generate(T_Cluster_set * cs,T_Occurrence_table * to);
195
void CS_Compute_colors(T_Cluster_set * cs,T_Occurrence_table * to);
196
void CS_Generate_color_table_and_palette(T_Cluster_set * cs,T_Conversion_table * tc,T_Components * palette);
198
/////////////////////////////////////////////////////////////////////////////
199
//////////////////////////// M�thodes de gestion des ensembles de d�grad�s //
200
/////////////////////////////////////////////////////////////////////////////
202
void GS_Init(T_Gradient_set * ds,T_Cluster_set * cs);
203
T_Gradient_set * GS_New(T_Cluster_set * cs);
204
void GS_Delete(T_Gradient_set * ds);
205
void GS_Generate(T_Gradient_set * ds,T_Cluster_set * cs);
209
// Convertie avec le plus de pr�cision possible une image 24b en 256c
210
// Renvoie s'il y a eu une erreur ou pas..
211
int Convert_24b_bitmap_to_256(T_Bitmap256 dest,T_Bitmap24B source,int width,int height,T_Components * palette);