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