+static int copy_rgb_to_zpixmap (XImage *dest, const Image *src)
+{
+ uint32_t *src_data;
+
+ uint32_t src_r;
+ uint32_t src_g;
+ uint32_t src_b;
+
+ uint32_t dest_r;
+ uint32_t dest_g;
+ uint32_t dest_b;
+ uint32_t dest_pixel_value;
+
+ uint32_t x;
+ uint32_t y;
+ uint32_t pixel;
+
+ uint32_t dest_r_maxval;
+ uint32_t dest_g_maxval;
+ uint32_t dest_b_maxval;
+
+ uint32_t dest_r_offset;
+ uint32_t dest_g_offset;
+ uint32_t dest_b_offset;
+
+ dest_r_offset = 0;
+ dest_g_offset = 0;
+ dest_b_offset = 0;
+ dest_r_maxval = dest->red_mask;
+ dest_g_maxval = dest->green_mask;
+ dest_b_maxval = dest->blue_mask;
+ for (x = 0; x < dest->depth; x++)
+ {
+ if ((dest_r_maxval & 0x01) == 0)
+ {
+ dest_r_offset++;
+ dest_r_maxval >>= 1;
+ }
+ if ((dest_g_maxval & 0x01) == 0)
+ {
+ dest_g_offset++;
+ dest_g_maxval >>= 1;
+ }
+ if ((dest_b_maxval & 0x01) == 0)
+ {
+ dest_b_offset++;
+ dest_b_maxval >>= 1;
+ }
+ }
+
+ src_data = (uint32_t *) *src->data;
+
+ pixel = 0;
+ for (y = 0; y < dest->height; y++)
+ {
+ for (x = 0; x < dest->width; x++, pixel++)
+ {
+ int32_t bytenum;
+
+ src_r = (src_data[pixel] >> 8) & 0xFF;
+ src_g = (src_data[pixel] >> 16) & 0xFF;
+ src_b = (src_data[pixel] >> 24) & 0xFF;
+
+ dest_r = dest_r_maxval * src_r / 0xFF;
+ dest_g = dest_g_maxval * src_g / 0xFF;
+ dest_b = dest_b_maxval * src_b / 0xFF;