109 lines
2.7 KiB
C
109 lines
2.7 KiB
C
#include "xlib.h"
|
|
#include "scheme48.h"
|
|
|
|
s48_value Create_Color(s48_value r, s48_value g, s48_value b) {
|
|
s48_value col = S48_MAKE_VALUE(XColor);
|
|
XColor* c = S48_EXTRACT_VALUE_POINTER(col, XColor);
|
|
c->red = s48_extract_integer(r);
|
|
c->green = s48_extract_integer(g);
|
|
c->blue = s48_extract_integer(b);
|
|
|
|
return col;
|
|
}
|
|
|
|
s48_value Int_Extract_RGB_Values(XColor col) {
|
|
s48_value res = S48_NULL;
|
|
S48_DECLARE_GC_PROTECT(1);
|
|
S48_GC_PROTECT_1(res);
|
|
|
|
res = s48_cons( s48_enter_integer(col.blue), res );
|
|
res = s48_cons( s48_enter_integer(col.green), res );
|
|
res = s48_cons( s48_enter_integer(col.red), res );
|
|
|
|
S48_GC_UNPROTECT();
|
|
return res;
|
|
}
|
|
|
|
s48_value Extract_RGB_Values(s48_value Xcolor) {
|
|
XColor* col = EXTRACT_COLOR(Xcolor);
|
|
return Int_Extract_RGB_Values(*col);
|
|
}
|
|
|
|
s48_value Query_Color (s48_value Xcolormap, s48_value Xpixel,
|
|
s48_value Xdisplay) {
|
|
XColor c;
|
|
Colormap cm = EXTRACT_COLORMAP(Xcolormap);
|
|
Display* dpy = EXTRACT_DISPLAY(Xdisplay);
|
|
|
|
c.pixel = EXTRACT_PIXEL(Xpixel);
|
|
XQueryColor(dpy, cm, &c);
|
|
|
|
return Int_Extract_RGB_Values(c);
|
|
}
|
|
|
|
/*
|
|
s48_value Query_Colors(s48_value Xcolormap, s48_value Xpixels,
|
|
s48_value Xdisplay) {
|
|
Colormap* cm = (Colormap*)S48_EXTRACT_VALUE_POINTER(Xcolormap, Colormap);
|
|
Display* dpy = (Display*)s48_extract_integer(Xdisplay);
|
|
|
|
long l = S48_VECTOR_LENGTH(Xpixels);
|
|
|
|
|
|
register i, n;
|
|
s48_value ret;
|
|
register XColor *p;
|
|
S48_DECLARE_GC_PROTECT(1);
|
|
Alloca_Begin;
|
|
|
|
Check_Type (v, T_Vector);
|
|
n = S48_VECTOR_LENGTH(v);
|
|
Alloca (p, XColor*, n * sizeof (XColor));
|
|
for (i = 0; i < n; i++)
|
|
p[i].pixel = Get_Pixel (VECTOR(v)->data[i]);
|
|
Disable_Interrupts;
|
|
XQueryColors (COLORMAP(cmap)->dpy, cm, p, n);
|
|
Enable_Interrupts;
|
|
ret = s48_make_vector (n, S48_NULL);
|
|
S48_GC_PROTECT_1 (ret);
|
|
for (i = 0; i < n; i++, p++) {
|
|
s48_value x;
|
|
|
|
x = Make_Color (p->red, p->green, p->blue);
|
|
S48_VECTOR_SET(ret, i, x;)
|
|
}
|
|
S48_GC_UNPROTECT;
|
|
Alloca_End;
|
|
return ret;
|
|
}
|
|
|
|
*/
|
|
|
|
s48_value Lookup_Color(s48_value Xcolormap, s48_value Xdisplay,
|
|
s48_value color_name) {
|
|
XColor visual, exact;
|
|
Colormap cm = EXTRACT_COLORMAP(Xcolormap);
|
|
Display* dpy = EXTRACT_DISPLAY(Xdisplay);
|
|
|
|
s48_value res = S48_FALSE;
|
|
S48_DECLARE_GC_PROTECT(1);
|
|
S48_GC_PROTECT_1(res);
|
|
|
|
if (XLookupColor( dpy, cm, s48_extract_string(color_name),
|
|
&visual, &exact )) {
|
|
res = s48_cons( Int_Extract_RGB_Values( visual ),
|
|
Int_Extract_RGB_Values( exact ) );
|
|
}
|
|
|
|
S48_GC_UNPROTECT();
|
|
return res;
|
|
}
|
|
|
|
void s48_init_color(void) {
|
|
S48_EXPORT_FUNCTION(Create_Color);
|
|
S48_EXPORT_FUNCTION(Extract_RGB_Values);
|
|
S48_EXPORT_FUNCTION(Query_Color);
|
|
// S48_EXPORT_FUNCTION(Query_Colors);
|
|
S48_EXPORT_FUNCTION(Lookup_Color);
|
|
}
|