QLineF ImageView::widgetCutterLine(int const line_idx) const { QRectF const widget_rect(virtualToWidget().mapRect(virtualDisplayRect())); QRectF reduced_widget_rect(reducedWidgetArea()); reduced_widget_rect.setLeft(widget_rect.left()); reduced_widget_rect.setRight(widget_rect.right()); // The reason we restore original left and right boundaries is that // we want to allow cutter handles to go off-screen horizontally // but not vertically. QLineF line( customInscribedCutterLine( widgetLayout().cutterLine(line_idx), reduced_widget_rect ) ); if (m_handleInteractors[line_idx][1].interactionInProgress(interactionState())) { line.setP1(virtualToWidget().map(virtualCutterLine(line_idx).p1())); } else if (m_handleInteractors[line_idx][0].interactionInProgress(interactionState())) { line.setP2(virtualToWidget().map(virtualCutterLine(line_idx).p2())); } return line; }
void PictureZoneEditor::schedulePictureMaskRebuild() { if (!m_pictureMaskRebuildTimer.isActive() || m_potentialPictureMaskXform != virtualToWidget()) { if (m_ptrMaskTransformTask.get()) { m_ptrMaskTransformTask->cancel(); m_ptrMaskTransformTask.reset(); } m_potentialPictureMaskXform = virtualToWidget(); } m_pictureMaskRebuildTimer.start(); }
void PictureZoneEditor::paintOverPictureMask(QPainter& painter) { painter.setRenderHint(QPainter::Antialiasing); painter.setTransform(imageToVirtual() * virtualToWidget(), true); painter.setPen(Qt::NoPen); painter.setBrush(QColor(mask_color)); #ifndef Q_WS_X11 // That's how it's supposed to be. painter.setCompositionMode(QPainter::CompositionMode_Clear); #else // QPainter::CompositionMode_Clear doesn't work for arbitrarily shaped // objects on X11, as well as CompositionMode_Source with a transparent // brush. Fortunately, CompositionMode_DestinationOut with a non-transparent // brush does actually work. painter.setCompositionMode(QPainter::CompositionMode_DestinationOut); #endif typedef PictureLayerProperty PLP; // First pass: ERASER1 BOOST_FOREACH(EditableZoneSet::Zone const& zone, m_zones) { if (zone.properties()->locateOrDefault<PLP>()->layer() == PLP::ERASER1) { painter.drawPolygon(zone.spline()->toPolygon(), Qt::WindingFill); } } painter.setCompositionMode(QPainter::CompositionMode_SourceOver); // Second pass: PAINTER2 BOOST_FOREACH (EditableZoneSet::Zone const& zone, m_zones) { if (zone.properties()->locateOrDefault<PLP>()->layer() == PLP::PAINTER2) { painter.drawPolygon(zone.spline()->toPolygon(), Qt::WindingFill); } } #ifndef Q_WS_X11 // That's how it's supposed to be. painter.setCompositionMode(QPainter::CompositionMode_Clear); #else // QPainter::CompositionMode_Clear doesn't work for arbitrarily shaped // objects on X11, as well as CompositionMode_Source with a transparent // brush. Fortunately, CompositionMode_DestinationOut with a non-transparent // brush does actually work. painter.setCompositionMode(QPainter::CompositionMode_DestinationOut); #endif // Third pass: ERASER1 BOOST_FOREACH (EditableZoneSet::Zone const& zone, m_zones) { if (zone.properties()->locateOrDefault<PLP>()->layer() == PLP::ERASER3) { painter.drawPolygon(zone.spline()->toPolygon(), Qt::WindingFill); } } }
QPointF ImageView::rightPageCenter() const { QRectF left_rect(m_virtLayout.leftPageOutline().boundingRect()); QRectF right_rect(m_virtLayout.rightPageOutline().boundingRect()); double const x_mid = 0.5 * (left_rect.right() + right_rect.left()); left_rect.setRight(x_mid); right_rect.setLeft(x_mid); return virtualToWidget().map(right_rect.center()); }
QLineF ImageView::edgePosition(int const edge) const { QRectF const r(virtualToWidget().mapRect(m_contentRect)); if (edge == TOP) { return QLineF(r.topLeft(), r.topRight()); } else if (edge == BOTTOM) { return QLineF(r.bottomLeft(), r.bottomRight()); } else if (edge == LEFT) { return QLineF(r.topLeft(), r.bottomLeft()); } else { return QLineF(r.topRight(), r.bottomRight()); } }
QLineF ImageView::virtualCutterLine(int line_idx) const { QRectF const virt_rect(virtualDisplayRect()); QRectF widget_rect(virtualToWidget().mapRect(virt_rect)); double const delta = 0.5 * m_handlePixmap.width(); widget_rect.adjust(0.0, delta, 0.0, -delta); QRectF reduced_virt_rect(widgetToVirtual().mapRect(widget_rect)); reduced_virt_rect.setLeft(virt_rect.left()); reduced_virt_rect.setRight(virt_rect.right()); // The reason we restore original left and right boundaries is that // we want to allow cutter handles to go off-screen horizontally // but not vertically. return customInscribedCutterLine( m_virtLayout.cutterLine(line_idx), reduced_virt_rect ); }
void ImageView::cornerMoveRequest(int edge_mask, QPointF const& pos) { QRectF r(virtualToWidget().mapRect(m_contentRect)); qreal const minw = m_minBoxSize.width(); qreal const minh = m_minBoxSize.height(); if (edge_mask & TOP) { r.setTop(std::min(pos.y(), r.bottom() - minh)); } else if (edge_mask & BOTTOM) { r.setBottom(std::max(pos.y(), r.top() + minh)); } if (edge_mask & LEFT) { r.setLeft(std::min(pos.x(), r.right() - minw)); } else if (edge_mask & RIGHT) { r.setRight(std::max(pos.x(), r.left() + minw)); } forceInsideImage(r, edge_mask); m_contentRect = widgetToVirtual().mapRect(r); update(); }
bool PictureZoneEditor::validateScreenPictureMask() const { return !m_screenPictureMask.isNull() && m_screenPictureMaskXform == virtualToWidget(); }
PageLayout ImageView::widgetLayout() const { return m_virtLayout.transformed(virtualToWidget()); }