chiark / gitweb /
Initial checking of support functions for JPEG
[clg] / cairo / alien / cairo-lut-private.h
1 /* Copyright 2006 Google Inc. All Rights Reserved.
2  * amcrae@google.com (Andrew McRae)
3  * Converted from cairo-lut.c
4  * Author: yangzh@google.com (Zhonghao Yang)
5  *
6  * Inlines and defines for pre-multiplied alpha color conversion.
7  * The naming convention is:
8  *   rgb - separate values for red, green, blue
9  *   argb - separate values for alpha, red, green, blue
10  *   pixel - 32 bit combined value, no premultiplication
11  *   rgbpixel - 24 bit RGB, no alpha.
12  *   cairo - pixel that has alpha premultiplication
13  */
14
15 /* cairo - a vector graphics library with display and print output
16  *
17  * Copyright © 2003 University of Southern California
18  *
19  * This library is free software; you can redistribute it and/or
20  * modify it either under the terms of the GNU Lesser General Public
21  * License version 2.1 as published by the Free Software Foundation
22  * (the "LGPL") or, at your option, under the terms of the Mozilla
23  * Public License Version 1.1 (the "MPL"). If you do not alter this
24  * notice, a recipient may use your version of this file under either
25  * the MPL or the LGPL.
26  *
27  * You should have received a copy of the LGPL along with this library
28  * in the file COPYING-LGPL-2.1; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30  * You should have received a copy of the MPL along with this library
31  * in the file COPYING-MPL-1.1
32  *
33  * The contents of this file are subject to the Mozilla Public License
34  * Version 1.1 (the "License"); you may not use this file except in
35  * compliance with the License. You may obtain a copy of the License at
36  * http://www.mozilla.org/MPL/
37  *
38  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
39  * OF ANY KIND, either express or implied. See the LGPL or the MPL for
40  * the specific language governing rights and limitations.
41  *
42  * The Original Code is the cairo graphics library.
43  *
44  * The Initial Developer of the Original Code is University of Southern
45  * California.
46  *
47  * Contributor(s):
48  *      Carl D. Worth <cworth@cworth.org>
49  *      Kristian Høgsberg <krh@redhat.com>
50  */
51
52 #ifndef CAIRO_LUT_PRIVATE_H
53 #define CAIRO_LUT_PRIVATE_H
54
55 extern const uint8_t color_lut[256][256];
56 extern const uint8_t reverse_color_lut[256][256];
57
58 static inline uint8_t _get_alpha (uint32_t pixel)
59 {
60   return (pixel >> 24) & 0xFF;
61 }
62
63 static inline uint8_t _get_red (uint32_t pixel)
64 {
65   return (pixel >> 16) & 0xFF;
66 }
67
68 static inline uint8_t _get_green (uint32_t pixel)
69 {
70   return (pixel >> 8) & 0xFF;
71 }
72
73 static inline uint8_t _get_blue (uint32_t pixel)
74 {
75   return pixel & 0xFF;
76 }
77
78 static inline uint32_t
79 rgb_to_pixel (uint8_t r, uint8_t g, uint8_t b)
80 {
81   return ((r << 16) + (g << 8) + b);
82 }
83
84 static inline uint32_t
85 argb_to_pixel (uint8_t alpha, uint8_t r, uint8_t g, uint8_t b)
86 {
87   return ((alpha << 24) + rgb_to_pixel(r, g, b));
88 }
89
90 static inline void
91 pixel_to_rgb (uint32_t pixel, uint8_t *r, uint8_t *g, uint8_t *b)
92 {
93   *r = _get_red(pixel);
94   *g = _get_green(pixel);
95   *b = _get_blue(pixel);
96 }
97
98 /*
99  * alpha_cairo_to_rgb:
100  * @al: The alpha value to apply to the pixel
101  * @pixel: the regular RGB pixel value
102  *
103  * return regular R/G/B channel. (non-pre-multiplied)
104  *
105  */
106 static inline void
107 alpha_cairo_to_rgb (uint8_t al, uint32_t pixel,
108                     uint8_t *r, uint8_t *g, uint8_t *b)
109 {
110   if (al != 0xFF) {
111     if (al == 0) {
112       *r = 0;
113       *g = 0;
114       *b = 0;
115     } else {
116       *r = color_lut[al][_get_red(pixel)];
117       *g = color_lut[al][_get_green(pixel)];
118       *b = color_lut[al][_get_blue(pixel)];
119     }
120   } else {
121     pixel_to_rgb(pixel, r, g, b);
122   }
123 }
124
125 /*
126  * cairo_to_rgb:
127  * @pixel: the regular ARGB pixel value
128  *
129  * return regular R/G/B channel. (non-pre-multiplied)
130  *
131  */
132 static inline void
133 cairo_to_rgb (uint32_t pixel, uint8_t *r, uint8_t *g, uint8_t *b)
134 {
135   alpha_cairo_to_rgb(_get_alpha(pixel), pixel, r, g, b);
136 }
137
138 /*
139  * cairo_to_pixel:
140  * @pixel: the premultiplied ARGB pixel value
141  *
142  * return regular Alpha/R/G/B channel. (non-pre-multiplied)
143  *
144  */
145 static inline uint32_t
146 cairo_to_pixel (uint32_t pixel)
147 {
148   uint8_t alpha, r, g, b;
149   alpha = _get_alpha (pixel);
150   
151   if (alpha != 0xFF) {
152     if (alpha == 0) {
153       return(0);
154     }
155     r = color_lut[alpha][_get_red(pixel)];
156     g = color_lut[alpha][_get_green(pixel)];
157     b = color_lut[alpha][_get_blue(pixel)];
158     pixel = argb_to_pixel(alpha, r, g, b);
159   }
160   return(pixel);
161 }
162
163 /*
164  * cairo_to_rgbpixel:
165  * @pixel: the premultiplied ARGB pixel value
166  *
167  * return R/G/B channel.
168  *
169  */
170 static inline uint32_t
171 cairo_to_rgbpixel (uint32_t pixel)
172 {
173     return(cairo_to_pixel(pixel) & 0xFFFFFF);
174 }
175
176 /*
177  * argb_to_cairo:
178  * @a: the alpha value
179  * @r: the red value
180  * @g: the green value
181  * @b: the blue value
182  *
183  * given a regular ARGB, return corresponding pre-multipled pixel value.
184  * this is the reverse function for cairo_to_rgb.
185  *
186  * Return value: internal pre-multiplied pixel value.
187  *
188  */
189 static inline uint32_t
190 argb_to_cairo (uint8_t a, uint8_t r, uint8_t g, uint8_t b)
191 {
192     if (a != 0xFF) {
193         r = reverse_color_lut[a][r];
194         g = reverse_color_lut[a][g];
195         b = reverse_color_lut[a][b];
196     }
197     return argb_to_pixel (a, r, g, b);
198 }
199
200 /*
201  * pixel_to_cairo:
202  * @pixel_r: the regular ARGB pixel value.
203  *
204  * given a regular ARGB, return corresponding pre-multipled pixel value.
205  * this is the reverse function for cairo_to_pixel.
206  *
207  * Return value: internal pre-multiplied pixel value.
208  *
209  */
210 static inline uint32_t
211 pixel_to_cairo (uint32_t pixel_r)
212 {
213   uint8_t alpha;
214
215   alpha = _get_alpha (pixel_r);
216   if (alpha == 0xFF)
217     return pixel_r;
218
219   return argb_to_cairo (_get_alpha(pixel_r), 
220                         _get_red(pixel_r),
221                         _get_green(pixel_r),
222                         _get_blue(pixel_r));
223 }
224
225 #endif /* CAIRO_LUT_PRIVATE_H */