1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 #include "api_imageexport.h"
8 #include "scribusview.h"
9 #include "utils.h"
10 #include "util.h"
11
ImageExport()12 ImageExport::ImageExport() : QObject(COLLECTOR)
13 {
14 qDebug() << "ImageExport loaded";
15 setObjectName("ImageExport");
16 _dpi = 72;
17 _quality = -1;
18 _scale = 100.0;
19 _name = QDir::currentPath();
20 _type = QString("PNG");
21 _overwrite = false;
22 }
23
ImageExport(QString dirName,QString type,double scale,double quality,double dpi,bool overwrite)24 ImageExport::ImageExport(QString dirName, QString type, double scale, double quality, double dpi, bool overwrite)
25 {
26 setDir(dirName);
27 setType(type);
28 setScale(scale);
29 setQuality(quality);
30 setDPI(dpi);
31 setOverWrite(overwrite);
32 }
33
getType()34 QString ImageExport::getType()
35 {
36 return _type;
37 }
38
setType(QString type)39 void ImageExport::setType(QString type)
40 {
41 if (type.isEmpty())
42 RAISE("The image type cannot be empty string.");
43 _type = type;
44 }
45
getScale()46 double ImageExport::getScale()
47 {
48 return _scale;
49 }
50
setScale(double scale)51 void ImageExport::setScale(double scale)
52 {
53 _scale = scale;
54 }
55
getQuality()56 double ImageExport::getQuality()
57 {
58 return _quality;
59 }
60
setQuality(double quality)61 void ImageExport::setQuality(double quality)
62 {
63 _quality = quality;
64 }
65
getDPI()66 double ImageExport::getDPI()
67 {
68 return _dpi;
69 }
70
setDPI(double dpi)71 void ImageExport::setDPI(double dpi)
72 {
73 _dpi = dpi;
74 }
75
getDir()76 QString ImageExport::getDir()
77 {
78 return _name;
79 }
80
setDir(QString name)81 void ImageExport::setDir(QString name)
82 {
83 if (name.isEmpty())
84 {
85 RAISE("The directory name should not be empty string.");
86 }
87
88
89 _name = QDir::fromNativeSeparators(name);
90
91 QFileInfo fi(_name);
92 if(!fi.isDir())
93 {
94 RAISE("The target location must be an existing directory");
95 }
96
97 if(!fi.isWritable())
98 {
99 RAISE("The target location must be writable");
100 }
101 }
102
isOverWrite()103 bool ImageExport::isOverWrite()
104 {
105 return _overwrite;
106 }
107
getFileName(ScribusDoc * doc,uint pageNr)108 QString ImageExport::getFileName(ScribusDoc* doc, uint pageNr)
109 {
110 return QDir::cleanPath(QDir::toNativeSeparators(_name + "/" + getFileNameByPage(doc, pageNr, _type.toLower())));
111 }
112
exportPage(ScribusDoc * doc,uint pageNr,bool single=true)113 bool ImageExport::exportPage(ScribusDoc* doc, uint pageNr, bool single = true)
114 {
115 uint over = 0;
116 bool saved = false, doFileSave = true;
117 QString fileName(getFileName(doc, pageNr));
118
119 if (!doc->Pages->at(pageNr))
120 return false;
121 ScPage* page = doc->Pages->at(pageNr);
122
123 /* a little magic here - I need to compute the "maxGr" value...
124 * We need to know the right size of the page for landscape,
125 * portrait and user defined sizes.
126 */
127 double pixmapSize = (page->height() > page->width()) ? page->height() : page->width();
128 QImage im(doc->view()->PageToPixmap(pageNr, qRound(pixmapSize * _scale * (_dpi / 72.0) / 100.0), false));
129 if (im.isNull())
130 {
131 RAISE("Insufficient memory for this image size.");
132 return false;
133 }
134 int dpm = qRound(100.0 / 2.54 * _dpi);
135 im.setDotsPerMeterY(dpm);
136 im.setDotsPerMeterX(dpm);
137 if (QFile::exists(fileName) && !overwrite)
138 {
139 RAISE("File exists and overwrite is set to false");
140 }
141 if (doFileSave)
142 saved = im.save(fileName, _type.toLocal8Bit().constData(), _quality);
143 if (!saved && doFileSave)
144 {
145 RAISE("Error writing the output file(s).");
146 }
147 return saved;
148 }
149
exportInterval(ScribusDoc * doc,std::vector<int> & pageNs)150 bool ImageExport::exportInterval(ScribusDoc* doc, std::vector< int > &pageNs)
151 {
152 for (uint a = 0; a < pageNs.size(); ++a)
153 {
154 if (!exportPage(doc, pageNs[a]-1, false))
155 return false;
156 }
157 return true;
158 }
159
setOverWrite(bool value)160 void ImageExport::setOverWrite(bool value)
161 {
162 _overwrite = value;
163 }
164
~ImageExport()165 ImageExport::~ImageExport()
166 {
167 qDebug() << "ImageExport deleted";
168 }
169