111 WaterMark(QGraphicsItem *parent =
nullptr)
112 : QGraphicsItem(parent)
118 inline void setType(Type t)
122 inline Type getType()
const
126 inline void setLayoutType(Layout l)
130 inline void setScaleFactor(qreal scale)
132 mScaleFactor = scale;
134 void setImage(
const QImage &img);
135 inline void setText(
const QString str)
140 inline void setFont(
const QFont &f)
144 inline QFont getFont()
const
148 inline void setColor(
const QColor &c)
152 inline QColor getColor()
const
156 inline void setBoundingRect(
const QRectF &rect)
158 qreal rotate = rotation();
161 brectPolygon = mapToScene(brect);
162 qreal width = brect.width();
163 qreal height = brect.height();
165 qreal maxDis = qSqrt(qPow(width, 2) + qPow(height, 2));
166 twoPolygon = mapToScene(QRectF(QPointF(brect.center().x() - maxDis / 2, brect.center().y() - maxDis / 2), QSizeF(maxDis, maxDis)));
167 setTransformOriginPoint(brect.center());
170 QRectF boundingRect()
const override
172 return mapToScene(brect.toRect()).boundingRect();
174 inline QPolygonF itemMaxPolygon()
const
178 void paint(QPainter *painter,
const QStyleOptionGraphicsItem *item, QWidget *widget)
override;
179 void updatePicture(QPainter *painter,
bool isPreview);
181 void setNumberUpScale(
const qreal &value);
184 QPainterPath itemClipPath()
const;
190 QImage graySourceImage;
193 qreal mScaleFactor = 1.0;
194 QGraphicsTextItem textItem;
198 qreal numberUpScale = 1;
200 QPolygonF brectPolygon;
201 QPolygonF twoPolygon;
249 enum RefreshMode { RefreshImmediately,
254 void populateScene();
255 void updatePreview();
256 void generatePreview();
258 void print(
bool printAsPicture =
false);
259 void updatePageByPagePrintVector(QVector<int> &pageVector, QList<const QPicture *> &pictures)
const;
260 void asynPrint(
const QPointF &leftTop,
const QRect &pageRect,
const QVector<int> &pageVector);
261 void syncPrint(
const QPointF &leftTop,
const QRect &pageRect,
const QVector<int> &pageVector);
262 void printAsImage(
const QSize &paperSize, QVector<int> &pageVector);
263 void printSinglePageDrawUtil(QPainter *painter,
const QSize &translateSize,
const QPointF &leftTop,
const QImage &waterImage,
const QPicture *picture);
264 void printMultiPageDrawUtil(QPainter *painter,
const QPointF &leftTop,
const QImage &waterImage);
266 void setPageRangeAll();
267 void setCurrentPage(
int page);
269 int targetPage(
int page);
270 int index2page(
int index);
271 int page2index(
int page);
272#if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0)
273 D_DECL_DEPRECATED
void impositionPages();
275 int impositionPages(DPrintPreviewWidget::Imposition im);
276 QImage generateWaterMarkImage()
const;
277 PrintOptions printerOptions();
282 void generatePreviewPicture();
283 void calculateNumberUpPage();
284 void calculateNumberPagePosition();
286 void updateNumberUpContent();
287 QVector<int> requestPages(
int page);
288 void releaseImpositionData();
290 void displayWaterMarkItem();
291 void calculateNumberPageScale();
292 void calculateCurrentNumberPage();
294 QByteArray foundColorModelByCups()
const;
297 inline void setCurrentPageNumber(
int page)
299 currentPageNumber = page;
303 QGraphicsScene *scene;
305 QList<QPicture> targetPictures;
306 QList<const QPicture *> pictures;
307 QList<QGraphicsItem *> pages;
308 QGraphicsRectItem *background;
310 QVector<int> pageRange;
311 int currentPageNumber = 0;
312 DPrinter::ColorMode colorMode;
313 DPrintPreviewWidget::Imposition imposition;
314 DPrintPreviewWidget::Order order;
316 DPrintPreviewWidget::PageRange pageRangeMode = DPrintPreviewWidget::AllPage;
317#if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0)
318 D_DECL_DEPRECATED
bool reviewChanged =
true;
321 RefreshMode refreshMode;
323 QString printFromPath;
324 DPrintPreviewWidget::PrintMode printMode;
326 QVector<int> previewPages;
327 bool asynPreviewNeedUpdate;
328 int asynPreviewTotalPage;
329 int pageCopyCount = 0;
334 QBasicTimer updateTimer;
342 NumberItem(QVector<int> _pageNumberVector, QVector<QPointF> _numberPointVector, QRect _pageRect)
343 : numberVector(_pageNumberVector)
344 , numberPointVector(_numberPointVector)
346 brect = QRectF(QPointF(0, 0), QSizeF(_pageRect.size()));
347 setCacheMode(DeviceCoordinateCache);
348 setPos(_pageRect.topLeft());
351 inline void setPageNumbers(
const QVector<int> &pageNumber)
353 numberVector = pageNumber;
356 inline void setNumberPositon(
const QVector<QPointF> &numberPos)
358 numberPointVector = numberPos;
361 QRectF boundingRect()
const override
366 void setRect(
const QRectF &rect)
368 setPos(rect.topLeft());
369 brect = QRectF(QPointF(0, 0), QSizeF(rect.size()));
372 void paint(QPainter *painter,
const QStyleOptionGraphicsItem *item, QWidget *widget)
override;
376 QVector<int> numberVector;
377 QVector<QPointF> numberPointVector;
381 WaterMark::Layout layout;
382 WaterMark::Type type;
393 QVector<QPair<int, const QPicture *>> previewPictures;
394 QVector<QPointF> paintPoints;
398 QPointF pageStartPoint;
399 QList<WaterMark *> waterList;
402 QGraphicsRectItem *waterParentItem;
403 bool needRecreateWater;
411 pageStartPoint = QPointF(0, 0);
414 QVector<QPointF> updatePositions(
const qreal &scale)
416#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
417 QRectF pageRect = parent->previewPrinter->pageLayout().paintRectPixels(parent->previewPrinter->resolution());
419 QRectF pageRect = parent->previewPrinter->pageRect();
421 QVector<QPointF> posList;
422 QPointF startP(0, 0);
426 topLeft = QPointF(0, 0);
427 if ((parent->imposition == DPrintPreviewWidget::OneRowTwoCol) || (parent->imposition == DPrintPreviewWidget::TwoRowThreeCol)) {
428 topLeft.setY(pageStartPoint.y() * (scale - 1.0));
431 topLeft.setX(pageRect.width() * (1.0 - scale) / 2.0);
432 topLeft.setY((NUMBERUP_SCALE_RATIO * rowCount - NUMBERUP_SPACE_SCALE_RATIO) * pageRect.height() * scaleRatio * (1.0 - scale) / 2.0);
435 switch (parent->order) {
436 case DPrintPreviewWidget::Copy:
437 case DPrintPreviewWidget::L2R_T2B: {
438 startP = pageStartPoint + topLeft;
439 for (
int i = 0; i < rowCount; ++i) {
440 for (
int j = 0; j < columnCount; ++j) {
441 posList.append(startP + QPointF(NUMBERUP_SCALE_RATIO * j * pageRect.width(), NUMBERUP_SCALE_RATIO * i * pageRect.height()) * scaleRatio * scale);
446 case DPrintPreviewWidget::R2L_T2B: {
447 qreal expanding = scale > 1 ? pageRect.width() * (scale - 1) : 0;
448 startP = pageStartPoint - QPointF(topLeft.x() - expanding - pageRect.width(), -topLeft.y());
449 for (
int i = 0; i < rowCount; ++i) {
450 for (
int j = 0; j < columnCount; ++j) {
451 posList.append(startP - QPointF((NUMBERUP_SCALE_RATIO * j + 1) * pageRect.width(), -(NUMBERUP_SCALE_RATIO * i) * pageRect.height()) * scaleRatio * scale);
455 case DPrintPreviewWidget::T2B_L2R: {
456 startP = pageStartPoint + topLeft;
457 for (
int i = 0; i < columnCount; ++i) {
458 for (
int j = 0; j < rowCount; ++j) {
459 posList.append(startP + QPointF(NUMBERUP_SCALE_RATIO * i * pageRect.width(), NUMBERUP_SCALE_RATIO * j * pageRect.height()) * scaleRatio * scale);
463 case DPrintPreviewWidget::T2B_R2L: {
464 qreal expanding = scale > 1 ? pageRect.width() * (scale - 1) : 0;
465 startP = pageStartPoint - QPointF(topLeft.x() - expanding - pageRect.width(), -topLeft.y());
466 for (
int i = 0; i < columnCount; ++i) {
467 for (
int j = 0; j < rowCount; ++j) {
468 posList.append(startP - QPointF((NUMBERUP_SCALE_RATIO * i + 1) * pageRect.width(), -(NUMBERUP_SCALE_RATIO * j) * pageRect.height()) * scaleRatio * scale);
477 void setWaterMarksScale(qreal scale)
479 if (waterList.isEmpty())
481#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
482 QRectF pageRect = parent->previewPrinter->pageLayout().paintRectPixels(parent->previewPrinter->resolution());
484 QRectF pageRect = parent->previewPrinter->pageRect();
486 QMargins pageMargins = parent->previewPrinter->pageLayout().marginsPixels(parent->previewPrinter->resolution());
487 const QVector<QPointF> &posList = updatePositions(scale);
489 for (
int c = 0; c < waterList.count(); ++c) {
490 WaterMark *item = waterList.at(c);
491 item->setBoundingRect(QRectF(QPointF(pageMargins.left(), pageMargins.top()) + posList.at(c), pageRect.size() * scaleRatio * scale));
496 numberItem->update();
499 void setWaterMarkOriginProperties(WaterMark *wm)
501 if (!wm || !waterProperty)
504 wm->type = waterProperty->type;
505 wm->layout = waterProperty->layout;
506 wm->mScaleFactor = waterProperty->scale;
507 wm->color = waterProperty->color;
508 wm->text = waterProperty->text;
509 wm->sourceImage = waterProperty->sourceImage;
510 wm->graySourceImage = waterProperty->grayImage;
511 wm->font = waterProperty->font;
512 wm->setRotation(waterProperty->rotation);
513 wm->setOpacity(waterProperty->opacity);
516 void copyWaterMarkProperties()
520 if (!parent->waterMark && waterList.isEmpty())
524 if (waterList.isEmpty()) {
525 wm = parent->waterMark;
527 wm = waterList.first();
531 waterProperty =
new WaterMarkProperty;
533 waterProperty->type = wm->type;
534 waterProperty->layout = wm->layout;
535 waterProperty->rotation = wm->rotation();
536 waterProperty->scale = wm->mScaleFactor;
537 waterProperty->opacity = wm->opacity();
538 waterProperty->color = wm->color;
539 waterProperty->text = wm->text;
540 waterProperty->sourceImage = wm->sourceImage;
541 waterProperty->grayImage = wm->graySourceImage;
542 waterProperty->font = wm->font;
545 void updateWaterMarks()
547 if (waterList.isEmpty())
550 for (
auto *item : std::as_const(waterList))
555 void setWaterMarkProperty(T outFunction)
557 if (waterList.isEmpty())
560 auto *firstWm = waterList.first();
561 outFunction(firstWm);
563 for (
auto *item : std::as_const(waterList)) {
568 item->type = firstWm->type;
569 item->layout = firstWm->layout;
570 item->mScaleFactor = firstWm->mScaleFactor;
571 item->color = firstWm->color;
572 item->text = firstWm->text;
573 item->sourceImage = firstWm->sourceImage;
574 item->graySourceImage = firstWm->graySourceImage;
575 item->font = firstWm->font;
576 item->setRotation(firstWm->rotation());
577 item->setOpacity(firstWm->opacity());
581 NumberUpData(DPrintPreviewWidgetPrivate *parent)
587 , pageStartPoint(0, 0)
588 , waterProperty(nullptr)
589 , numberItem(nullptr)
590 , waterParentItem(nullptr)
591 , needRecreateWater(false)
598 delete waterProperty;
600 delete waterParentItem;