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