Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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();
}
Exemplo n.º 3
0
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);
		}
	}
}
Exemplo n.º 4
0
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());
}
Exemplo n.º 5
0
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());
	}
}
Exemplo n.º 6
0
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
	);
}
Exemplo n.º 7
0
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();
}
Exemplo n.º 8
0
bool
PictureZoneEditor::validateScreenPictureMask() const
{
	return !m_screenPictureMask.isNull() && m_screenPictureMaskXform == virtualToWidget();
}
Exemplo n.º 9
0
PageLayout
ImageView::widgetLayout() const
{
	return m_virtLayout.transformed(virtualToWidget());
}