chiark / gitweb /
Initial checking of support functions for JPEG
[clg] / cairo / alien / cairo-lut-private.h
CommitLineData
e59e8502 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
55extern const uint8_t color_lut[256][256];
56extern const uint8_t reverse_color_lut[256][256];
57
58static inline uint8_t _get_alpha (uint32_t pixel)
59{
60 return (pixel >> 24) & 0xFF;
61}
62
63static inline uint8_t _get_red (uint32_t pixel)
64{
65 return (pixel >> 16) & 0xFF;
66}
67
68static inline uint8_t _get_green (uint32_t pixel)
69{
70 return (pixel >> 8) & 0xFF;
71}
72
73static inline uint8_t _get_blue (uint32_t pixel)
74{
75 return pixel & 0xFF;
76}
77
78static inline uint32_t
79rgb_to_pixel (uint8_t r, uint8_t g, uint8_t b)
80{
81 return ((r << 16) + (g << 8) + b);
82}
83
84static inline uint32_t
85argb_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
90static inline void
91pixel_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 */
106static inline void
107alpha_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 */
132static inline void
133cairo_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 */
145static inline uint32_t
146cairo_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 */
170static inline uint32_t
171cairo_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 */
189static inline uint32_t
190argb_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 */
210static inline uint32_t
211pixel_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 */