+cairo_surface_t *
+ConvertPixmap (int color, int piece)
+{
+ int i, j, stride, f, colcode[10], w, b;
+ char ch[10];
+ cairo_surface_t *res;
+ XpmPieces *p = builtInXpms + 10;
+ char **pixels = p->xpm[piece % BlackPawn][2*color];
+ int *buf;
+ sscanf(pixels[0], "%*d %*d %d", &f);
+ sscanf(appData.whitePieceColor+1, "%x", &w);
+ sscanf(appData.blackPieceColor+1, "%x", &b);
+ for(i=0; i<f; i++) {
+ ch[i] = pixels[i+1][0];
+ colcode[i] = 0;
+ if(strstr(pixels[i+1], "black")) colcode[i] = 0xFF000000 + (color ? b : 0);
+ if(strstr(pixels[i+1], "white")) colcode[i] = 0xFF000000 + w;
+ }
+ stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, p->size);
+ buf = (int *) malloc(p->size*stride);
+ for(i=0; i<p->size; i++) {
+ for(j=0; j<p->size; j++) {
+ char c = pixels[i+f+1][j];
+ int k;
+ for(k=0; ch[k] != c && k < f; k++);
+ buf[i*p->size + j] = colcode[k];
+ }
+ }
+ res = cairo_image_surface_create_for_data((unsigned char *) buf, CAIRO_FORMAT_ARGB32, p->size, p->size, stride);
+ if(cairo_surface_status(res) != CAIRO_STATUS_SUCCESS) { printf("bad pixmap convert\n"); exit(1); }
+ return res;
+}
+