summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-01-25 20:54:29 +0000
committerCarl Hetherington <cth@carlh.net>2013-01-25 20:54:29 +0000
commit9e92f4742708e8b1516623647ee458211fdd68c1 (patch)
tree484d1bb636788df7c7b2aa1b9a4232d964007b7c /src
parent97b0f3af79c79ac4b9273e93090ef41753faba6c (diff)
Fix signalling of wxChoices that used to be ComboBoxes. Use Size a little more. Show any padding of films into larger frames in the preview (#33).
Diffstat (limited to 'src')
-rw-r--r--src/lib/format.cc9
-rw-r--r--src/lib/format.h3
-rw-r--r--src/wx/config_dialog.cc2
-rw-r--r--src/wx/film_editor.cc10
-rw-r--r--src/wx/film_viewer.cc64
-rw-r--r--src/wx/film_viewer.h11
6 files changed, 69 insertions, 30 deletions
diff --git a/src/lib/format.cc b/src/lib/format.cc
index 088a16059..6615e16e0 100644
--- a/src/lib/format.cc
+++ b/src/lib/format.cc
@@ -147,6 +147,9 @@ FixedFormat::FixedFormat (int r, libdcp::Size dcp, string id, string n, string d
}
+/** @return Number of pixels (int the DCP image) to pad either side of the film
+ * (so there are dcp_padding() pixels on the left and dcp_padding() on the right)
+ */
int
Format::dcp_padding (shared_ptr<const Film> f) const
{
@@ -160,6 +163,12 @@ Format::dcp_padding (shared_ptr<const Film> f) const
return p;
}
+float
+Format::container_ratio_as_float () const
+{
+ return static_cast<float> (_dcp_size.width) / _dcp_size.height;
+}
+
VariableFormat::VariableFormat (libdcp::Size dcp, string id, string n, string d)
: Format (dcp, id, n, d)
{
diff --git a/src/lib/format.h b/src/lib/format.h
index b4c691e56..783ff25ce 100644
--- a/src/lib/format.h
+++ b/src/lib/format.h
@@ -46,6 +46,9 @@ public:
/** @return the ratio as a floating point number */
virtual float ratio_as_float (boost::shared_ptr<const Film> f) const = 0;
+ /** @return the ratio of the container (including any padding) as a floating point number */
+ float container_ratio_as_float () const;
+
int dcp_padding (boost::shared_ptr<const Film> f) const;
/** @return size in pixels of the images that we should
diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc
index 99527ffe7..b656a5278 100644
--- a/src/wx/config_dialog.cc
+++ b/src/wx/config_dialog.cc
@@ -151,7 +151,7 @@ ConfigDialog::ConfigDialog (wxWindow* parent)
_default_dci_metadata_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (ConfigDialog::edit_default_dci_metadata_clicked), 0, this);
_reference_scaler->SetSelection (Scaler::as_index (config->reference_scaler ()));
- _reference_scaler->Connect (wxID_ANY, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler (ConfigDialog::reference_scaler_changed), 0, this);
+ _reference_scaler->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (ConfigDialog::reference_scaler_changed), 0, this);
pair<string, string> p = Filter::ffmpeg_strings (config->reference_filters ());
_reference_filters->SetLabel (std_to_wx (p.first + " " + p.second));
diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc
index 1e5765ae8..f058afa54 100644
--- a/src/wx/film_editor.cc
+++ b/src/wx/film_editor.cc
@@ -177,7 +177,7 @@ FilmEditor::connect_to_widgets ()
_name->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (FilmEditor::name_changed), 0, this);
_use_dci_name->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::use_dci_name_toggled), 0, this);
_edit_dci_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::edit_dci_button_clicked), 0, this);
- _format->Connect (wxID_ANY, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler (FilmEditor::format_changed), 0, this);
+ _format->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::format_changed), 0, this);
_content->Connect (wxID_ANY, wxEVT_COMMAND_FILEPICKER_CHANGED, wxCommandEventHandler (FilmEditor::content_changed), 0, this);
_trust_content_header->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::trust_content_header_changed), 0, this);
_left_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::left_crop_changed), 0, this);
@@ -185,7 +185,7 @@ FilmEditor::connect_to_widgets ()
_top_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::top_crop_changed), 0, this);
_bottom_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::bottom_crop_changed), 0, this);
_filters_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::edit_filters_clicked), 0, this);
- _scaler->Connect (wxID_ANY, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler (FilmEditor::scaler_changed), 0, this);
+ _scaler->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::scaler_changed), 0, this);
_dcp_content_type->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::dcp_content_type_changed), 0, this);
_dcp_ab->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::dcp_ab_toggled), 0, this);
_still_duration->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::still_duration_changed), 0, this);
@@ -194,10 +194,10 @@ FilmEditor::connect_to_widgets ()
_with_subtitles->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::with_subtitles_toggled), 0, this);
_subtitle_offset->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::subtitle_offset_changed), 0, this);
_subtitle_scale->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::subtitle_scale_changed), 0, this);
- _colour_lut->Connect (wxID_ANY, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler (FilmEditor::colour_lut_changed), 0, this);
+ _colour_lut->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::colour_lut_changed), 0, this);
_j2k_bandwidth->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::j2k_bandwidth_changed), 0, this);
- _subtitle_stream->Connect (wxID_ANY, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler (FilmEditor::subtitle_stream_changed), 0, this);
- _audio_stream->Connect (wxID_ANY, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler (FilmEditor::audio_stream_changed), 0, this);
+ _subtitle_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::subtitle_stream_changed), 0, this);
+ _audio_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::audio_stream_changed), 0, this);
_audio_gain->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::audio_gain_changed), 0, this);
_audio_gain_calculate_button->Connect (
wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::audio_gain_calculate_button_clicked), 0, this
diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc
index e014a8731..16b3ccd9a 100644
--- a/src/wx/film_viewer.cc
+++ b/src/wx/film_viewer.cc
@@ -50,11 +50,8 @@ FilmViewer::FilmViewer (shared_ptr<Film> f, wxWindow* p)
, _panel (new wxPanel (this))
, _slider (new wxSlider (this, wxID_ANY, 0, 0, 4096))
, _play_button (new wxToggleButton (this, wxID_ANY, wxT ("Play")))
+ , _display_frame_x (0)
, _got_frame (false)
- , _out_width (0)
- , _out_height (0)
- , _panel_width (0)
- , _panel_height (0)
, _clear_required (false)
{
_panel->SetDoubleBuffered (true);
@@ -195,14 +192,21 @@ FilmViewer::paint_panel (wxPaintEvent &)
_clear_required = false;
}
- if (!_display_frame || !_film || !_out_width || !_out_height) {
+ if (!_display_frame || !_film || !_out_size.width || !_out_size.height) {
dc.Clear ();
return;
}
- wxImage frame (_out_width, _out_height, _display_frame->data()[0], true);
+ if (_display_frame_x) {
+ dc.SetPen(*wxBLACK_PEN);
+ dc.SetBrush(*wxBLACK_BRUSH);
+ dc.DrawRectangle (0, 0, _display_frame_x, _film_size.height);
+ dc.DrawRectangle (_display_frame_x + _film_size.width, 0, _display_frame_x * 2 + _film_size.width, _film_size.height);
+ }
+
+ wxImage frame (_film_size.width, _film_size.height, _display_frame->data()[0], true);
wxBitmap frame_bitmap (frame);
- dc.DrawBitmap (frame_bitmap, 0, 0);
+ dc.DrawBitmap (frame_bitmap, _display_frame_x, 0);
if (_film->with_subtitles() && _display_sub) {
wxImage sub (_display_sub->size().width, _display_sub->size().height, _display_sub->data()[0], _display_sub->alpha(), true);
@@ -231,8 +235,8 @@ FilmViewer::slider_moved (wxScrollEvent &)
void
FilmViewer::panel_sized (wxSizeEvent& ev)
{
- _panel_width = ev.GetSize().GetWidth();
- _panel_height = ev.GetSize().GetHeight();
+ _panel_size.width = ev.GetSize().GetWidth();
+ _panel_size.height = ev.GetSize().GetHeight();
calculate_sizes ();
update_from_raw ();
}
@@ -253,7 +257,7 @@ FilmViewer::update_from_raw ()
void
FilmViewer::raw_to_display ()
{
- if (!_raw_frame || _out_width < 64 || _out_height < 64 || !_film) {
+ if (!_raw_frame || _out_size.width < 64 || _out_size.height < 64 || !_film) {
return;
}
@@ -263,7 +267,7 @@ FilmViewer::raw_to_display ()
}
/* Get a compacted image as we have to feed it to wxWidgets */
- _display_frame = _raw_frame->scale_and_convert_to_rgb (libdcp::Size (_out_width, _out_height), 0, _film->scaler(), false);
+ _display_frame = _raw_frame->scale_and_convert_to_rgb (_film_size, 0, _film->scaler(), false);
if (old_size != _display_frame->size()) {
_clear_required = true;
@@ -271,13 +275,14 @@ FilmViewer::raw_to_display ()
if (_raw_sub) {
Rect tx = subtitle_transformed_area (
- float (_out_width) / _film->size().width,
- float (_out_height) / _film->size().height,
+ float (_film_size.width) / _film->size().width,
+ float (_film_size.height) / _film->size().height,
_raw_sub->area(), _film->subtitle_offset(), _film->subtitle_scale()
);
_display_sub.reset (new RGBPlusAlphaImage (_raw_sub->image()->scale (tx.size(), _film->scaler(), false)));
_display_sub_position = tx.position();
+ _display_sub_position.x += _display_frame_x;
} else {
_display_sub.reset ();
}
@@ -289,17 +294,36 @@ FilmViewer::calculate_sizes ()
if (!_film) {
return;
}
+
+ Format const * format = _film->format ();
- float const panel_ratio = static_cast<float> (_panel_width) / _panel_height;
- float const film_ratio = _film->format() ? _film->format()->ratio_as_float(_film) : 1.78;
+ float const panel_ratio = static_cast<float> (_panel_size.width) / _panel_size.height;
+ float const film_ratio = format ? format->container_ratio_as_float () : 1.78;
+
if (panel_ratio < film_ratio) {
/* panel is less widscreen than the film; clamp width */
- _out_width = _panel_width;
- _out_height = _out_width / film_ratio;
+ _out_size.width = _panel_size.width;
+ _out_size.height = _out_size.width / film_ratio;
} else {
- /* panel is more widescreen than the film; clamp heignt */
- _out_height = _panel_height;
- _out_width = _out_height * film_ratio;
+ /* panel is more widescreen than the film; clamp height */
+ _out_size.height = _panel_size.height;
+ _out_size.width = _out_size.height * film_ratio;
+ }
+
+ /* Work out how much padding there is in terms of our display; this will be the x position
+ of our _display_frame.
+ */
+ _display_frame_x = 0;
+ if (format) {
+ _display_frame_x = static_cast<float> (format->dcp_padding (_film)) * _out_size.width / format->dcp_size().width;
+ }
+
+ _film_size = _out_size;
+ _film_size.width -= _display_frame_x * 2;
+
+ /* Catch silly values */
+ if (_out_size.width < 64) {
+ _out_size.width = 64;
}
}
diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h
index c6b5e7c0c..456301eb4 100644
--- a/src/wx/film_viewer.h
+++ b/src/wx/film_viewer.h
@@ -69,14 +69,17 @@ private:
boost::shared_ptr<Image> _raw_frame;
boost::shared_ptr<Subtitle> _raw_sub;
boost::shared_ptr<Image> _display_frame;
+ int _display_frame_x;
boost::shared_ptr<RGBPlusAlphaImage> _display_sub;
Position _display_sub_position;
bool _got_frame;
- int _out_width;
- int _out_height;
- int _panel_width;
- int _panel_height;
+ /** Size of our output (including padding if we have any) */
+ libdcp::Size _out_size;
+ /** Size that we will make our film (equal to _out_size unless we have padding) */
+ libdcp::Size _film_size;
+ /** Size of the panel that we have available */
+ libdcp::Size _panel_size;
bool _clear_required;
};