static void prnt(Pixmap pixmap, FILE *fp) { unsigned int width, height, depth = 8; unsigned int ncolors, cpp; int x, y, col; char *title = "Plugged in image"; time_t t; char **data, *key, *color; XpmAttributes xa; int i, n; colors *cm; xa.valuemask = 0; /* figure out a thing or two */ n = XpmCreateDataFromPixmap(XtDisplay(topLevel), &data, pixmap, None, &xa); if (n != XpmSuccess) { printf("503 XpmCreateDataFromPixmap returns %d\n", n); return; } sscanf(data[0], "%d %d %d %d", &width, &height, &ncolors, &cpp); cm = (colors *)MwMalloc(ncolors*sizeof(colors)); for (i = 0; i < ncolors; i++) { cm[i].chars = (char *)MwMalloc(cpp); memcpy(cm[i].chars, data[i+1], cpp); key = strtok(data[i+1]+cpp, " \t"); /* skip past chars */ color = strtok(NULL, " \t"); while (key && color && strcmp(key, "c")) { key = strtok(NULL, " \t"); color = strtok(NULL, " \t"); }; if (!color) { printf("504 No such color\n"); return; } XParseColor(XtDisplay(topLevel), XDefaultColormapOfScreen(XtScreen(topLevel)), color, &cm[i].xcolor); } /* print postscript preblurb */ fprintf(fp, "%%!PS-Adobe-2.0 EPSF-2.0\n"); fprintf(fp, "%%%%Creator: Image plugin for Siag Office\n"); fprintf(fp, "%%%%Title: %s\n", title); fprintf(fp, "%%%%Pages: 1\n"); fprintf(fp, "%%%%BoundingBox: %d %d %d %d\n", 0, 0, width, height); t = time(NULL); fprintf(fp, "%%%%CreationDate: %s", ctime(&t)); fprintf(fp, "%%%%EndComments\n"); fprintf(fp, "%%%%EndProlog\n"); fprintf(fp, "%%%%Page: 1 1\n\n\n"); fprintf(fp, "gsave\n\n"); fprintf(fp, "/inch {72 mul} def\n"); fprintf(fp, "%d %d scale\n", width, height); fprintf(fp, "/line %d string def\n", 3*width); fprintf(fp, "%d %d %d\n", width, height, depth); fprintf(fp, "[ %d %d %d %d %d %d ]\n", width, 0, 0, -height, 0, height); fprintf(fp, "{currentfile line readhexstring pop}\n"); fprintf(fp, "false 3 colorimage\n"); /* print all the pixels */ col = 0; for (y = 0; y < height; y++) { char *line = data[y+ncolors+1]; for (x = 0; x < width; x++) { char *pix = line+cpp*x; for (i = 0; i < ncolors; i++) if (!memcmp(cm[i].chars, pix, cpp)) break; if (i == ncolors) i = 0; fprintf(fp, "%02hx%02hx%02hx", (cm[i].xcolor.red / 256) & 255, (cm[i].xcolor.green / 256) & 255, (cm[i].xcolor.blue / 256) & 255); col += 6; if (col >= 72) { fprintf(fp, "\n"); col = 0; } } } if (col) fprintf(fp, "\n"); /* print postscript postblurb */ fprintf(fp, "%%\n\n"); fprintf(fp, "grestore\n"); for (i = 0; i < ncolors; i++) MwFree(cm[i].chars); MwFree(cm); MwFree(data); }
int C_PrintProc(ClientData cl, Tcl_Interp *interp, int argc, char **argv) { char fileType, printMode; WindowType theWindow = theWindowArray[atoi(argv[1])]; char **xpmData; fileType = argv[4][0]; printMode = argv[5][0]; switch(fileType) { case 'x': #ifdef XPMENABLED if(argv[6][0]!='n' && (!Is_Trace_On(theWindow) || Is_X_AutoRescale(theWindow) || Is_Y_AutoRescale(theWindow))) { Iconic_Before(theWindow); C_RefreshGraphicsProc(NULL,NULL,1,argv); } XpmWriteFileFromPixmap(theDisplay,argv[2],theWindow->pixmap_buffer, 0,NULL); #endif break; case 'p': #ifdef XPMENABLED if(argv[4][1]=='n') /* png */ { if(argv[6][0]!='n' && (!Is_Trace_On(theWindow) || Is_X_AutoRescale(theWindow) || Is_Y_AutoRescale(theWindow))) { Iconic_Before(theWindow); C_RefreshGraphicsProc(NULL,NULL,1,argv); } XpmWriteFileFromPixmap(theDisplay,argv[2],theWindow->pixmap_buffer,0,0); { char name[512]; char name2[512]; char buffer[512]; int i; sprintf(name,"%s",argv[2]); i = strlen(name); if(i<5) return 0; /* invalid name */ sprintf(name+i-4,"%s",".xpm"); sprintf(name2,"%s",name); sprintf(name2+i-4,"%s",".png"); sprintf(buffer,"mv %s %s;convert %s %s; rm %s",name2,name,name,name2,name); system(buffer); break; } } #else break; #endif /* XPMENABLED */ case 'e': if(access(argv[2],F_OK) || printMode=='o' || printMode=='c') PSHeader(argv[2]); (*(theWindow->print_function)) (theWindow, argv[2], argv[3]); break; case 'a': (*(theWindow->ascii_print_function)) (theWindow, argv[2], printMode); break; case 'b': (*(theWindow->xgrafix_print_function)) (theWindow, argv[2], printMode); break; case 'g': #ifdef XPMENABLED if(argv[6][0]!='n' && (!Is_Trace_On(theWindow) || Is_X_AutoRescale(theWindow) || Is_Y_AutoRescale(theWindow))) { Iconic_Before(theWindow); C_RefreshGraphicsProc(NULL,NULL,1,argv); } XpmCreateDataFromPixmap(theDisplay, &xpmData, theWindow->pixmap_buffer, 0,NULL); XpmToGif(xpmData,argv[2]); XpmFree(xpmData); #endif break; } return TCL_OK; }