]> git.lyx.org Git - lyx.git/blob - src/convert/lyxconvert.cpp
Add missing check for Qt version when using QPdfWriter class
[lyx.git] / src / convert / lyxconvert.cpp
1 /*
2 set cflags=`env PKG_CONFIG_PATH=/usr/local/qt5/lib/pkgconfig pkg-config --cflags Qt5Widgets`
3 set libs=`env PKG_CONFIG_PATH=/usr/local/qt5/lib/pkgconfig pkg-config --libs --static Qt5Widgets`
4 g++ -std=gnu++11 $cflags lyxconvert.cpp -o lyxconvert $libs
5 */
6 #include <iostream>
7 #include <QApplication>
8 #include <QImage>
9 #include <QFile>
10 #include <QPainter>
11 #if (QT_VERSION >= 0x050300)
12 #include <QPdfWriter>
13 #endif
14
15
16 const char * basename(const char * name)
17 {
18 #ifdef Q_OS_WIN
19         const char * slashpos = strrchr(name, '\\');
20 #else
21         const char * slashpos = strrchr(name, '/');
22 #endif
23
24         if (NULL != slashpos) name = ++slashpos ;
25         return name;
26 }
27
28
29 void usage(const char * name)
30 {
31         std::cerr << "Usage: " << name
32                 << " [-f infmt] [-t outfmt] input output" << std::endl;
33         exit(1);
34 }
35
36
37 void version(const char * name)
38 {
39         std::cerr << name << ": version 1.0" << std::endl;
40         exit(0);
41 }
42
43
44 bool isFileExt(const char * name, const char * ext)
45 {
46         const char * dotpos = strrchr(name, '.');
47         return NULL != dotpos && !strcmp(++dotpos, ext);
48 }
49
50
51 int main(int argc, char **argv)
52 {
53         int arg = 1;
54         const char * iformat  = NULL;
55         const char * oformat  = NULL;
56         const char * infile   = NULL;
57         const char * outfile  = NULL;
58         const char * myname   = basename(argv[0]);
59         char * qtargs[] = {
60                 argv[0],
61                 (char*)"-platform", (char*)"minimal",
62                 NULL };
63         int  qtargsc = sizeof(qtargs) / sizeof(qtargs[0]) - 1;
64         bool debug = (1 == 0);
65
66         while (arg < argc) {
67                 if ('-' == argv[arg][0] && !strcmp(argv[arg], "-platform")) {
68                         qtargs[2] = argv[++arg]; arg++ ;
69                 } else if ('-' == argv[arg][0] && 'f' == argv[arg][1]) {
70                         iformat = argv[++arg]; arg++ ;
71                 } else if ('-' == argv[arg][0] && 't' == argv[arg][1]) {
72                         oformat = argv[++arg]; arg++ ;
73                 } else if ('-' == argv[arg][0] && 'd' == argv[arg][1]) {
74                         debug = (1 == 1); arg++;
75                 } else if ('-' == argv[arg][0] && 'V' == argv[arg][1]) {
76                         version(myname);
77                 } else if ('-' == argv[arg][0]) {
78                         usage(myname);
79                 } else if (NULL == infile) {
80                         infile = argv[arg++];
81                 } else if (NULL == outfile) {
82                         outfile = argv[arg++];
83                         if (NULL == oformat) {
84                                 if (isFileExt(outfile, "pdf")) {
85                                         oformat = "pdf";
86                                 } else if (isFileExt(outfile, "eps")) {
87                                         oformat = "eps";
88                                 }
89                         }
90                 } else {
91                         usage(myname);
92                 }
93         }
94         if (NULL == infile || NULL == outfile) {
95                 usage(myname);
96         }
97
98         QApplication app(qtargsc, &qtargs[0]);
99         QFile ifile(QString::fromLocal8Bit(infile));
100         QImage img;
101
102         if (debug) {
103                 std::cerr << myname << ": platform is " << (NULL == qtargs[2] ? "default" : qtargs[2]) << std::endl;
104         }
105
106         if (debug) {
107                 std::cerr << myname << ": Load file '" << infile <<
108                         "', infmt is '" << (NULL == iformat ? "auto" : iformat) << "'" << std::endl;
109         }
110         if (!ifile.exists()) {
111                 std::cerr << myname << ": Image file '" << infile << "' doesn't exist" << std::endl;
112                 return 2;
113         } else if (!img.load(ifile.fileName(), iformat)) {
114                 std::cerr << myname << ": Cannot load image '" << infile << "'" << std::endl;
115                 return 3;
116         }
117
118         if (debug) {
119                 std::cerr << myname << ": Save converted image to file '" << outfile <<
120                         "', outfmt is '" << (NULL == oformat ? "auto" : oformat) << "'" << std::endl;
121         }
122         if (NULL != oformat && !strcmp(oformat, "eps")) {
123                 std::cerr << myname << ": Conversion of images to format '" << oformat << "' is not supported" << std::endl;
124                 return 4;
125         } else if (NULL != oformat && !strcmp(oformat, "pdf")) {
126 #if (QT_VERSION >= 0x050300)
127                 QSize size = img.size();
128                 QPdfWriter pdfwriter(QString::fromLocal8Bit(outfile));
129                 int dpi = pdfwriter.logicalDpiX();
130                 QPageSize pagesize(size * qreal(72.0 / dpi));
131                 QMarginsF margins(0, 0, 0, 0);
132                 QPageLayout pagelayout(pagesize, QPageLayout::Portrait, margins);
133                 pdfwriter.setPageLayout(pagelayout);
134                 QPainter painter(&pdfwriter);
135                 painter.drawImage(0, 0, img);
136                 painter.end();
137 #else
138                 std::cerr << myname << ": Conversion of images to format '" << oformat << "' is not supported" << std::endl;
139                 return 4;
140 #endif
141         } else if (!img.save(QString::fromLocal8Bit(outfile), oformat)) {
142                 std::cerr << myname << ": Cannot save converted image to '" << outfile << "'" << std::endl;
143                 return 5;
144         }
145         return 0;
146 }
147