~ubuntu-branches/ubuntu/maverick/grafx2/maverick

« back to all changes in this revision

Viewing changes to op_c.h

  • Committer: Bazaar Package Importer
  • Author(s): Gürkan Sengün
  • Date: 2009-09-21 14:24:19 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20090921142419-lhpqq102buior0ol
Tags: 2.1-1
New upstream version.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*  Grafx2 - The Ultimate 256-color bitmap paint program
2
 
 
3
 
    Copyright 2007 Adrien Destugues
4
 
    Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
5
 
 
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
9
 
    of the License.
10
 
 
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.
15
 
 
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/>
18
 
*/
19
 
 
20
 
//////////////////////////////////////////////////////////////////////////////
21
 
///@file op_c.h
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
 
//////////////////////////////////////////////////////////////////////////////
26
 
 
27
 
#ifndef _OP_C_H_
28
 
#define _OP_C_H_
29
 
 
30
 
#include "struct.h"
31
 
 
32
 
//////////////////////////////////////////////// D�finition des types de base
33
 
 
34
 
typedef T_Components * T_Bitmap24B;
35
 
typedef byte * T_Bitmap256;
36
 
 
37
 
 
38
 
 
39
 
//////////////////////////////////////// D�finition d'une table de conversion
40
 
 
41
 
typedef struct
42
 
{
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
46
 
 
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)
50
 
 
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)
54
 
 
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)
58
 
 
59
 
  byte * table;
60
 
} T_Conversion_table;
61
 
 
62
 
 
63
 
 
64
 
///////////////////////////////////////// D�finition d'une table d'occurences
65
 
 
66
 
typedef struct
67
 
{
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
71
 
 
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)
75
 
 
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)
79
 
 
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)
83
 
 
84
 
  int * table;
85
 
} T_Occurrence_table;
86
 
 
87
 
 
88
 
 
89
 
///////////////////////////////////////// D�finition d'un ensemble de couleur
90
 
 
91
 
typedef struct
92
 
{
93
 
  int occurences; // Nb total d'occurences des couleurs de l'ensemble
94
 
 
95
 
  // Grande couverture
96
 
  byte Rmin,Rmax;
97
 
  byte Gmin,Vmax;
98
 
  byte Bmin,Bmax;
99
 
 
100
 
  // Couverture minimale
101
 
  byte rmin,rmax;
102
 
  byte vmin,vmax;
103
 
  byte bmin,bmax;
104
 
 
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�
109
 
} T_Cluster;
110
 
 
111
 
 
112
 
 
113
 
//////////////////////////////////////// D�finition d'un ensemble de clusters
114
 
 
115
 
typedef struct
116
 
{
117
 
  int       nb;
118
 
  int       nb_max;
119
 
  T_Cluster * clusters;
120
 
} T_Cluster_set;
121
 
 
122
 
 
123
 
 
124
 
///////////////////////////////////////////////////// D�finition d'un d�grad�
125
 
 
126
 
typedef struct
127
 
{
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�
132
 
} T_Gradient;
133
 
 
134
 
 
135
 
 
136
 
///////////////////////////////////////// D�finition d'un ensemble de d�grad�
137
 
 
138
 
typedef struct
139
 
{
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
143
 
} T_Gradient_set;
144
 
 
145
 
 
146
 
 
147
 
/////////////////////////////////////////////////////////////////////////////
148
 
///////////////////////////// M�thodes de gestion des tables de conversion //
149
 
/////////////////////////////////////////////////////////////////////////////
150
 
 
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);
155
 
 
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);
158
 
 
159
 
 
160
 
/////////////////////////////////////////////////////////////////////////////
161
 
/////////////////////////////// M�thodes de gestion des tables d'occurence //
162
 
/////////////////////////////////////////////////////////////////////////////
163
 
 
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);
170
 
 
171
 
 
172
 
 
173
 
/////////////////////////////////////////////////////////////////////////////
174
 
///////////////////////////////////////// M�thodes de gestion des clusters //
175
 
/////////////////////////////////////////////////////////////////////////////
176
 
 
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);
180
 
 
181
 
 
182
 
 
183
 
/////////////////////////////////////////////////////////////////////////////
184
 
//////////////////////////// M�thodes de gestion des ensembles de clusters //
185
 
/////////////////////////////////////////////////////////////////////////////
186
 
 
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);
195
 
 
196
 
/////////////////////////////////////////////////////////////////////////////
197
 
//////////////////////////// M�thodes de gestion des ensembles de d�grad�s //
198
 
/////////////////////////////////////////////////////////////////////////////
199
 
 
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);
204
 
 
205
 
 
206
 
 
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);
210
 
 
211
 
 
212
 
 
213
 
#endif
 
1
/*  Grafx2 - The Ultimate 256-color bitmap paint program
 
2
 
 
3
    Copyright 2007 Adrien Destugues
 
4
    Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
 
5
 
 
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
 
9
    of the License.
 
10
 
 
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.
 
15
 
 
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/>
 
18
*/
 
19
 
 
20
//////////////////////////////////////////////////////////////////////////////
 
21
///@file op_c.h
 
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
//////////////////////////////////////////////////////////////////////////////
 
26
 
 
27
#ifndef _OP_C_H_
 
28
#define _OP_C_H_
 
29
 
 
30
#include "struct.h"
 
31
 
 
32
//////////////////////////////////////////////// D�finition des types de base
 
33
 
 
34
typedef T_Components * T_Bitmap24B;
 
35
typedef byte * T_Bitmap256;
 
36
 
 
37
 
 
38
 
 
39
//////////////////////////////////////// D�finition d'une table de conversion
 
40
 
 
41
typedef struct
 
42
{
 
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
 
46
 
 
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)
 
50
 
 
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)
 
54
 
 
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)
 
58
 
 
59
  byte * table;
 
60
} T_Conversion_table;
 
61
 
 
62
 
 
63
 
 
64
///////////////////////////////////////// D�finition d'une table d'occurences
 
65
 
 
66
typedef struct
 
67
{
 
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
 
71
 
 
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)
 
75
 
 
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)
 
79
 
 
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)
 
83
 
 
84
  int * table;
 
85
} T_Occurrence_table;
 
86
 
 
87
 
 
88
 
 
89
///////////////////////////////////////// D�finition d'un ensemble de couleur
 
90
 
 
91
typedef struct S_Cluster
 
92
{
 
93
  int occurences; // Nb total d'occurences des couleurs de l'ensemble
 
94
 
 
95
  // Grande couverture
 
96
  byte Rmin,Rmax;
 
97
  byte Gmin,Vmax;
 
98
  byte Bmin,Bmax;
 
99
 
 
100
  // Couverture minimale
 
101
  byte rmin,rmax;
 
102
  byte vmin,vmax;
 
103
  byte bmin,bmax;
 
104
 
 
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�
 
109
 
 
110
  struct S_Cluster* next;
 
111
} T_Cluster;
 
112
 
 
113
 
 
114
 
 
115
//////////////////////////////////////// D�finition d'un ensemble de clusters
 
116
 
 
117
typedef struct
 
118
{
 
119
  int       nb;
 
120
  int       nb_max;
 
121
  T_Cluster * clusters;
 
122
} T_Cluster_set;
 
123
 
 
124
 
 
125
 
 
126
///////////////////////////////////////////////////// D�finition d'un d�grad�
 
127
 
 
128
typedef struct
 
129
{
 
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�
 
134
} T_Gradient;
 
135
 
 
136
 
 
137
 
 
138
///////////////////////////////////////// D�finition d'un ensemble de d�grad�
 
139
 
 
140
typedef struct
 
141
{
 
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
 
145
} T_Gradient_set;
 
146
 
 
147
 
 
148
 
 
149
/////////////////////////////////////////////////////////////////////////////
 
150
///////////////////////////// M�thodes de gestion des tables de conversion //
 
151
/////////////////////////////////////////////////////////////////////////////
 
152
 
 
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);
 
157
 
 
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);
 
160
 
 
161
 
 
162
/////////////////////////////////////////////////////////////////////////////
 
163
/////////////////////////////// M�thodes de gestion des tables d'occurence //
 
164
/////////////////////////////////////////////////////////////////////////////
 
165
 
 
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);
 
172
 
 
173
 
 
174
 
 
175
/////////////////////////////////////////////////////////////////////////////
 
176
///////////////////////////////////////// M�thodes de gestion des clusters //
 
177
/////////////////////////////////////////////////////////////////////////////
 
178
 
 
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);
 
182
 
 
183
 
 
184
 
 
185
/////////////////////////////////////////////////////////////////////////////
 
186
//////////////////////////// M�thodes de gestion des ensembles de clusters //
 
187
/////////////////////////////////////////////////////////////////////////////
 
188
 
 
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);
 
197
 
 
198
/////////////////////////////////////////////////////////////////////////////
 
199
//////////////////////////// M�thodes de gestion des ensembles de d�grad�s //
 
200
/////////////////////////////////////////////////////////////////////////////
 
201
 
 
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);
 
206
 
 
207
 
 
208
 
 
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);
 
212
 
 
213
 
 
214
 
 
215
#endif