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 
8 #include "outputpreviewbase.h"
9 #include "sccolor.h"
10 #include "sccolorengine.h"
11 #include "scribusdoc.h"
12 #include "scribusview.h"
13 #include "ui_outputpreviewbase.h"
14 
OutputPreviewBase(QWidget * parent,ScribusDoc * doc)15 OutputPreviewBase::OutputPreviewBase(QWidget* parent, ScribusDoc* doc) :
16 	m_doc(doc)
17 {
18 	m_uiBase = new Ui::OutputPreviewBase();
19 	m_uiBase->setupUi(this);
20 
21 	m_previewLabel = new QLabel(this);
22 	m_previewLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
23 	m_uiBase->scrollArea->setWidget(m_previewLabel);
24 
25 	m_uiBase->scaleBox->setCurrentIndex(1);
26 
27 	m_uiBase->pageSelector->setMaximum(m_doc->DocPages.count());
28 	m_uiBase->pageSelector->setGUIForPage(m_doc->currentPage()->pageNr());
29 }
30 
~OutputPreviewBase()31 OutputPreviewBase::~OutputPreviewBase()
32 {
33 	delete m_uiBase;
34 }
35 
jumpToPage(int num)36 void OutputPreviewBase::jumpToPage(int num)
37 {
38 	int pageIndex = num - 1;
39 	if (pageIndex == m_currentPage)
40 		return;
41 
42 	QPixmap previewPix = createPreview(pageIndex, qRound(72 * m_scaleFactor));
43 	m_previewLabel->setPixmap(previewPix);
44 	m_previewLabel->resize(previewPix.size());
45 }
46 
redisplay()47 void OutputPreviewBase::redisplay()
48 {
49 	QPixmap previewPix = createPreview(m_currentPage, qRound(72 * m_scaleFactor));
50 	m_previewLabel->setPixmap(previewPix);
51 	m_previewLabel->resize(previewPix.size());
52 }
53 
onScaleBoxValueChanged(int value)54 void OutputPreviewBase::onScaleBoxValueChanged(int value)
55 {
56 	double scaleX = 1.0;
57 	double scaleY = 1.0;
58 
59 	switch (value)
60 	{
61 		case 0:
62 			m_scaleFactor = 0.5;
63 			break;
64 		case 1:
65 			m_scaleFactor = 1.0;
66 			break;
67 		case 2:
68 			m_scaleFactor = 1.5;
69 			break;
70 		case 3:
71 			m_scaleFactor = 2.0;
72 			break;
73 		case 4:
74 			m_scaleFactor = m_uiBase->scrollArea->viewport()->width() / m_doc->Pages->at(m_currentPage)->width();
75 			break;
76 		case 5:
77 			m_scaleFactor = m_uiBase->scrollArea->viewport()->height() / m_doc->Pages->at(m_currentPage)->height();
78 			break;
79 		case 6:
80 			scaleX = m_uiBase->scrollArea->viewport()->width() / m_doc->Pages->at(m_currentPage)->width();
81 			scaleY = m_uiBase->scrollArea->viewport()->height() / m_doc->Pages->at(m_currentPage)->height();
82 			m_scaleFactor = qMin(scaleX, scaleY);
83 			break;
84 		default:
85 			m_scaleFactor = 1.0;
86 			break;
87 	}
88 
89 	redisplay();
90 }
91 
resizeEvent(QResizeEvent * event)92 void OutputPreviewBase::resizeEvent(QResizeEvent * event)
93 {
94 	QDialog::resizeEvent(event);
95 	int scaleIndex = m_uiBase->scaleBox->currentIndex();
96 	// Repaint only for "fit to" options in the combo box
97 	if (scaleIndex <= 3)
98 		return;
99 	// HACK: m_scaleMode is reset to insane value to force redraw
100 	// as the value is checked for change.
101 	//m_scaleMode = -1;
102 	onScaleBoxValueChanged(scaleIndex);
103 }
104 
blendImages(QImage & target,ScImage & scSource,const ScColor & col)105 void OutputPreviewBase::blendImages(QImage &target, ScImage &scSource, const ScColor& col)
106 {
107 	QImage source = scSource.qImage(); // FIXME: this will not work once qImage always returns ARGB!
108 
109 	//FIXME: if source and target have different size something went wrong.
110 	// eg. loadPicture() failed and returned a 1x1 image
111 	CMYKColor cmykValues;
112 	int w = qMin(target.width(), source.width());
113 	int h = qMin(target.height(), source.height());
114 	int cyan, c, m, yc, k, cc, mm, yy, kk;
115 	ScColorEngine::getCMYKValues(col, m_doc, cmykValues);
116 	cmykValues.getValues(c, m, yc, k);
117 	for (int y = 0; y < h; ++y )
118 	{
119 		QRgb *p = (QRgb *) target.scanLine(y);
120 		QRgb *pq = (QRgb *) source.scanLine(y);
121 		for (int x = 0; x < w; ++x )
122 		{
123 			cyan = 255 - qRed(*pq);
124 			if (cyan != 0)
125 			{
126 				(c == 0) ? cc = qRed(*p) : cc = qMin(c * cyan / 255 + qRed(*p), 255);
127 				(m == 0) ? mm = qGreen(*p) : mm = qMin(m * cyan / 255 + qGreen(*p), 255);
128 				(yc == 0) ? yy = qBlue(*p) : yy = qMin(yc * cyan / 255 + qBlue(*p), 255);
129 				(k == 0) ? kk = qAlpha(*p) : kk = qMin(k * cyan / 255 + qAlpha(*p), 255);
130 				*p = qRgba(cc, mm, yy, kk);
131 			}
132 			p++;
133 			pq++;
134 		}
135 	}
136 }
137 
blendImagesSumUp(QImage & target,ScImage & scSource)138 void OutputPreviewBase::blendImagesSumUp(QImage &target, ScImage &scSource)
139 {
140 	 // FIXME: this will not work once qImage always returns ARGB!
141 	QImage source = scSource.qImage();
142 
143 	//FIXME: if source and target have different sizesomething went wrong.
144 	// eg. loadPicture() failed and returned a 1x1 image
145 	int w = qMin(target.width(), source.width());
146 	int h = qMin(target.height(), source.height());
147 	int cyan;
148 	for (int y = 0; y < h; ++y )
149 	{
150 		uint *p = (QRgb *) target.scanLine(y);
151 		QRgb *pq = (QRgb *) source.scanLine(y);
152 		for (int x = 0; x < w; ++x )
153 		{
154 			cyan = 255 - qRed(*pq);
155 			*p += cyan;
156 			p++;
157 			pq++;
158 		}
159 	}
160 }