Пример #1
0
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);
}
Пример #2
0
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;
}