From bd453939da140ea994282e1c167ea5f8d02e2d94 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 19 Jul 2013 16:08:29 +0100 Subject: Spacing tweaks; rename ImageMagick -> StillImage. --- src/lib/content_factory.cc | 6 +- src/lib/imagemagick.h | 35 ----------- src/lib/imagemagick_content.cc | 112 ----------------------------------- src/lib/imagemagick_content.h | 52 ---------------- src/lib/imagemagick_decoder.cc | 87 --------------------------- src/lib/imagemagick_decoder.h | 43 -------------- src/lib/imagemagick_examiner.cc | 63 -------------------- src/lib/imagemagick_examiner.h | 41 ------------- src/lib/player.cc | 18 +++--- src/lib/playlist.cc | 4 +- src/lib/playlist.h | 4 +- src/lib/still_image.h | 35 +++++++++++ src/lib/still_image_content.cc | 112 +++++++++++++++++++++++++++++++++++ src/lib/still_image_content.h | 52 ++++++++++++++++ src/lib/still_image_decoder.cc | 87 +++++++++++++++++++++++++++ src/lib/still_image_decoder.h | 44 ++++++++++++++ src/lib/still_image_examiner.cc | 63 ++++++++++++++++++++ src/lib/still_image_examiner.h | 41 +++++++++++++ src/lib/wscript | 6 +- src/wx/config_dialog.cc | 2 +- src/wx/dci_metadata_dialog.cc | 2 +- src/wx/film_editor.cc | 10 ++-- src/wx/film_viewer.cc | 2 +- src/wx/gain_calculator_dialog.cc | 2 +- src/wx/imagemagick_content_dialog.cc | 70 ---------------------- src/wx/imagemagick_content_dialog.h | 36 ----------- src/wx/new_film_dialog.cc | 2 +- src/wx/properties_dialog.cc | 2 +- src/wx/repeat_dialog.cc | 2 +- src/wx/still_image_content_dialog.cc | 70 ++++++++++++++++++++++ src/wx/still_image_content_dialog.h | 36 +++++++++++ src/wx/wscript | 2 +- src/wx/wx_util.h | 1 + 33 files changed, 573 insertions(+), 571 deletions(-) delete mode 100644 src/lib/imagemagick.h delete mode 100644 src/lib/imagemagick_content.cc delete mode 100644 src/lib/imagemagick_content.h delete mode 100644 src/lib/imagemagick_decoder.cc delete mode 100644 src/lib/imagemagick_decoder.h delete mode 100644 src/lib/imagemagick_examiner.cc delete mode 100644 src/lib/imagemagick_examiner.h create mode 100644 src/lib/still_image.h create mode 100644 src/lib/still_image_content.cc create mode 100644 src/lib/still_image_content.h create mode 100644 src/lib/still_image_decoder.cc create mode 100644 src/lib/still_image_decoder.h create mode 100644 src/lib/still_image_examiner.cc create mode 100644 src/lib/still_image_examiner.h delete mode 100644 src/wx/imagemagick_content_dialog.cc delete mode 100644 src/wx/imagemagick_content_dialog.h create mode 100644 src/wx/still_image_content_dialog.cc create mode 100644 src/wx/still_image_content_dialog.h (limited to 'src') diff --git a/src/lib/content_factory.cc b/src/lib/content_factory.cc index cf45b6aa6..bf447641d 100644 --- a/src/lib/content_factory.cc +++ b/src/lib/content_factory.cc @@ -19,7 +19,7 @@ #include #include "ffmpeg_content.h" -#include "imagemagick_content.h" +#include "still_image_content.h" #include "sndfile_content.h" using std::string; @@ -34,8 +34,8 @@ content_factory (shared_ptr film, shared_ptr node) if (type == "FFmpeg") { content.reset (new FFmpegContent (film, node)); - } else if (type == "ImageMagick") { - content.reset (new ImageMagickContent (film, node)); + } else if (type == "StillImage") { + content.reset (new StillImageContent (film, node)); } else if (type == "Sndfile") { content.reset (new SndfileContent (film, node)); } diff --git a/src/lib/imagemagick.h b/src/lib/imagemagick.h deleted file mode 100644 index 5a1712a3a..000000000 --- a/src/lib/imagemagick.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - Copyright (C) 2012 Carl Hetherington - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -class ImageMagickContent; - -class ImageMagick -{ -public: - ImageMagick (boost::shared_ptr c) - : _imagemagick_content (c) - {} - - boost::shared_ptr content () const { - return _imagemagick_content; - } - -protected: - boost::shared_ptr _imagemagick_content; -}; diff --git a/src/lib/imagemagick_content.cc b/src/lib/imagemagick_content.cc deleted file mode 100644 index 0c4e84015..000000000 --- a/src/lib/imagemagick_content.cc +++ /dev/null @@ -1,112 +0,0 @@ -/* - Copyright (C) 2013 Carl Hetherington - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#include -#include "imagemagick_content.h" -#include "imagemagick_examiner.h" -#include "config.h" -#include "compose.hpp" -#include "film.h" - -#include "i18n.h" - -using std::string; -using std::cout; -using std::stringstream; -using boost::shared_ptr; - -ImageMagickContent::ImageMagickContent (shared_ptr f, boost::filesystem::path p) - : Content (f, p) - , VideoContent (f, p) -{ - -} - -ImageMagickContent::ImageMagickContent (shared_ptr f, shared_ptr node) - : Content (f, node) - , VideoContent (f, node) -{ - -} - -string -ImageMagickContent::summary () const -{ - return String::compose (_("%1 [still]"), file().filename().string()); -} - -bool -ImageMagickContent::valid_file (boost::filesystem::path f) -{ - string ext = f.extension().string(); - transform (ext.begin(), ext.end(), ext.begin(), ::tolower); - return (ext == ".tif" || ext == ".tiff" || ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".bmp"); -} - -void -ImageMagickContent::as_xml (xmlpp::Node* node) const -{ - node->add_child("Type")->add_child_text ("ImageMagick"); - Content::as_xml (node); - VideoContent::as_xml (node); -} - -void -ImageMagickContent::examine (shared_ptr job) -{ - Content::examine (job); - - shared_ptr film = _film.lock (); - assert (film); - - shared_ptr examiner (new ImageMagickExaminer (film, shared_from_this())); - - take_from_video_examiner (examiner); - set_video_length (Config::instance()->default_still_length() * video_frame_rate()); -} - -void -ImageMagickContent::set_video_length (VideoContent::Frame len) -{ - { - boost::mutex::scoped_lock lm (_mutex); - _video_length = len; - } - - signal_changed (ContentProperty::LENGTH); -} - -Time -ImageMagickContent::length () const -{ - shared_ptr film = _film.lock (); - assert (film); - - FrameRateConversion frc (video_frame_rate(), film->dcp_video_frame_rate ()); - return video_length() * frc.factor() * TIME_HZ / video_frame_rate(); -} - -string -ImageMagickContent::identifier () const -{ - stringstream s; - s << VideoContent::identifier (); - s << "_" << video_length(); - return s.str (); -} diff --git a/src/lib/imagemagick_content.h b/src/lib/imagemagick_content.h deleted file mode 100644 index 50191cc5a..000000000 --- a/src/lib/imagemagick_content.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - Copyright (C) 2013 Carl Hetherington - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#ifndef DCPOMATIC_IMAGEMAGICK_CONTENT_H -#define DCPOMATIC_IMAGEMAGICK_CONTENT_H - -#include -#include "video_content.h" - -namespace cxml { - class Node; -} - -class ImageMagickContent : public VideoContent -{ -public: - ImageMagickContent (boost::shared_ptr, boost::filesystem::path); - ImageMagickContent (boost::shared_ptr, boost::shared_ptr); - - boost::shared_ptr shared_from_this () { - return boost::dynamic_pointer_cast (Content::shared_from_this ()); - }; - - void examine (boost::shared_ptr); - std::string summary () const; - void as_xml (xmlpp::Node *) const; - Time length () const; - - std::string identifier () const; - - void set_video_length (VideoContent::Frame); - - static bool valid_file (boost::filesystem::path); -}; - -#endif diff --git a/src/lib/imagemagick_decoder.cc b/src/lib/imagemagick_decoder.cc deleted file mode 100644 index ee50f3fb1..000000000 --- a/src/lib/imagemagick_decoder.cc +++ /dev/null @@ -1,87 +0,0 @@ -/* - Copyright (C) 2012-2013 Carl Hetherington - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#include -#include -#include -#include "imagemagick_content.h" -#include "imagemagick_decoder.h" -#include "image.h" -#include "film.h" -#include "exceptions.h" - -#include "i18n.h" - -using std::cout; -using boost::shared_ptr; -using libdcp::Size; - -ImageMagickDecoder::ImageMagickDecoder (shared_ptr f, shared_ptr c) - : Decoder (f) - , VideoDecoder (f) - , ImageMagick (c) -{ - -} - -void -ImageMagickDecoder::pass () -{ - if (_video_position >= _imagemagick_content->video_length ()) { - return; - } - - if (_image) { - video (_image, true, _video_position); - return; - } - - Magick::Image* magick_image = new Magick::Image (_imagemagick_content->file().string ()); - _video_size = libdcp::Size (magick_image->columns(), magick_image->rows()); - - _image.reset (new Image (PIX_FMT_RGB24, _video_size.get(), false)); - - using namespace MagickCore; - - uint8_t* p = _image->data()[0]; - for (int y = 0; y < _video_size->height; ++y) { - for (int x = 0; x < _video_size->width; ++x) { - Magick::Color c = magick_image->pixelColor (x, y); - *p++ = c.redQuantum() * 255 / QuantumRange; - *p++ = c.greenQuantum() * 255 / QuantumRange; - *p++ = c.blueQuantum() * 255 / QuantumRange; - } - } - - delete magick_image; - - video (_image, false, _video_position); -} - -void -ImageMagickDecoder::seek (VideoContent::Frame frame, bool) -{ - _video_position = frame; -} - -bool -ImageMagickDecoder::done () const -{ - return _video_position >= _imagemagick_content->video_length (); -} diff --git a/src/lib/imagemagick_decoder.h b/src/lib/imagemagick_decoder.h deleted file mode 100644 index 3e551c3b7..000000000 --- a/src/lib/imagemagick_decoder.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - Copyright (C) 2012-2013 Carl Hetherington - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#include "video_decoder.h" -#include "imagemagick.h" - -namespace Magick { - class Image; -} - -class ImageMagickContent; - -class ImageMagickDecoder : public VideoDecoder, public ImageMagick -{ -public: - ImageMagickDecoder (boost::shared_ptr, boost::shared_ptr); - - /* Decoder */ - - void pass (); - void seek (VideoContent::Frame, bool); - bool done () const; - -private: - boost::shared_ptr _image; - mutable boost::optional _video_size; -}; diff --git a/src/lib/imagemagick_examiner.cc b/src/lib/imagemagick_examiner.cc deleted file mode 100644 index 0eee0d425..000000000 --- a/src/lib/imagemagick_examiner.cc +++ /dev/null @@ -1,63 +0,0 @@ -/* - Copyright (C) 2013 Carl Hetherington - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#include -#include -#include "imagemagick_content.h" -#include "imagemagick_examiner.h" -#include "film.h" - -#include "i18n.h" - -using std::cout; -using boost::shared_ptr; - -ImageMagickExaminer::ImageMagickExaminer (shared_ptr f, shared_ptr c) - : ImageMagick (c) - , _film (f) -{ - using namespace MagickCore; - Magick::Image* image = new Magick::Image (_imagemagick_content->file().string()); - _video_size = libdcp::Size (image->columns(), image->rows()); - delete image; -} - -libdcp::Size -ImageMagickExaminer::video_size () const -{ - return _video_size; -} - -int -ImageMagickExaminer::video_length () const -{ - return _imagemagick_content->video_length (); -} - -float -ImageMagickExaminer::video_frame_rate () const -{ - boost::shared_ptr f = _film.lock (); - if (!f) { - return 24; - } - - return f->dcp_video_frame_rate (); -} - diff --git a/src/lib/imagemagick_examiner.h b/src/lib/imagemagick_examiner.h deleted file mode 100644 index 801ede442..000000000 --- a/src/lib/imagemagick_examiner.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - Copyright (C) 2013 Carl Hetherington - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#include "imagemagick.h" -#include "video_examiner.h" - -namespace Magick { - class Image; -} - -class ImageMagickContent; - -class ImageMagickExaminer : public ImageMagick, public VideoExaminer -{ -public: - ImageMagickExaminer (boost::shared_ptr, boost::shared_ptr); - - float video_frame_rate () const; - libdcp::Size video_size () const; - VideoContent::Frame video_length () const; - -private: - boost::weak_ptr _film; - libdcp::Size _video_size; -}; diff --git a/src/lib/player.cc b/src/lib/player.cc index d3d5d0f6b..1ffced425 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -22,8 +22,8 @@ #include "film.h" #include "ffmpeg_decoder.h" #include "ffmpeg_content.h" -#include "imagemagick_decoder.h" -#include "imagemagick_content.h" +#include "still_image_decoder.h" +#include "still_image_content.h" #include "sndfile_decoder.h" #include "sndfile_content.h" #include "subtitle_content.h" @@ -74,8 +74,8 @@ std::ostream& operator<<(std::ostream& s, Piece const & p) { if (dynamic_pointer_cast (p.content)) { s << "\tffmpeg "; - } else if (dynamic_pointer_cast (p.content)) { - s << "\timagemagick"; + } else if (dynamic_pointer_cast (p.content)) { + s << "\tstill image"; } else if (dynamic_pointer_cast (p.content)) { s << "\tsndfile "; } @@ -421,20 +421,20 @@ Player::setup_pieces () piece->decoder = fd; } - shared_ptr ic = dynamic_pointer_cast (*i); + shared_ptr ic = dynamic_pointer_cast (*i); if (ic) { - shared_ptr id; + shared_ptr id; - /* See if we can re-use an old ImageMagickDecoder */ + /* See if we can re-use an old StillImageDecoder */ for (list >::const_iterator j = old_pieces.begin(); j != old_pieces.end(); ++j) { - shared_ptr imd = dynamic_pointer_cast ((*j)->decoder); + shared_ptr imd = dynamic_pointer_cast ((*j)->decoder); if (imd && imd->content() == ic) { id = imd; } } if (!id) { - id.reset (new ImageMagickDecoder (_film, ic)); + id.reset (new StillImageDecoder (_film, ic)); id->Video.connect (bind (&Player::process_video, this, piece, _1, _2, _3)); } diff --git a/src/lib/playlist.cc b/src/lib/playlist.cc index c9d05b049..5ccc12b61 100644 --- a/src/lib/playlist.cc +++ b/src/lib/playlist.cc @@ -26,8 +26,8 @@ #include "video_content.h" #include "ffmpeg_decoder.h" #include "ffmpeg_content.h" -#include "imagemagick_decoder.h" -#include "imagemagick_content.h" +#include "still_image_decoder.h" +#include "still_image_content.h" #include "content_factory.h" #include "job.h" #include "config.h" diff --git a/src/lib/playlist.h b/src/lib/playlist.h index e39e9f51f..7dbf41604 100644 --- a/src/lib/playlist.h +++ b/src/lib/playlist.h @@ -29,8 +29,8 @@ class Content; class FFmpegContent; class FFmpegDecoder; -class ImageMagickContent; -class ImageMagickDecoder; +class StillImageMagickContent; +class StillImageMagickDecoder; class SndfileContent; class SndfileDecoder; class Job; diff --git a/src/lib/still_image.h b/src/lib/still_image.h new file mode 100644 index 000000000..b60069419 --- /dev/null +++ b/src/lib/still_image.h @@ -0,0 +1,35 @@ +/* + Copyright (C) 2012 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +class StillImageContent; + +class StillImage +{ +public: + StillImage (boost::shared_ptr c) + : _still_image_content (c) + {} + + boost::shared_ptr content () const { + return _still_image_content; + } + +protected: + boost::shared_ptr _still_image_content; +}; diff --git a/src/lib/still_image_content.cc b/src/lib/still_image_content.cc new file mode 100644 index 000000000..3a30ccf87 --- /dev/null +++ b/src/lib/still_image_content.cc @@ -0,0 +1,112 @@ +/* + Copyright (C) 2013 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include "still_image_content.h" +#include "still_image_examiner.h" +#include "config.h" +#include "compose.hpp" +#include "film.h" + +#include "i18n.h" + +using std::string; +using std::cout; +using std::stringstream; +using boost::shared_ptr; + +StillImageContent::StillImageContent (shared_ptr f, boost::filesystem::path p) + : Content (f, p) + , VideoContent (f, p) +{ + +} + +StillImageContent::StillImageContent (shared_ptr f, shared_ptr node) + : Content (f, node) + , VideoContent (f, node) +{ + +} + +string +StillImageContent::summary () const +{ + return String::compose (_("%1 [still]"), file().filename().string()); +} + +bool +StillImageContent::valid_file (boost::filesystem::path f) +{ + string ext = f.extension().string(); + transform (ext.begin(), ext.end(), ext.begin(), ::tolower); + return (ext == ".tif" || ext == ".tiff" || ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".bmp"); +} + +void +StillImageContent::as_xml (xmlpp::Node* node) const +{ + node->add_child("Type")->add_child_text ("StillImage"); + Content::as_xml (node); + VideoContent::as_xml (node); +} + +void +StillImageContent::examine (shared_ptr job) +{ + Content::examine (job); + + shared_ptr film = _film.lock (); + assert (film); + + shared_ptr examiner (new StillImageExaminer (film, shared_from_this())); + + take_from_video_examiner (examiner); + set_video_length (Config::instance()->default_still_length() * video_frame_rate()); +} + +void +StillImageContent::set_video_length (VideoContent::Frame len) +{ + { + boost::mutex::scoped_lock lm (_mutex); + _video_length = len; + } + + signal_changed (ContentProperty::LENGTH); +} + +Time +StillImageContent::length () const +{ + shared_ptr film = _film.lock (); + assert (film); + + FrameRateConversion frc (video_frame_rate(), film->dcp_video_frame_rate ()); + return video_length() * frc.factor() * TIME_HZ / video_frame_rate(); +} + +string +StillImageContent::identifier () const +{ + stringstream s; + s << VideoContent::identifier (); + s << "_" << video_length(); + return s.str (); +} diff --git a/src/lib/still_image_content.h b/src/lib/still_image_content.h new file mode 100644 index 000000000..02921f4e2 --- /dev/null +++ b/src/lib/still_image_content.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2013 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef DCPOMATIC_STILL_IMAGE_CONTENT_H +#define DCPOMATIC_STILL_IMAGE_CONTENT_H + +#include +#include "video_content.h" + +namespace cxml { + class Node; +} + +class StillImageContent : public VideoContent +{ +public: + StillImageContent (boost::shared_ptr, boost::filesystem::path); + StillImageContent (boost::shared_ptr, boost::shared_ptr); + + boost::shared_ptr shared_from_this () { + return boost::dynamic_pointer_cast (Content::shared_from_this ()); + }; + + void examine (boost::shared_ptr); + std::string summary () const; + void as_xml (xmlpp::Node *) const; + Time length () const; + + std::string identifier () const; + + void set_video_length (VideoContent::Frame); + + static bool valid_file (boost::filesystem::path); +}; + +#endif diff --git a/src/lib/still_image_decoder.cc b/src/lib/still_image_decoder.cc new file mode 100644 index 000000000..21cc83f54 --- /dev/null +++ b/src/lib/still_image_decoder.cc @@ -0,0 +1,87 @@ +/* + Copyright (C) 2012-2013 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include +#include +#include "still_image_content.h" +#include "still_image_decoder.h" +#include "image.h" +#include "film.h" +#include "exceptions.h" + +#include "i18n.h" + +using std::cout; +using boost::shared_ptr; +using libdcp::Size; + +StillImageDecoder::StillImageDecoder (shared_ptr f, shared_ptr c) + : Decoder (f) + , VideoDecoder (f) + , StillImage (c) +{ + +} + +void +StillImageDecoder::pass () +{ + if (_video_position >= _still_image_content->video_length ()) { + return; + } + + if (_image) { + video (_image, true, _video_position); + return; + } + + Magick::Image* magick_image = new Magick::Image (_still_image_content->file().string ()); + _video_size = libdcp::Size (magick_image->columns(), magick_image->rows()); + + _image.reset (new Image (PIX_FMT_RGB24, _video_size.get(), false)); + + using namespace MagickCore; + + uint8_t* p = _image->data()[0]; + for (int y = 0; y < _video_size->height; ++y) { + for (int x = 0; x < _video_size->width; ++x) { + Magick::Color c = magick_image->pixelColor (x, y); + *p++ = c.redQuantum() * 255 / QuantumRange; + *p++ = c.greenQuantum() * 255 / QuantumRange; + *p++ = c.blueQuantum() * 255 / QuantumRange; + } + } + + delete magick_image; + + video (_image, false, _video_position); +} + +void +StillImageDecoder::seek (VideoContent::Frame frame, bool) +{ + _video_position = frame; +} + +bool +StillImageDecoder::done () const +{ + return _video_position >= _still_image_content->video_length (); +} diff --git a/src/lib/still_image_decoder.h b/src/lib/still_image_decoder.h new file mode 100644 index 000000000..db41b0357 --- /dev/null +++ b/src/lib/still_image_decoder.h @@ -0,0 +1,44 @@ +/* + Copyright (C) 2012-2013 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "video_decoder.h" +#include "still_image.h" + +namespace Magick { + class Image; +} + +class StillImageContent; + +class StillImageDecoder : public VideoDecoder, public StillImage +{ +public: + StillImageDecoder (boost::shared_ptr, boost::shared_ptr); + + /* Decoder */ + + void pass (); + void seek (VideoContent::Frame, bool); + bool done () const; + +private: + boost::shared_ptr _image; + mutable boost::optional _video_size; +}; + diff --git a/src/lib/still_image_examiner.cc b/src/lib/still_image_examiner.cc new file mode 100644 index 000000000..71357e5ef --- /dev/null +++ b/src/lib/still_image_examiner.cc @@ -0,0 +1,63 @@ +/* + Copyright (C) 2013 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include +#include "still_image_content.h" +#include "still_image_examiner.h" +#include "film.h" + +#include "i18n.h" + +using std::cout; +using boost::shared_ptr; + +StillImageExaminer::StillImageExaminer (shared_ptr f, shared_ptr c) + : StillImage (c) + , _film (f) +{ + using namespace MagickCore; + Magick::Image* image = new Magick::Image (_still_image_content->file().string()); + _video_size = libdcp::Size (image->columns(), image->rows()); + delete image; +} + +libdcp::Size +StillImageExaminer::video_size () const +{ + return _video_size; +} + +int +StillImageExaminer::video_length () const +{ + return _still_image_content->video_length (); +} + +float +StillImageExaminer::video_frame_rate () const +{ + boost::shared_ptr f = _film.lock (); + if (!f) { + return 24; + } + + return f->dcp_video_frame_rate (); +} + diff --git a/src/lib/still_image_examiner.h b/src/lib/still_image_examiner.h new file mode 100644 index 000000000..fa3456e8a --- /dev/null +++ b/src/lib/still_image_examiner.h @@ -0,0 +1,41 @@ +/* + Copyright (C) 2013 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "still_image.h" +#include "video_examiner.h" + +namespace Magick { + class Image; +} + +class StillImageContent; + +class StillImageExaminer : public StillImage, public VideoExaminer +{ +public: + StillImageExaminer (boost::shared_ptr, boost::shared_ptr); + + float video_frame_rate () const; + libdcp::Size video_size () const; + VideoContent::Frame video_length () const; + +private: + boost::weak_ptr _film; + libdcp::Size _video_size; +}; diff --git a/src/lib/wscript b/src/lib/wscript index 2bedc1fce..100663b87 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -28,9 +28,9 @@ sources = """ film.cc filter.cc image.cc - imagemagick_content.cc - imagemagick_decoder.cc - imagemagick_examiner.cc + still_image_content.cc + still_image_decoder.cc + still_image_examiner.cc job.cc job_manager.cc log.cc diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc index 8fc68f06a..7ab23c997 100644 --- a/src/wx/config_dialog.cc +++ b/src/wx/config_dialog.cc @@ -59,7 +59,7 @@ ConfigDialog::ConfigDialog (wxWindow* parent) _notebook->AddPage (_tms_panel, _("TMS"), false); wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); - overall_sizer->Add (s, 1, wxEXPAND | wxALL, 6); + overall_sizer->Add (s, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER); wxSizer* buttons = CreateSeparatedButtonSizer (wxOK); if (buttons) { diff --git a/src/wx/dci_metadata_dialog.cc b/src/wx/dci_metadata_dialog.cc index a5ddca44b..2862228e4 100644 --- a/src/wx/dci_metadata_dialog.cc +++ b/src/wx/dci_metadata_dialog.cc @@ -68,7 +68,7 @@ DCIMetadataDialog::DCIMetadataDialog (wxWindow* parent, DCIMetadata dm) _package_type->SetValue (std_to_wx (dm.package_type)); wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); - overall_sizer->Add (table, 1, wxEXPAND | wxALL, 6); + overall_sizer->Add (table, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER); wxSizer* buttons = CreateSeparatedButtonSizer (wxOK); if (buttons) { diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc index bfef303a8..fe332e335 100644 --- a/src/wx/film_editor.cc +++ b/src/wx/film_editor.cc @@ -36,7 +36,7 @@ #include "lib/filter.h" #include "lib/ratio.h" #include "lib/config.h" -#include "lib/imagemagick_content.h" +#include "lib/still_image_content.h" #include "lib/sndfile_content.h" #include "lib/dcp_content_type.h" #include "lib/sound_processor.h" @@ -48,7 +48,7 @@ #include "gain_calculator_dialog.h" #include "dci_metadata_dialog.h" #include "audio_dialog.h" -#include "imagemagick_content_dialog.h" +#include "still_image_content_dialog.h" #include "timeline_dialog.h" #include "audio_mapping_view.h" @@ -1166,8 +1166,8 @@ FilmEditor::content_add_clicked (wxCommandEvent &) shared_ptr c; - if (ImageMagickContent::valid_file (p)) { - c.reset (new ImageMagickContent (_film, p)); + if (StillImageContent::valid_file (p)) { + c.reset (new StillImageContent (_film, p)); } else if (SndfileContent::valid_file (p)) { c.reset (new SndfileContent (_film, p)); } else { @@ -1457,7 +1457,7 @@ FilmEditor::length_changed () return; } - shared_ptr ic = dynamic_pointer_cast (c); + shared_ptr ic = dynamic_pointer_cast (c); if (ic) { ic->set_video_length (_length->get(_film->dcp_video_frame_rate()) * ic->video_frame_rate() / TIME_HZ); } diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index fffb64796..9d7225416 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -36,7 +36,7 @@ #include "lib/player.h" #include "lib/video_content.h" #include "lib/ffmpeg_content.h" -#include "lib/imagemagick_content.h" +#include "lib/still_image_content.h" #include "lib/video_decoder.h" #include "film_viewer.h" #include "wx_util.h" diff --git a/src/wx/gain_calculator_dialog.cc b/src/wx/gain_calculator_dialog.cc index 17ebbb983..f9880c044 100644 --- a/src/wx/gain_calculator_dialog.cc +++ b/src/wx/gain_calculator_dialog.cc @@ -38,7 +38,7 @@ GainCalculatorDialog::GainCalculatorDialog (wxWindow* parent) table->Add (_actual, 1, wxEXPAND); wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); - overall_sizer->Add (table, 1, wxEXPAND | wxALL, 6); + overall_sizer->Add (table, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER); wxSizer* buttons = CreateSeparatedButtonSizer (wxOK); if (buttons) { diff --git a/src/wx/imagemagick_content_dialog.cc b/src/wx/imagemagick_content_dialog.cc deleted file mode 100644 index 6aa756260..000000000 --- a/src/wx/imagemagick_content_dialog.cc +++ /dev/null @@ -1,70 +0,0 @@ -/* - Copyright (C) 2013 Carl Hetherington - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#include -#include "lib/imagemagick_content.h" -#include "imagemagick_content_dialog.h" -#include "wx_util.h" - -using boost::shared_ptr; -using boost::dynamic_pointer_cast; - -ImageMagickContentDialog::ImageMagickContentDialog (wxWindow* parent, shared_ptr content) - : wxDialog (parent, wxID_ANY, _("Image")) - , _content (content) -{ - wxFlexGridSizer* grid = new wxFlexGridSizer (3, 6, 6); - grid->AddGrowableCol (1, 1); - - { - add_label_to_sizer (grid, this, _("Duration"), true); - wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); - _video_length = new wxSpinCtrl (this); - s->Add (_video_length); - /// TRANSLATORS: this is an abbreviation for seconds, the unit of time - add_label_to_sizer (s, this, _("s"), false); - grid->Add (s); - } - - wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); - overall_sizer->Add (grid, 1, wxEXPAND | wxALL, 6); - - wxSizer* buttons = CreateSeparatedButtonSizer (wxOK); - if (buttons) { - overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder()); - } - - SetSizer (overall_sizer); - overall_sizer->Layout (); - overall_sizer->SetSizeHints (this); - - checked_set (_video_length, content->video_length () / 24); - _video_length->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (ImageMagickContentDialog::video_length_changed), 0, this); -} - -void -ImageMagickContentDialog::video_length_changed (wxCommandEvent &) -{ - shared_ptr c = _content.lock (); - if (!c) { - return; - } - - c->set_video_length (_video_length->GetValue() * 24); -} diff --git a/src/wx/imagemagick_content_dialog.h b/src/wx/imagemagick_content_dialog.h deleted file mode 100644 index 23722f183..000000000 --- a/src/wx/imagemagick_content_dialog.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - Copyright (C) 2013 Carl Hetherington - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#include - -class wxSpinCtrl; -class ImageMagickContent; -class Region; - -class ImageMagickContentDialog : public wxDialog -{ -public: - ImageMagickContentDialog (wxWindow *, boost::shared_ptr); - -private: - void video_length_changed (wxCommandEvent &); - - boost::weak_ptr _content; - wxSpinCtrl* _video_length; -}; diff --git a/src/wx/new_film_dialog.cc b/src/wx/new_film_dialog.cc index d4b78d5bf..4b12c1714 100644 --- a/src/wx/new_film_dialog.cc +++ b/src/wx/new_film_dialog.cc @@ -39,7 +39,7 @@ NewFilmDialog::NewFilmDialog (wxWindow* parent) wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); table->AddGrowableCol (1, 1); - overall_sizer->Add (table, 1, wxEXPAND | wxALL, 6); + overall_sizer->Add (table, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER); add_label_to_sizer (table, this, _("Film name"), true); _name = new wxTextCtrl (this, wxID_ANY); diff --git a/src/wx/properties_dialog.cc b/src/wx/properties_dialog.cc index d525fe38b..a1ba81b3b 100644 --- a/src/wx/properties_dialog.cc +++ b/src/wx/properties_dialog.cc @@ -57,7 +57,7 @@ PropertiesDialog::PropertiesDialog (wxWindow* parent, shared_ptr film) _disk->SetLabel (std_to_wx (s.str ())); wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); - overall_sizer->Add (table, 0, wxALL, 6); + overall_sizer->Add (table, 0, wxALL, DCPOMATIC_DIALOG_BORDER); wxSizer* buttons = CreateSeparatedButtonSizer (wxOK); if (buttons) { diff --git a/src/wx/repeat_dialog.cc b/src/wx/repeat_dialog.cc index 9eb02ba57..3721c61b9 100644 --- a/src/wx/repeat_dialog.cc +++ b/src/wx/repeat_dialog.cc @@ -28,7 +28,7 @@ RepeatDialog::RepeatDialog (wxWindow* parent) wxFlexGridSizer* table = new wxFlexGridSizer (3, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); table->AddGrowableCol (1, 1); - overall_sizer->Add (table, 1, wxEXPAND | wxALL, 6); + overall_sizer->Add (table, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER); add_label_to_sizer (table, this, _("Repeat"), true); _number = new wxSpinCtrl (this, wxID_ANY); diff --git a/src/wx/still_image_content_dialog.cc b/src/wx/still_image_content_dialog.cc new file mode 100644 index 000000000..704205418 --- /dev/null +++ b/src/wx/still_image_content_dialog.cc @@ -0,0 +1,70 @@ +/* + Copyright (C) 2013 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include "lib/still_image_content.h" +#include "still_image_content_dialog.h" +#include "wx_util.h" + +using boost::shared_ptr; +using boost::dynamic_pointer_cast; + +StillImageContentDialog::StillImageContentDialog (wxWindow* parent, shared_ptr content) + : wxDialog (parent, wxID_ANY, _("Stlll Image")) + , _content (content) +{ + wxFlexGridSizer* grid = new wxFlexGridSizer (3, 6, 6); + grid->AddGrowableCol (1, 1); + + { + add_label_to_sizer (grid, this, _("Duration"), true); + wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); + _video_length = new wxSpinCtrl (this); + s->Add (_video_length); + /// TRANSLATORS: this is an abbreviation for seconds, the unit of time + add_label_to_sizer (s, this, _("s"), false); + grid->Add (s); + } + + wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); + overall_sizer->Add (grid, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER); + + wxSizer* buttons = CreateSeparatedButtonSizer (wxOK); + if (buttons) { + overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder()); + } + + SetSizer (overall_sizer); + overall_sizer->Layout (); + overall_sizer->SetSizeHints (this); + + checked_set (_video_length, content->video_length () / 24); + _video_length->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (StillImageContentDialog::video_length_changed), 0, this); +} + +void +StillImageContentDialog::video_length_changed (wxCommandEvent &) +{ + shared_ptr c = _content.lock (); + if (!c) { + return; + } + + c->set_video_length (_video_length->GetValue() * 24); +} diff --git a/src/wx/still_image_content_dialog.h b/src/wx/still_image_content_dialog.h new file mode 100644 index 000000000..b01d79b28 --- /dev/null +++ b/src/wx/still_image_content_dialog.h @@ -0,0 +1,36 @@ +/* + Copyright (C) 2013 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include + +class wxSpinCtrl; +class StillImageContent; +class Region; + +class StillImageContentDialog : public wxDialog +{ +public: + StillImageContentDialog (wxWindow *, boost::shared_ptr); + +private: + void video_length_changed (wxCommandEvent &); + + boost::weak_ptr _content; + wxSpinCtrl* _video_length; +}; diff --git a/src/wx/wscript b/src/wx/wscript index 3402d4b41..09ce0218d 100644 --- a/src/wx/wscript +++ b/src/wx/wscript @@ -16,7 +16,7 @@ sources = """ filter_dialog.cc filter_view.cc gain_calculator_dialog.cc - imagemagick_content_dialog.cc + still_image_content_dialog.cc job_manager_view.cc job_wrapper.cc new_film_dialog.cc diff --git a/src/wx/wx_util.h b/src/wx/wx_util.h index de6a09c35..d942d8fa8 100644 --- a/src/wx/wx_util.h +++ b/src/wx/wx_util.h @@ -34,6 +34,7 @@ class wxGridBagSizer; #define DCPOMATIC_SIZER_X_GAP 8 #define DCPOMATIC_SIZER_Y_GAP 8 +#define DCPOMATIC_DIALOG_BORDER 12 /** @file src/wx/wx_util.h * @brief Some utility functions and classes. -- cgit v1.2.3