pike.git / lib / modules / _Image_PS.pmod

version» Context lines:

pike.git/lib/modules/_Image_PS.pmod:1:   #pike __REAL_VERSION__      //! @appears Image.PS   //! Codec for the Adobe page description language PostScript. - //! Uses Ghostscript for decoding. + //! Uses Ghostscript for decoding or built-in support.      static string find_in_path( string file )   {    string path=getenv("PATH");    foreach(path ? path/":" : ({}) , path)    if(file_stat(path=combine_path(path,file)))    return path;   }      //! Decodes the postscript @[data] into an image object
pike.git/lib/modules/_Image_PS.pmod:19:   //! @mapping   //! @member int "dpi"   //! The resolution the image should be rendered in.   //! Defaults to 100.   //! @member string "device"   //! The selected Ghostscript device. Defaults to "ppmraw".   //! @member string "binary"   //! Path to the Ghostscript binary to be used. If missing   //! the environment paths will be searched for a file "gs"   //! to be used instead. + //! @member int(0..1) "force_gs" + //! Forces use of Ghostscript for EPS files instead + //! of Pikes native support. + //! @member int(0..1) "eps_crop" + //! Use -dEPSCrop option to Ghostscript to crop the + //! BoundingBox for a EPS file. + //! @member int(0..1) "cie_color" + //! Use -dUseCIEColor option to Ghostscript for + //! mapping color values through a CIE color space.   //! @endmapping   object decode( string data, mapping|void options )   {    if(has_prefix(data, "\xc5\xd0\xd3\xc6")) {    // DOS EPS Binary Header.    int ps_start, ps_len, meta_start, meta_len, tiff_start, tiff_len, sum;    sscanf(data, "%*4c%-4c%-4c%-4c%-4c%-4c%-4c%-2c",    ps_start, ps_len, meta_start, meta_len, tiff_start, tiff_len, sum);   #if constant(Image.TIFF.decode)    if (tiff_start && tiff_len) {    // werror("Decoding TIFF.\n");    return Image.TIFF.decode(data[tiff_start..tiff_start + tiff_len-1]);    }   #endif    data = data[ps_start..ps_start+ps_len-1];    }    if(data[0..3] != "%!PS")    error("This is not a postscript file!\n"); -  +  +  if(!options) options = ([]); +  if(!options->force_gs) +  {   #if 1    if (has_prefix(data, "%!PS-Adobe-3.0 EPSF-3.0")) {    int width, height, bits, ncols;    int nbws, width2, encoding;    string init_tag;    if ((sscanf(data,    "%*s%%ImageData:%*[ ]%d%*[ ]%d%*[ ]%d%*[ ]%d%"    "*[ ]%d%*[ ]%d%*[ ]%d%*[ ]\"%s\"",    width, height, bits, ncols,    nbws, width2, encoding, init_tag) > 7) &&
pike.git/lib/modules/_Image_PS.pmod:94:    for(i = ncols; i < sizeof(rows); i += ncols+nbws) {    grey += rows[i];    }    return Image.Image(width, height, "rgb", grey, grey, grey);    }    }    }    }    // return 0;   #endif +  }    -  if(!options) options = ([]); +     int llx, lly;    int urx, ury;       Stdio.File fd = Stdio.File();    object fd2 = fd->pipe();       Stdio.File fd3 = Stdio.File();    object fd4 = fd3->pipe();    -  if(sscanf(data, "%*s%%%%BoundingBox: %s%*[\r\n]", string bbox) == 3) +  if(sscanf(data, "%*s%%%%BoundingBox: %s%*[\r\n]", string bbox) == 3 && !options->eps_crop)    {    int x0,x1,y0,y1;    sscanf(bbox, "%d %d %d %d", x0,y0,x1,y1 );    llx = (int)((x0/72.0) * (options->dpi||100)+0.01);    lly = (int)((y0/72.0) * (options->dpi||100)+0.01);    urx = (int)((x1/72.0) * (options->dpi||100)+0.01);    ury = (int)((y1/72.0) * (options->dpi||100)+0.01);    }       array command = ({    options->binary||find_in_path("gs")||("/bin/sh -c gs "),    "-quiet",    "-sDEVICE="+(options->device||"ppmraw"),    // "-sPAPERSIZE=a8",    "-r"+(options->dpi||100), -  "-dNOPAUSE", +  "-dNOPAUSE"}); +  +  if(options->eps_crop) +  command += ({"-dEPSCrop"}); +  +  if(options->cie_color) +  command += ({"-dUseCIEColor"}); +  +  command += ({    "-sOutputFile=-",    "-", -  "-c quit 2>/dev/null" -  }); +  "-c quit 2>/dev/null"});       Process.Process pid = Process.create_process( command, ([    "stdin":fd,    "stdout":fd4,    "stderr":fd4,    ]));    destruct(fd);    destruct(fd4);    // Kill the gs binary after 30 seconds in case it hangs.    mixed co = call_out(lambda(Process.Process pid) {