[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kdenlive/Applications/16.12] /: Fix monitor scene not adapting to zoom (rotoscoping, composite, ...
From: Jean-Baptiste Mardelle <jb () kdenlive ! org>
Date: 2016-12-02 13:32:44
Message-ID: E1cCnxE-0007Sd-7n () code ! kde ! org
[Download RAW message or body]
Git commit baabfafe6fa546ce968a4eb523d1e1f3b2db2f81 by Jean-Baptiste Mardelle.
Committed on 02/12/2016 at 13:32.
Pushed by mardelle into branch 'Applications/16.12'.
Fix monitor scene not adapting to zoom (rotoscoping, composite, ...)
Fix crash in rotoscoping
BUG: 373113
M +6 -2 data/kdenlivemonitorcornerscene.qml
M +6 -2 data/kdenlivemonitoreffectscene.qml
M +6 -2 data/kdenlivemonitorrotoscene.qml
M +8 -8 src/monitor/glwidget.cpp
M +2 -2 src/monitor/glwidget.h
M +14 -2 src/monitor/monitor.cpp
M +2 -0 src/monitor/monitor.h
M +20 -14 src/onmonitoritems/rotoscoping/rotowidget.cpp
https://commits.kde.org/kdenlive/baabfafe6fa546ce968a4eb523d1e1f3b2db2f81
diff --git a/data/kdenlivemonitorcornerscene.qml \
b/data/kdenlivemonitorcornerscene.qml index 94d2976..9a05939 100644
--- a/data/kdenlivemonitorcornerscene.qml
+++ b/data/kdenlivemonitorcornerscene.qml
@@ -17,6 +17,10 @@ Item {
property double sourcedar : 1
onScalexChanged: canvas.requestPaint()
onScaleyChanged: canvas.requestPaint()
+ property double offsetx : 0
+ property double offsety : 0
+ onOffsetxChanged: canvas.requestPaint()
+ onOffsetyChanged: canvas.requestPaint()
onSourcedarChanged: refreshdar()
property bool iskeyframe
property int requestedKeyFrame
@@ -131,8 +135,8 @@ Item {
property color hoverColor: "#ff0000"
width: root.profile.x * root.scalex
height: root.profile.y * root.scaley
- x: root.center.x - width / 2
- y: root.center.y - height / 2
+ x: root.center.x - width / 2 - root.offsetx
+ y: root.center.y - height / 2 - root.offsety
color: "transparent"
border.color: "#ffffff00"
}
diff --git a/data/kdenlivemonitoreffectscene.qml \
b/data/kdenlivemonitoreffectscene.qml index f7a833f..bf6ae81 100644
--- a/data/kdenlivemonitoreffectscene.qml
+++ b/data/kdenlivemonitoreffectscene.qml
@@ -13,8 +13,12 @@ Item {
property point center
property double scalex
property double scaley
+ property double offsetx : 0
+ property double offsety : 0
onScalexChanged: canvas.requestPaint()
onScaleyChanged: canvas.requestPaint()
+ onOffsetxChanged: canvas.requestPaint()
+ onOffsetyChanged: canvas.requestPaint()
property bool iskeyframe
property int requestedKeyFrame
property var centerPoints: []
@@ -133,8 +137,8 @@ Item {
property color hoverColor: "#ff0000"
width: root.profile.x * root.scalex
height: root.profile.y * root.scaley
- x: root.center.x - width / 2
- y: root.center.y - height / 2
+ x: root.center.x - width / 2 - root.offsetx;
+ y: root.center.y - height / 2 - root.offsety;
color: "transparent"
border.color: "#ffffff00"
}
diff --git a/data/kdenlivemonitorrotoscene.qml b/data/kdenlivemonitorrotoscene.qml
index b707775..ff9648d 100644
--- a/data/kdenlivemonitorrotoscene.qml
+++ b/data/kdenlivemonitorrotoscene.qml
@@ -16,6 +16,10 @@ Item {
property double scaley : 1
property double stretch : 1
property double sourcedar : 1
+ property double offsetx : 0
+ property double offsety : 0
+ onOffsetxChanged: canvas.requestPaint()
+ onOffsetyChanged: canvas.requestPaint()
onScalexChanged: canvas.requestPaint()
onScaleyChanged: canvas.requestPaint()
onSourcedarChanged: refreshdar()
@@ -155,8 +159,8 @@ Item {
property color hoverColor: "#ff0000"
width: root.profile.x * root.scalex
height: root.profile.y * root.scaley
- x: root.center.x - width / 2
- y: root.center.y - height / 2
+ x: root.center.x - width / 2 - root.offsetx
+ y: root.center.y - height / 2 - root.offsety
color: "transparent"
border.color: "#ffffff00"
}
diff --git a/src/monitor/glwidget.cpp b/src/monitor/glwidget.cpp
index 6c4427a..9b8f1e7 100644
--- a/src/monitor/glwidget.cpp
+++ b/src/monitor/glwidget.cpp
@@ -1142,22 +1142,22 @@ void GLWidget::mouseDoubleClickEvent(QMouseEvent * event)
event->accept();
}
-void GLWidget::setOffsetX(int x)
+void GLWidget::setOffsetX(int x, int max)
{
m_offset.setX(x);
emit offsetChanged();
+ if (rootObject()) {
+ rootObject()->setProperty("offsetx", m_zoom > 1.0f ? x - max / 2.0 - 10: 0);
+ }
update();
}
-void GLWidget::setOffsetY(int y)
+void GLWidget::setOffsetY(int y, int max)
{
m_offset.setY(y);
- emit offsetChanged();
- // TODO: pass scrollbar offset for qml view
- /*if (rootObject()) {
- double scaley = (double) m_rect.width() / (((double) \
m_monitorProfile->height() * m_monitorProfile->dar() / m_monitorProfile->width())) / \
m_monitorProfile->width() * m_zoom;
- rootObject()->setProperty("offsety", y / scaley );
- }*/
+ if (rootObject()) {
+ rootObject()->setProperty("offsety", m_zoom > 1.0f ? y - max / 2.0 - 10: 0);
+ }
update();
}
diff --git a/src/monitor/glwidget.h b/src/monitor/glwidget.h
index 203f228..592e23c 100644
--- a/src/monitor/glwidget.h
+++ b/src/monitor/glwidget.h
@@ -103,8 +103,8 @@ protected:
public slots:
void setZoom(float zoom);
- void setOffsetX(int x);
- void setOffsetY(int y);
+ void setOffsetX(int x, int max);
+ void setOffsetY(int y, int max);
void slotSwitchAudioOverlay(bool enable);
void slotZoomScene(double value);
void initializeGL();
diff --git a/src/monitor/monitor.cpp b/src/monitor/monitor.cpp
index c10dd11..3e25684 100644
--- a/src/monitor/monitor.cpp
+++ b/src/monitor/monitor.cpp
@@ -182,8 +182,8 @@ Monitor::Monitor(Kdenlive::MonitorId id, MonitorManager *manager, \
QWidget *paren m_horizontalScroll = new QScrollBar(Qt::Horizontal);
glayout->addWidget(m_horizontalScroll, 1, 0);
m_horizontalScroll->hide();
- connect(m_horizontalScroll, SIGNAL(valueChanged(int)), m_glMonitor, \
SLOT(setOffsetX(int)));
- connect(m_verticalScroll, SIGNAL(valueChanged(int)), m_glMonitor, \
SLOT(setOffsetY(int))); + connect(m_horizontalScroll, &QScrollBar::valueChanged, \
this, &Monitor::setOffsetX); + connect(m_verticalScroll, \
&QScrollBar::valueChanged, this, &Monitor::setOffsetY);
connect(m_glMonitor, SIGNAL(frameDisplayed(const SharedFrame&)), this, \
SLOT(onFrameDisplayed(const SharedFrame&)));
connect(m_glMonitor, SIGNAL(mouseSeek(int,int)), this, \
SLOT(slotMouseSeek(int,int))); connect(m_glMonitor, SIGNAL(monitorPlay()), this, \
SLOT(slotPlay())); @@ -370,6 +370,16 @@ Monitor::~Monitor()
delete render;
}
+void Monitor::setOffsetX(int x)
+{
+ m_glMonitor->setOffsetX(x, m_horizontalScroll->maximum());
+}
+
+void Monitor::setOffsetY(int y)
+{
+ m_glMonitor->setOffsetY(y, m_verticalScroll->maximum());
+}
+
void Monitor::slotGetCurrentImage(bool request)
{
m_glMonitor->sendFrameForAnalysis = request;
@@ -735,6 +745,8 @@ void Monitor::setZoom()
if (m_glMonitor->zoom() == 1.0f) {
m_horizontalScroll->hide();
m_verticalScroll->hide();
+ m_glMonitor->setOffsetX(m_horizontalScroll->value(), \
m_horizontalScroll->maximum()); + \
m_glMonitor->setOffsetY(m_verticalScroll->value(), m_verticalScroll->maximum()); } \
else { adjustScrollBars(0.5f, 0.5f);
}
diff --git a/src/monitor/monitor.h b/src/monitor/monitor.h
index d8469e3..3067bae 100644
--- a/src/monitor/monitor.h
+++ b/src/monitor/monitor.h
@@ -270,6 +270,8 @@ private slots:
void slotUpdateQmlTimecode(const QString &tc);
/** @brief There was an error initializing Movit */
void gpuError();
+ void setOffsetX(int x);
+ void setOffsetY(int y);
public slots:
void slotOpenDvdFile(const QString &);
diff --git a/src/onmonitoritems/rotoscoping/rotowidget.cpp \
b/src/onmonitoritems/rotoscoping/rotowidget.cpp index c8ddc20..8fc2daa 100644
--- a/src/onmonitoritems/rotoscoping/rotowidget.cpp
+++ b/src/onmonitoritems/rotoscoping/rotowidget.cpp
@@ -335,29 +335,35 @@ void RotoWidget::setupTrackingListen(const ItemInfo &info)
// TODO: track effects
return;
}
+ Mlt::Producer *clip = NULL;
+ if (info.track == 0) {
+ clip = m_monitor->render->getProducer();
+ } else {
+ Mlt::Service \
service(m_monitor->render->getProducer()->parent().get_service()); + \
Mlt::Tractor tractor(service); + Mlt::Producer \
trackProducer(tractor.track(info.track)); + Mlt::Playlist \
trackPlaylist((mlt_playlist) trackProducer.get_service()); + clip = \
trackPlaylist.get_clip_at((int)info.startPos.frames(KdenliveSettings::project_fps()));
+ }
- Mlt::Service service(m_monitor->render->getProducer()->parent().get_service());
- Mlt::Tractor tractor(service);
- Mlt::Producer trackProducer(tractor.track(tractor.count() - info.track - 1));
- Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
-
- Mlt::Producer *clip = \
trackPlaylist.get_clip_at((int)info.startPos.frames(KdenliveSettings::project_fps()));
if (!clip) {
return;
}
int i = 0;
- Mlt::Filter *filter = clip->filter(0);
- while (filter) {
- if (strcmp(filter->get("kdenlive_id"), "rotoscoping") == 0) {
- m_filter = filter;
- filter->listen("tracking-finished", this, \
(mlt_listener)tracking_finished); + Mlt::Service service(*clip);
+ for (int ix = 0; ix < service.filter_count(); ++ix) {
+ QScopedPointer<Mlt::Filter> effect(service.filter(ix));
+ QString id = effect->get("kdenlive_id");
+ if (id == QLatin1String("rotoscoping")) {
+ m_filter = service.filter(ix);
+ m_filter->listen("tracking-finished", this, \
(mlt_listener)tracking_finished); break;
}
- filter = clip->filter(++i);
}
-
- delete clip;
+ if (info.track > 0) {
+ delete clip;
+ }
}
void RotoWidget::setSpline(const QByteArray &spline, bool notify)
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic