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 }