subtitles: implemented very basic renderer

This commit is contained in:
itsmattkc
2022-05-08 14:45:43 -07:00
parent 197f94f8d6
commit bdb917c591
7 changed files with 146 additions and 4 deletions
+76 -3
View File
@@ -37,8 +37,10 @@
#include "common/define.h"
#include "common/functiontimer.h"
#include "common/html.h"
#include "common/qtutils.h"
#include "config/config.h"
#include "core.h"
#include "node/block/subtitle/subtitle.h"
#include "node/gizmo/path.h"
#include "node/gizmo/point.h"
#include "node/gizmo/polygon.h"
@@ -59,6 +61,8 @@ ViewerDisplayWidget::ViewerDisplayWidget(QWidget *parent) :
gizmos_(nullptr),
current_gizmo_(nullptr),
gizmo_drag_started_(false),
show_subtitles_(true),
subtitle_tracks_(nullptr),
hand_dragging_(false),
deinterlace_(false),
show_fps_(false),
@@ -189,6 +193,21 @@ void ViewerDisplayWidget::SetTime(const rational &time)
}
}
void ViewerDisplayWidget::SetSubtitleTracks(Sequence *list)
{
if (subtitle_tracks_) {
disconnect(subtitle_tracks_, &Sequence::SubtitlesChanged, this, &ViewerDisplayWidget::SubtitlesChanged);
}
subtitle_tracks_ = list;
if (subtitle_tracks_) {
connect(subtitle_tracks_, &Sequence::SubtitlesChanged, this, &ViewerDisplayWidget::SubtitlesChanged);
}
update();
}
QPointF ViewerDisplayWidget::TransformViewerSpaceToBufferSpace(const QPointF &pos)
{
/*
@@ -582,6 +601,53 @@ void ViewerDisplayWidget::OnPaint()
}
}
}
// Extraordinarily basic subtitle renderer. Hoping to swap this out with libass at some point.
if (show_subtitles_ && subtitle_tracks_) {
const QVector<Track*> &subtitle_tracklist = subtitle_tracks_->track_list(Track::kSubtitle)->GetTracks();
if (!subtitle_tracklist.empty()) {
QPainter p(inner_widget());
QTransform transform = GenerateWorldTransform();
QRect bounding_box = transform.mapRect(rect());
bounding_box.adjust(bounding_box.width()/10, bounding_box.height()/10, -bounding_box.width()/10, -bounding_box.height()/10);
QFont f = p.font();
int font_sz = bounding_box.height() / 18;
f.setStyleHint(QFont::SansSerif);
f.setFamily(f.defaultFamily());
f.setPointSize(font_sz);
f.setWeight(QFont::Bold);
p.setFont(f);
p.setPen(Qt::white);
QPainterPath path;
int text_line = 1;
for (int j=subtitle_tracklist.size()-1; j>=0; j--) {
Track *sub_track = subtitle_tracklist.at(j);
if (!sub_track->IsMuted()) {
if (SubtitleBlock *sub = dynamic_cast<SubtitleBlock*>(sub_track->BlockAtTime(time_))) {
// Split into lines
QStringList list = QtUtils::WordWrapString(sub->GetText(), p.fontMetrics(), bounding_box.width());
for (int i=list.size()-1; i>=0; i--) {
int w = QtUtils::QFontMetricsWidth(p.fontMetrics(), list.at(i));
path.addText(bounding_box.x() + bounding_box.width()/2 - w/2, bounding_box.y() + bounding_box.height() - p.fontMetrics().height() * text_line + p.fontMetrics().ascent(), p.font(), list.at(i));
text_line++;
}
}
}
}
p.setPen(QPen(Qt::black, font_sz / 16));
p.setBrush(Qt::white);
p.drawPath(path);
}
}
}
void ViewerDisplayWidget::OnDestroy()
@@ -618,12 +684,12 @@ QPointF ViewerDisplayWidget::GetTexturePosition(const double &x, const double &y
y / gizmo_params_.height());
}
void ViewerDisplayWidget::DrawTextWithCrudeShadow(QPainter *painter, const QRect &rect, const QString &text)
void ViewerDisplayWidget::DrawTextWithCrudeShadow(QPainter *painter, const QRect &rect, const QString &text, const QTextOption &opt)
{
painter->setPen(Qt::black);
painter->drawText(rect.adjusted(1, 1, 0, 0), text);
painter->drawText(rect.adjusted(1, 1, 0, 0), text, opt);
painter->setPen(Qt::white);
painter->drawText(rect, text);
painter->drawText(rect, text, opt);
}
rational ViewerDisplayWidget::GetGizmoTime()
@@ -807,4 +873,11 @@ void ViewerDisplayWidget::TextEditChanged()
gizmo->UpdateInputHtml(html, GetGizmoTime());
}
void ViewerDisplayWidget::SubtitlesChanged(const TimeRange &r)
{
if (time_ >= r.in() && time_ < r.out()) {
update();
}
}
}