~noskcaj/ubuntu/vivid/gthumb/flickr-https

« back to all changes in this revision

Viewing changes to gthumb/color-utils.c

  • Committer: Package Import Robot
  • Author(s): Jackson Doak
  • Date: 2014-04-08 06:31:09 UTC
  • mfrom: (1.3.20)
  • Revision ID: package-import@ubuntu.com-20140408063109-tk845map8ji6uxvd
Tags: 3:3.3.1.is.3.2.7-0ubuntu1
* Revert to newest upstream stable release. LP: #1290691
  - Refresh patches

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
 
 
3
 
/*
4
 
 *  GThumb
5
 
 *
6
 
 *  Copyright (C) 2012 The Free Software Foundation, Inc.
7
 
 *
8
 
 *  This program is free software; you can redistribute it and/or modify
9
 
 *  it under the terms of the GNU General Public License as published by
10
 
 *  the Free Software Foundation; either version 2 of the License, or
11
 
 *  (at your option) any later version.
12
 
 *
13
 
 *  This program is distributed in the hope that it will be useful,
14
 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 
 *  GNU General Public License for more details.
17
 
 *
18
 
 *  You should have received a copy of the GNU General Public License
19
 
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
 
 */
21
 
 
22
 
#include <config.h>
23
 
#include "color-utils.h"
24
 
#include "glib-utils.h"
25
 
 
26
 
 
27
 
/* RGB <-> HSV */
28
 
 
29
 
 
30
 
void
31
 
gimp_rgb_to_hsv (guchar  red,
32
 
                 guchar  green,
33
 
                 guchar  blue,
34
 
                 guchar *hue,
35
 
                 guchar *sat,
36
 
                 guchar *val)
37
 
{
38
 
        guchar min, max;
39
 
 
40
 
        min = MIN3 (red, green, blue);
41
 
        max = MAX3 (red, green, blue);
42
 
 
43
 
        *val = max;
44
 
        if (*val == 0) {
45
 
                *hue = *sat = 0;
46
 
                return;
47
 
        }
48
 
 
49
 
        *sat = 255 * (long)(max - min) / *val;
50
 
        if (*sat == 0) {
51
 
                *hue = 0;
52
 
                return;
53
 
        }
54
 
 
55
 
        if (max == min)
56
 
                *hue = 0;
57
 
        else if (max == red)
58
 
                *hue = 0 + 43 * (green - blue) / (max - min);
59
 
        else if (max == green)
60
 
                *hue = 85 + 43 * (blue - red) / (max - min);
61
 
        else if (max == blue)
62
 
                *hue = 171 + 43 * (red - green) / (max - min);
63
 
}
64
 
 
65
 
 
66
 
void
67
 
gimp_hsv_to_rgb (guchar  hue,
68
 
                 guchar  sat,
69
 
                 guchar  val,
70
 
                 guchar *red,
71
 
                 guchar *green,
72
 
                 guchar *blue)
73
 
{
74
 
        guchar region, remainder, p, q, t;
75
 
 
76
 
        if (sat == 0) {
77
 
                *red = *green = *blue = val;
78
 
                return;
79
 
        }
80
 
 
81
 
        region = hue / 43;
82
 
        remainder = (hue - (region * 43)) * 6;
83
 
 
84
 
        p = (val * (255 - sat)) >> 8;
85
 
        q = (val * (255 - ((sat * remainder) >> 8))) >> 8;
86
 
        t = (val * (255 - ((sat * (255 - remainder)) >> 8))) >> 8;
87
 
 
88
 
        switch (region) {
89
 
        case 0:
90
 
                *red = val;
91
 
                *green = t;
92
 
                *blue = p;
93
 
                break;
94
 
        case 1:
95
 
                *red = q;
96
 
                *green = val;
97
 
                *blue = p;
98
 
                break;
99
 
        case 2:
100
 
                *red = p;
101
 
                *green = val;
102
 
                *blue = t;
103
 
                break;
104
 
        case 3:
105
 
                *red = p;
106
 
                *green = q;
107
 
                *blue = val;
108
 
                break;
109
 
        case 4:
110
 
                *red = t;
111
 
                *green = p;
112
 
                *blue = val;
113
 
                break;
114
 
        default:
115
 
                *red = val;
116
 
                *green = p;
117
 
                *blue = q;
118
 
                break;
119
 
        }
120
 
}
121
 
 
122
 
 
123
 
/* RGB <-> HSL */
124
 
 
125
 
 
126
 
void
127
 
gimp_rgb_to_hsl (guchar  red,
128
 
                 guchar  green,
129
 
                 guchar  blue,
130
 
                 guchar *hue,
131
 
                 guchar *sat,
132
 
                 guchar *lum)
133
 
{
134
 
        guchar min, max;
135
 
 
136
 
        min = MIN3 (red, green, blue);
137
 
        max = MAX3 (red, green, blue);
138
 
 
139
 
        *lum = (max + min) / 2;
140
 
 
141
 
        if (max == min) {
142
 
                *hue = *sat = 0;
143
 
                return;
144
 
        }
145
 
 
146
 
        if (*lum < 128)
147
 
                *sat = 255 * (long) (max - min) / (max + min);
148
 
        else
149
 
                *sat = 255 * (long) (max - min) / (512 - max - min);
150
 
 
151
 
        if (max == min)
152
 
                *hue = 0;
153
 
        else if (max == red)
154
 
                *hue = 0 + 43 * (green - blue) / (max - min);
155
 
        else if (max == green)
156
 
                *hue = 85 + 43 * (blue - red) / (max - min);
157
 
        else if (max == blue)
158
 
                *hue = 171 + 43 * (red - green) / (max - min);
159
 
}
160
 
 
161
 
 
162
 
inline gint
163
 
gimp_hsl_value (gdouble n1,
164
 
                gdouble n2,
165
 
                gdouble hue)
166
 
{
167
 
        gdouble value;
168
 
 
169
 
        if (hue > 255)
170
 
                hue -= 255;
171
 
        else if (hue < 0)
172
 
                hue += 255;
173
 
 
174
 
        if (hue < 42.5)
175
 
                value = n1 + (n2 - n1) * (hue / 42.5);
176
 
        else if (hue < 127.5)
177
 
                value = n2;
178
 
        else if (hue < 170)
179
 
                value = n1 + (n2 - n1) * ((170 - hue) / 42.5);
180
 
        else
181
 
                value = n1;
182
 
 
183
 
        return value * 255.0;
184
 
}
185
 
 
186
 
 
187
 
void
188
 
gimp_hsl_to_rgb (guchar  hue,
189
 
                 guchar  sat,
190
 
                 guchar  lum,
191
 
                 guchar *red,
192
 
                 guchar *green,
193
 
                 guchar *blue)
194
 
{
195
 
        if (sat == 0) {
196
 
                *red = lum;
197
 
                *green = lum;
198
 
                *blue = lum;
199
 
        }
200
 
        else {
201
 
                gdouble h, s, l, m1, m2;
202
 
 
203
 
                h = hue;
204
 
                s = sat;
205
 
                l = lum;
206
 
 
207
 
                if (l < 128)
208
 
                        m2 = (l * (255 + s)) / 65025.0;
209
 
                else
210
 
                        m2 = (l + s - (l * s) / 255.0) / 255.0;
211
 
 
212
 
                m1 = (l / 127.5) - m2;
213
 
 
214
 
                *red = gimp_hsl_value (m1, m2, h + 85);
215
 
                *green = gimp_hsl_value (m1, m2, h);
216
 
                *blue  = gimp_hsl_value (m1, m2, h - 85);
217
 
        }
218
 
}