Code:
#define CONST (double)((double)180/M_PI)
cx = attrib.width/2;
cy = attrib.height/2;
unsigned long tleft_p, tright_p, bleft_p, bright_p;
unsigned long background_p;
XColor tleft_c, tright_c, bleft_c, bright_c;
Display *dpy = XtDisplay(w);
Colormap cmap = DefaultColormap(dpy, DefaultScreen(dpy));
for (y=1; y<attrib.height; y++) {
for (x=1; x<attrib.width; x++) {
XColor mycol;
int xx, yy, floor_x, floor_y, ceil_x, ceil_y;
float dist, ang, true_x, true_y, delta_x, delta_y;
float tred, tgreen, tblue, bred, bgreen, bblue;
int red, green, blue;
/* rotation */
xx = x - attrib.width/2;
yy = y - attrib.height/2;
true_x = (double)xx * cos((double)deg/CONST) + (double)yy * sin((double)deg/CONST);
true_y = (double)xx * -sin((double)deg/CONST) + (double)yy * cos((double)deg/CONST);
true_x += attrib.height/2;
true_y += attrib.width/2;
floor_x = (int)floor(true_x);
floor_y = (int)floor(true_y);
ceil_x = (int)ceil(true_x);
ceil_y = (int)ceil(true_y);
delta_x = true_x - (double)floor_x;
delta_y = true_y - (double)floor_y;
tleft_p = XGetPixel(src, floor_x, floor_y);
tright_p = XGetPixel(src, ceil_x, floor_y);
bleft_p = XGetPixel(src, floor_x, ceil_y);
bright_p = XGetPixel(src, ceil_x, ceil_y);
tleft_c.pixel = tleft_p;
tright_c.pixel= tright_p;
bleft_c.pixel = bleft_p;
bright_c.pixel= bright_p;
XQueryColor(dpy, cmap, &tleft_c);
XQueryColor(dpy, cmap, &tright_c);
XQueryColor(dpy, cmap, &bleft_c);
XQueryColor(dpy, cmap, &bright_c);
/* interpolation */
/* tred = top red, bred = bottom red ... */
tred = (1-delta_x)* (int)tleft_c.red + delta_x * tright_c.red;
tgreen = (1-delta_x)* (int)tleft_c.green + delta_x * tright_c.green;
tblue = (1-delta_x)* (int)tleft_c.blue + delta_x * tright_c.blue;
bred = (1-delta_x) * (int)bleft_c.red + delta_x * (int)bright_c.red;
bgreen = (1-delta_x)*(int)bleft_c.green+delta_x * (int)bright_c.green;
bblue = (1-delta_x)* (int)bleft_c.blue+ delta_x * (int)bright_c.blue;
red = (int)round((1-delta_y) * tred + delta_y * bred);
green = (int)round((1-delta_y) * tgreen + delta_y * bgreen);
blue = (int)round((1-delta_y) * tblue + delta_y * bblue);
if (red < 0) red = 0;
if (green<0) green=0;
if (blue<0) blue =0;
if (blue>65535) blue=65535;
if (green>65535) green=65535;
if (red>65535) red=65535;
mycol.red = red;
mycol.green=green;
mycol.blue=blue;
XAllocColor(dpy, cmap, &mycol);
XPutPixel(dest, x, y, mycol.pixel);
}
}