1 /* Copyright (C) 2000 Damir Zucic */
2 
3 /*=============================================================================
4 
5 				add_two_colors.c
6 
7 Purpose:
8 	Add (interpolate) two additional colors.
9 
10 Input:
11 	(1) The first input color.
12 	(2) The second input color.
13 	(3) Pointer to GUIS structure.
14 	(4) Pointer to the first output color.
15 	(5) Pointer to the second output color.
16 
17 Output:
18 	(1) The first output color prepared.
19 	(2) The second output color prepared.
20 
21 Return value:
22 	No return value.
23 
24 =============================================================================*/
25 
26 #include <stdio.h>
27 
28 #include <X11/Xlib.h>
29 #include <X11/Xutil.h>
30 #include <X11/Xos.h>
31 #include <X11/Xatom.h>
32 
33 #include "defines.h"
34 #include "typedefs.h"
35 
36 /*======add (interpolate) two colors:========================================*/
37 
AddTwoColors_(unsigned long input_color1ID,unsigned long input_color2ID,GUIS * guiSP,unsigned long * output_color1IDP,unsigned long * output_color2IDP)38 void AddTwoColors_ (unsigned long input_color1ID,
39 		    unsigned long input_color2ID,
40 		    GUIS *guiSP,
41 		    unsigned long *output_color1IDP,
42 		    unsigned long *output_color2IDP)
43 {
44 unsigned long		red_mask, green_mask, blue_mask;
45 unsigned long		red1, red2, red;
46 unsigned long		green1, green2, green;
47 unsigned long		blue1, blue2, blue;
48 double			r1, r2, g1, g2, b1, b2;
49 double			w1, w2, r, g, b;
50 
51 /* Copy masks: */
52 red_mask   = guiSP->visual_infoS.red_mask;
53 green_mask = guiSP->visual_infoS.green_mask;
54 blue_mask  = guiSP->visual_infoS.blue_mask;
55 
56 /* Extract input color components: */
57 red1   = input_color1ID & red_mask;
58 red2   = input_color2ID & red_mask;
59 green1 = input_color1ID & green_mask;
60 green2 = input_color2ID & green_mask;
61 blue1  = input_color1ID & blue_mask;
62 blue2  = input_color2ID & blue_mask;
63 
64 /* Convert to doubles: */
65 r1 = (double) red1;
66 r2 = (double) red2;
67 g1 = (double) green1;
68 g2 = (double) green2;
69 b1 = (double) blue1;
70 b2 = (double) blue2;
71 
72 /* Weighting factors: */
73 w1 = 2.0 / 3.0;
74 w2 = 1.0 / 3.0;
75 
76 /* The first output color (components): */
77 r = w1 * r1 + w2 * r2;
78 g = w1 * g1 + w2 * g2;
79 b = w1 * b1 + w2 * b2;
80 red   = ((unsigned long) r) & red_mask;
81 green = ((unsigned long) g) & green_mask;
82 blue  = ((unsigned long) b) & blue_mask;
83 
84 /* The first output color (value): */
85 *output_color1IDP = red | green | blue;
86 
87 /* The second output color (components): */
88 r = w2 * r1 + w1 * r2;
89 g = w2 * g1 + w1 * g2;
90 b = w2 * b1 + w1 * b2;
91 red   = ((unsigned long) r) & red_mask;
92 green = ((unsigned long) g) & green_mask;
93 blue  = ((unsigned long) b) & blue_mask;
94 
95 /* The second output color (value): */
96 *output_color2IDP = red | green | blue;
97 
98 }
99 
100 /*===========================================================================*/
101 
102 
103