Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
TASPluginGS.cxx
Go to the documentation of this file.
1// @(#)root/graf:$Id$
2// Author: Valeriy Onuchin 23/06/05
3
4/*************************************************************************
5 * Copyright (C) 1995-2001, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12/** \class TASPluginGS
13\ingroup asimage
14
15Allows to read PS/EPS/PDF files via GhostScript
16*/
17
18#include "TASPluginGS.h"
19#include "TSystem.h"
20#include "RConfigure.h"
21
22#ifdef R__HAS_COCOA
23# define X_DISPLAY_MISSING 1
24# define popen_flags "r"
25#elif defined (WIN32)
26# include "Windows4root.h"
27# define popen_flags "rb"
28#else
29# include <X11/Xlib.h>
30# define popen_flags "r"
31#endif
32
33#ifndef WIN32
34# include <afterbase.h>
35#else
36# define X_DISPLAY_MISSING 1
37# include <afterbase.h>
38#endif
39# include <import.h>
40
41
42
43////////////////////////////////////////////////////////////////////////////////
44/// ctor
45
47{
48#ifndef WIN32
49 fGsExe = "gs";
50 gSystem->FindFile(gSystem->Getenv("PATH"), fGsExe, kExecutePermission);
51#else
52 fGsExe = "gswin32c.exe";
53 // FindFile returned path may include blanks, like "Program Files" which popen does not like
54 // Therefore if executable found in defined paths, just use it name as is
55 if (gSystem->FindFile(gSystem->Getenv("PATH"), fGsExe, kExecutePermission))
56 fGsExe = "gswin32c.exe";
57#endif
58}
59
60////////////////////////////////////////////////////////////////////////////////
61/// dtor
62
67
68////////////////////////////////////////////////////////////////////////////////
69/// read PS/EPS/PDF file and convert it to ASImage
70
71ASImage *TASPluginGS::File2ASImage(const char *filename)
72{
73 if (fGsExe.IsNull()) {
74 Warning("File2ASImage", "GhostScript is not available");
75 return nullptr;
76 }
77
78 if (gSystem->AccessPathName(filename)) {
79 Warning("File2ASImage", "input file %s is not accessible", filename);
80 return nullptr;
81 }
82
83 const char *ppos = strrchr(filename, '.');
84
85 TString ext;
86 if (ppos) {
87 ext = ppos + 1;
88 ext.Strip();
89 ext.ToLower();
90 }
91
92 UInt_t width = 0, height = 0;
93 Bool_t eps = ext == "eps";
94
95 if (eps) {
96 FILE *fd = fopen(filename, "r");
97 if (!fd) {
98 Warning("File2ASImage", "input file %s is not readable", filename);
99 return nullptr;
100 }
101
102 do {
103 char buf[128];
104 TString line = fgets(buf, 128, fd);
105 if (line.IsNull() || !line.BeginsWith("%"))
106 break;
107
108 if (line.BeginsWith("%%BoundingBox:")) {
109 int lx, ly, ux, uy;
110 line = line(14, line.Length());
111 sscanf(line.Data(), "%d %d %d %d", &lx, &ly, &ux, &uy);
112 width = std::abs(ux - lx);
113 height = std::abs(uy - ly);
114 break;
115 }
116 } while (!feof(fd));
117
118 fclose(fd);
119 }
120
121 // command line to execute
122 TString cmd = fGsExe;
123 if (eps)
124 cmd += TString::Format(" -g%dx%d", width, height);
125 cmd += " -dSAFER -dBATCH -dNOPAUSE -dQUIET -sDEVICE=png16m -dGraphicsAlphaBits=4 -sOutputFile=- ";
126 cmd += filename;
127 FILE *in = gSystem->OpenPipe(cmd.Data(), popen_flags);
128
129 if (!in)
130 return nullptr;
131
132 const UInt_t kBuffLength = 32768;
133 char buf[kBuffLength];
134 TString raw;
135
136 do {
137 Long_t r = fread(&buf, 1, kBuffLength, in);
138 raw.Append((const char*)&buf, r);
139 } while (!feof(in));
140
141 gSystem->ClosePipe(in);
142
143 ASImageImportParams params;
144 params.flags = 0;
145 params.width = width;
146 params.height = height;
147 params.filter = SCL_DO_ALL;
148 params.gamma = 0;
149 params.gamma_table = nullptr;
150 params.compression = 0;
151 params.format = ASA_ASImage;
152 params.search_path = nullptr;
153 params.subimage = 0;
154
155 ASImage *ret = PNGBuff2ASimage((CARD8 *)raw.Data(), &params);
156 return ret;
157}
ROOT::R::TRInterface & r
Definition Object.C:4
char * ret
Definition Rotated.cxx:221
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
Definition RtypesCore.h:60
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
Definition RtypesCore.h:68
bool Bool_t
Boolean (0=false, 1=true) (bool).
Definition RtypesCore.h:77
#define popen_flags
if(name) objname
@ kExecutePermission
Definition TSystem.h:53
externTSystem * gSystem
Definition TSystem.h:582
TASImagePlugin(const char *ext)
TString fGsExe
path to GhostScript interpreter
Definition TASPluginGS.h:28
~TASPluginGS() override
dtor
TASPluginGS(const char *ext)
ctor
ASImage * File2ASImage(const char *filename) override
read PS/EPS/PDF file and convert it to ASImage
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:1084
Basic string class.
Definition TString.h:138
void ToLower()
Change string to lower-case.
Definition TString.cxx:1189
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
Definition TString.cxx:1170
const char * Data() const
Definition TString.h:384
TString & Append(const char *cs)
Definition TString.h:581
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Definition TString.cxx:2385
TLine * line
void CallRecursiveRemoveIfNeeded(TObject &obj)
call RecursiveRemove for obj if gROOT is valid and obj.TestBit(kMustCleanup) is true.
Definition TROOT.h:406