]>
Dogcows Code - chaz/openbox/blob - render/color.c
5 #include "../kernel/openbox.h"
10 void color_allocate_gc(color_rgb
*in
)
14 gcv
.foreground
= in
->pixel
;
15 gcv
.cap_style
= CapProjecting
;
16 in
->gc
= XCreateGC(ob_display
, ob_root
, GCForeground
| GCCapStyle
, &gcv
);
19 color_rgb
*color_parse(char *colorname
)
23 g_assert(colorname
!= NULL
);
24 /* get rgb values from colorname */
30 if (!XParseColor(ob_display
, render_colormap
, colorname
, &xcol
)) {
31 g_warning("unable to parse color '%s'", colorname
);
34 return color_new(xcol
.red
>> 8, xcol
.green
>> 8, xcol
.blue
>> 8);
37 color_rgb
*color_new(int r
, int g
, int b
)
39 /* this should be replaced with something far cooler */
42 xcol
.red
= (r
<< 8) | r
;
43 xcol
.green
= (g
<< 8) | g
;
44 xcol
.blue
= (b
<< 8) | b
;
45 if (XAllocColor(ob_display
, render_colormap
, &xcol
)) {
46 out
= g_new(color_rgb
, 1);
47 out
->r
= xcol
.red
>> 8;
48 out
->g
= xcol
.green
>> 8;
49 out
->b
= xcol
.blue
>> 8;
51 out
->pixel
= xcol
.pixel
;
57 /*XXX same color could be pointed to twice, this might have to be a refcount*/
59 void color_free(color_rgb
*c
)
63 XFreeGC(ob_display
, c
->gc
);
68 void reduce_depth(pixel32
*data
, XImage
*im
)
72 pixel32
*p32
= (pixel32
*) im
->data
;
73 pixel16
*p16
= (pixel16
*) im
->data
;
74 unsigned char *p8
= (unsigned char *)im
->data
;
75 switch (im
->bits_per_pixel
) {
77 if ((render_red_offset
!= default_red_offset
) ||
78 (render_blue_offset
!= default_blue_offset
) ||
79 (render_green_offset
!= default_green_offset
)) {
80 for (y
= 0; y
< im
->height
; y
++) {
81 for (x
= 0; x
< im
->width
; x
++) {
82 r
= (data
[x
] >> default_red_offset
) & 0xFF;
83 g
= (data
[x
] >> default_green_offset
) & 0xFF;
84 b
= (data
[x
] >> default_blue_offset
) & 0xFF;
85 p32
[x
] = (r
<< render_red_offset
)
86 + (g
<< render_green_offset
)
87 + (b
<< render_blue_offset
);
92 } else im
->data
= (char*) data
;
95 for (y
= 0; y
< im
->height
; y
++) {
96 for (x
= 0; x
< im
->width
; x
++) {
97 r
= (data
[x
] >> default_red_offset
) & 0xFF;
98 r
= r
>> render_red_shift
;
99 g
= (data
[x
] >> default_green_offset
) & 0xFF;
100 g
= g
>> render_green_shift
;
101 b
= (data
[x
] >> default_blue_offset
) & 0xFF;
102 b
= b
>> render_blue_shift
;
103 p16
[x
] = (r
<< render_red_offset
)
104 + (g
<< render_green_offset
)
105 + (b
<< render_blue_offset
);
108 p16
+= im
->bytes_per_line
/2;
112 g_assert(render_visual
->class != TrueColor
);
113 for (y
= 0; y
< im
->height
; y
++) {
114 for (x
= 0; x
< im
->width
; x
++) {
115 p8
[x
] = pickColor(data
[x
] >> default_red_offset
,
116 data
[x
] >> default_green_offset
,
117 data
[x
] >> default_blue_offset
)->pixel
;
120 p8
+= im
->bytes_per_line
;
125 g_message("your bit depth is currently unhandled\n");
128 XColor
*pickColor(int r
, int g
, int b
)
130 r
= (r
& 0xff) >> (8-pseudo_bpc
);
131 g
= (g
& 0xff) >> (8-pseudo_bpc
);
132 b
= (b
& 0xff) >> (8-pseudo_bpc
);
133 return &pseudo_colors
[(r
<< (2*pseudo_bpc
)) + (g
<< (1*pseudo_bpc
)) + b
];
This page took 0.040106 seconds and 4 git commands to generate.