xref: /aosp_15_r20/external/libjpeg-turbo/cmyk.h (revision dfc6aa5c1cfd4bc4e2018dc74aa96e29ee49c6da)
1*dfc6aa5cSAndroid Build Coastguard Worker /*
2*dfc6aa5cSAndroid Build Coastguard Worker  * cmyk.h
3*dfc6aa5cSAndroid Build Coastguard Worker  *
4*dfc6aa5cSAndroid Build Coastguard Worker  * Copyright (C) 2017-2018, D. R. Commander.
5*dfc6aa5cSAndroid Build Coastguard Worker  * For conditions of distribution and use, see the accompanying README.ijg
6*dfc6aa5cSAndroid Build Coastguard Worker  * file.
7*dfc6aa5cSAndroid Build Coastguard Worker  *
8*dfc6aa5cSAndroid Build Coastguard Worker  * This file contains convenience functions for performing quick & dirty
9*dfc6aa5cSAndroid Build Coastguard Worker  * CMYK<->RGB conversion.  This algorithm is suitable for testing purposes
10*dfc6aa5cSAndroid Build Coastguard Worker  * only.  Properly converting between CMYK and RGB requires a color management
11*dfc6aa5cSAndroid Build Coastguard Worker  * system.
12*dfc6aa5cSAndroid Build Coastguard Worker  */
13*dfc6aa5cSAndroid Build Coastguard Worker 
14*dfc6aa5cSAndroid Build Coastguard Worker #ifndef CMYK_H
15*dfc6aa5cSAndroid Build Coastguard Worker #define CMYK_H
16*dfc6aa5cSAndroid Build Coastguard Worker 
17*dfc6aa5cSAndroid Build Coastguard Worker #include <jinclude.h>
18*dfc6aa5cSAndroid Build Coastguard Worker #define JPEG_INTERNALS
19*dfc6aa5cSAndroid Build Coastguard Worker #include <jpeglib.h>
20*dfc6aa5cSAndroid Build Coastguard Worker 
21*dfc6aa5cSAndroid Build Coastguard Worker 
22*dfc6aa5cSAndroid Build Coastguard Worker /* Fully reversible */
23*dfc6aa5cSAndroid Build Coastguard Worker 
24*dfc6aa5cSAndroid Build Coastguard Worker INLINE
LOCAL(void)25*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
26*dfc6aa5cSAndroid Build Coastguard Worker rgb_to_cmyk(JSAMPLE r, JSAMPLE g, JSAMPLE b, JSAMPLE *c, JSAMPLE *m,
27*dfc6aa5cSAndroid Build Coastguard Worker             JSAMPLE *y, JSAMPLE *k)
28*dfc6aa5cSAndroid Build Coastguard Worker {
29*dfc6aa5cSAndroid Build Coastguard Worker   double ctmp = 1.0 - ((double)r / 255.0);
30*dfc6aa5cSAndroid Build Coastguard Worker   double mtmp = 1.0 - ((double)g / 255.0);
31*dfc6aa5cSAndroid Build Coastguard Worker   double ytmp = 1.0 - ((double)b / 255.0);
32*dfc6aa5cSAndroid Build Coastguard Worker   double ktmp = MIN(MIN(ctmp, mtmp), ytmp);
33*dfc6aa5cSAndroid Build Coastguard Worker 
34*dfc6aa5cSAndroid Build Coastguard Worker   if (ktmp == 1.0) ctmp = mtmp = ytmp = 0.0;
35*dfc6aa5cSAndroid Build Coastguard Worker   else {
36*dfc6aa5cSAndroid Build Coastguard Worker     ctmp = (ctmp - ktmp) / (1.0 - ktmp);
37*dfc6aa5cSAndroid Build Coastguard Worker     mtmp = (mtmp - ktmp) / (1.0 - ktmp);
38*dfc6aa5cSAndroid Build Coastguard Worker     ytmp = (ytmp - ktmp) / (1.0 - ktmp);
39*dfc6aa5cSAndroid Build Coastguard Worker   }
40*dfc6aa5cSAndroid Build Coastguard Worker   *c = (JSAMPLE)(255.0 - ctmp * 255.0 + 0.5);
41*dfc6aa5cSAndroid Build Coastguard Worker   *m = (JSAMPLE)(255.0 - mtmp * 255.0 + 0.5);
42*dfc6aa5cSAndroid Build Coastguard Worker   *y = (JSAMPLE)(255.0 - ytmp * 255.0 + 0.5);
43*dfc6aa5cSAndroid Build Coastguard Worker   *k = (JSAMPLE)(255.0 - ktmp * 255.0 + 0.5);
44*dfc6aa5cSAndroid Build Coastguard Worker }
45*dfc6aa5cSAndroid Build Coastguard Worker 
46*dfc6aa5cSAndroid Build Coastguard Worker 
47*dfc6aa5cSAndroid Build Coastguard Worker /* Fully reversible only for C/M/Y/K values generated with rgb_to_cmyk() */
48*dfc6aa5cSAndroid Build Coastguard Worker 
49*dfc6aa5cSAndroid Build Coastguard Worker INLINE
LOCAL(void)50*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
51*dfc6aa5cSAndroid Build Coastguard Worker cmyk_to_rgb(JSAMPLE c, JSAMPLE m, JSAMPLE y, JSAMPLE k, JSAMPLE *r, JSAMPLE *g,
52*dfc6aa5cSAndroid Build Coastguard Worker             JSAMPLE *b)
53*dfc6aa5cSAndroid Build Coastguard Worker {
54*dfc6aa5cSAndroid Build Coastguard Worker   *r = (JSAMPLE)((double)c * (double)k / 255.0 + 0.5);
55*dfc6aa5cSAndroid Build Coastguard Worker   *g = (JSAMPLE)((double)m * (double)k / 255.0 + 0.5);
56*dfc6aa5cSAndroid Build Coastguard Worker   *b = (JSAMPLE)((double)y * (double)k / 255.0 + 0.5);
57*dfc6aa5cSAndroid Build Coastguard Worker }
58*dfc6aa5cSAndroid Build Coastguard Worker 
59*dfc6aa5cSAndroid Build Coastguard Worker 
60*dfc6aa5cSAndroid Build Coastguard Worker #endif /* CMYK_H */
61