From 7398cd3f1cedb2b96890841f6a09c195f7aa3b62 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 19 Dec 2019 15:59:51 +1100 Subject: [PATCH] use viewer resolution/transform override to show cropping/stretching settings --- app/dialog/export/export.cpp | 43 ++++++++++++++++++++++++++++ app/dialog/export/export.h | 4 +++ app/dialog/export/exportvideotab.cpp | 6 ++-- app/dialog/export/exportvideotab.h | 6 ++++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index 9c59f58fe..60f6d1c89 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -145,6 +145,7 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : connect(video_tab_->width_slider(), SIGNAL(ValueChanged(int64_t)), this, SLOT(ResolutionChanged())); connect(video_tab_->height_slider(), SIGNAL(ValueChanged(int64_t)), this, SLOT(ResolutionChanged())); + connect(video_tab_->scaling_method_combobox(), SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateViewerDimensions())); connect(video_tab_->maintain_aspect_checkbox(), SIGNAL(toggled(bool)), this, SLOT(ResolutionChanged())); connect(video_tab_->codec_combobox(), SIGNAL(currentIndexChanged(int)), this, SLOT(VideoCodecChanged())); connect(video_tab_, SIGNAL(DisplayChanged(const QString&)), preview_viewer_, SLOT(SetOCIODisplay(const QString&))); @@ -155,6 +156,11 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : preview_viewer_->ConnectViewerNode(viewer_node_); preview_viewer_->SetColorMenuEnabled(false); preview_viewer_->SetOCIOParameters(video_tab_->CurrentOCIODisplay(), video_tab_->CurrentOCIOView(), video_tab_->CurrentOCIOLook()); + + // Update renderer + // FIXME: This is going to be VERY slow since it will need to hash every single frame. It would be better to have a + // the renderer save the map as some sort of file that this can load. + viewer_node_->InvalidateCache(0, viewer_node_->Length(), viewer_node_->texture_input()); } void ExportDialog::BrowseFilename() @@ -219,6 +225,8 @@ void ExportDialog::ResolutionChanged() // Enable scaling method combobox only if width/height are not equal to sequence size video_tab_->scaling_method_combobox()->setEnabled(!qFuzzyCompare(current_ratio, video_aspect_ratio_)); } + + UpdateViewerDimensions(); } void ExportDialog::VideoCodecChanged() @@ -312,3 +320,38 @@ void ExportDialog::SetDefaultFilename() QString file_location = QDir(doc_location).filePath("export"); filename_edit_->setText(file_location); } + +QMatrix4x4 ExportDialog::GenerateMatrix(ExportVideoTab::ScalingMethod method, int source_width, int source_height, int dest_width, int dest_height) +{ + QMatrix4x4 preview_matrix; + + if (method == ExportVideoTab::kStretch) { + return preview_matrix; + } + + float export_ar = static_cast(dest_width) / static_cast(dest_height); + float source_ar = static_cast(source_width) / static_cast(source_height); + + if (qFuzzyCompare(export_ar, source_ar)) { + return preview_matrix; + } + + if ((export_ar > source_ar) == (method == ExportVideoTab::kFit)) { + preview_matrix.scale(source_ar / export_ar, 1.0F); + } else { + preview_matrix.scale(1.0F, export_ar / source_ar); + } + + return preview_matrix; +} + +void ExportDialog::UpdateViewerDimensions() +{ + preview_viewer_->SetOverrideSize(video_tab_->width_slider()->GetValue(), video_tab_->height_slider()->GetValue()); + + preview_viewer_->SetMatrix(GenerateMatrix(static_cast(video_tab_->scaling_method_combobox()->currentData().toInt()), + viewer_node_->video_params().width(), + viewer_node_->video_params().height(), + video_tab_->width_slider()->GetValue(), + video_tab_->height_slider()->GetValue())); +} diff --git a/app/dialog/export/export.h b/app/dialog/export/export.h index da3f1e164..bc4eacd09 100644 --- a/app/dialog/export/export.h +++ b/app/dialog/export/export.h @@ -22,6 +22,8 @@ private: void LoadPresets(); void SetDefaultFilename(); + QMatrix4x4 GenerateMatrix(ExportVideoTab::ScalingMethod method, int source_width, int source_height, int dest_width, int height); + ViewerOutput* viewer_node_; QList formats_; @@ -76,6 +78,8 @@ private slots: void VideoCodecChanged(); + void UpdateViewerDimensions(); + }; #endif // EXPORTDIALOG_H diff --git a/app/dialog/export/exportvideotab.cpp b/app/dialog/export/exportvideotab.cpp index 69fcacb2c..32adfda83 100644 --- a/app/dialog/export/exportvideotab.cpp +++ b/app/dialog/export/exportvideotab.cpp @@ -114,9 +114,9 @@ QWidget* ExportVideoTab::SetupResolutionSection() scaling_method_combobox_ = new QComboBox(); scaling_method_combobox_->setEnabled(false); - scaling_method_combobox_->addItem(tr("Fit")); - scaling_method_combobox_->addItem(tr("Stretch")); - scaling_method_combobox_->addItem(tr("Crop")); + scaling_method_combobox_->addItem(tr("Fit"), kFit); + scaling_method_combobox_->addItem(tr("Stretch"), kStretch); + scaling_method_combobox_->addItem(tr("Crop"), kCrop); layout->addWidget(scaling_method_combobox_, row, 1); row++; diff --git a/app/dialog/export/exportvideotab.h b/app/dialog/export/exportvideotab.h index 99bb9ff96..4baa8bd46 100644 --- a/app/dialog/export/exportvideotab.h +++ b/app/dialog/export/exportvideotab.h @@ -15,6 +15,12 @@ class ExportVideoTab : public QWidget public: ExportVideoTab(ColorManager* color_manager, QWidget* parent = nullptr); + enum ScalingMethod { + kFit, + kStretch, + kCrop + }; + QComboBox* codec_combobox() const; IntegerSlider* width_slider() const;