File "%static_deps%/bin/wxmsw30u_adv_gcc_custom.dll"
File "%static_deps%/bin/wxmsw30u_richtext_gcc_custom.dll"
File "%static_deps%/bin/wxmsw30u_html_gcc_custom.dll"
+File "%static_deps%/bin/wxmsw30u_gl_gcc_custom.dll"
File "%static_deps%/bin/wxbase30u_xml_gcc_custom.dll"
File "%static_deps%/bin/libcairo-2.dll"
File "%static_deps%/bin/libfreetype-6.dll"
{
}
+
+GLError::GLError (char const * last, int e)
+ : runtime_error (String::compose("%1 failed %2", last, e))
+{
+
+}
KDMAsContentError ();
};
+class GLError : public std::runtime_error
+{
+public:
+ GLError (char const * last, int e);
+};
+
+
#endif
#include "playhead_to_frame_dialog.h"
#include "wx_util.h"
#include "closed_captions_dialog.h"
+#include "gl_video_view.h"
#include "lib/film.h"
#include "lib/ratio.h"
#include "lib/util.h"
}
FilmViewer::FilmViewer (wxWindow* p)
- : _panel (new wxPanel (p))
+ /* XXX: make this configurable */
+ : _video_view (new GLVideoView(p))
, _coalesce_player_changes (false)
, _audio (DCPOMATIC_RTAUDIO_API)
, _audio_channels (0)
, _state_timer ("viewer")
, _gets (0)
{
-#ifndef __WXOSX__
- _panel->SetDoubleBuffered (true);
-#endif
-
- _panel->SetBackgroundStyle (wxBG_STYLE_PAINT);
- _panel->SetBackgroundColour (*wxBLACK);
-
- _panel->Bind (wxEVT_PAINT, boost::bind (&FilmViewer::paint_panel, this));
- _panel->Bind (wxEVT_SIZE, boost::bind (&FilmViewer::panel_sized, this, _1));
+ /* XXX: maybe this should be proxied through the VideoView */
+ _video_view->get()->Bind (wxEVT_SIZE, boost::bind (&FilmViewer::video_view_sized, this));
_timer.Bind (wxEVT_TIMER, boost::bind (&FilmViewer::timer, this));
set_film (shared_ptr<Film> ());
_player->set_dcp_decode_reduction (_dcp_decode_reduction);
}
} catch (bad_alloc &) {
- error_dialog (_panel, _("There is not enough free memory to do that."));
+ error_dialog (_video_view->get(), _("There is not enough free memory to do that."));
_film.reset ();
return;
}
void
FilmViewer::refresh_panel ()
{
+ /* XXX */
+
+ /*
_state_timer.set ("refresh-panel");
_panel->Refresh ();
_panel->Update ();
_state_timer.unset ();
+ */
}
void
*/
_state_timer.set ("get image");
+
+ /* XXX: do we need to store _frame? */
_frame = _player_video.first->image (bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true);
+ _video_view->set_image (_frame);
_state_timer.set ("ImageChanged");
ImageChanged (_player_video.first);
bool
#ifdef DCPOMATIC_VARIANT_SWAROOP
+XXX
FilmViewer::maybe_draw_background_image (wxPaintDC& dc)
{
optional<boost::filesystem::path> bg = Config::instance()->player_background_image();
}
#endif
-void
-FilmViewer::paint_panel ()
-{
- _state_timer.set ("paint-panel");
-
- wxPaintDC dc (_panel);
-
-#ifdef DCPOMATIC_VARIANT_SWAROOP
- if (_background_image) {
- dc.Clear ();
- maybe_draw_background_image (dc);
- _state_timer.unset ();
- return;
- }
-#endif
-
- if (!_out_size.width || !_out_size.height || !_film || !_frame || _out_size != _frame->size()) {
- dc.Clear ();
- } else {
-
- wxImage frame (_out_size.width, _out_size.height, _frame->data()[0], true);
- wxBitmap frame_bitmap (frame);
- dc.DrawBitmap (frame_bitmap, 0, max(0, (_panel_size.height - _out_size.height) / 2));
-
-#ifdef DCPOMATIC_VARIANT_SWAROOP
- DCPTime const period = DCPTime::from_seconds(Config::instance()->player_watermark_period() * 60);
- int64_t n = _video_position.get() / period.get();
- DCPTime from(n * period.get());
- DCPTime to = from + DCPTime::from_seconds(Config::instance()->player_watermark_duration() / 1000.0);
- if (from <= _video_position && _video_position <= to) {
- if (!_in_watermark) {
- _in_watermark = true;
- _watermark_x = rand() % _panel_size.width;
- _watermark_y = rand() % _panel_size.height;
- }
- dc.SetTextForeground(*wxWHITE);
- string wm = Config::instance()->player_watermark_theatre();
- boost::posix_time::ptime t = boost::posix_time::second_clock::local_time();
- wm += "\n" + boost::posix_time::to_iso_extended_string(t);
- dc.DrawText(std_to_wx(wm), _watermark_x, _watermark_y);
- } else {
- _in_watermark = false;
- }
-#endif
- }
-
- if (_out_size.width < _panel_size.width) {
- /* XXX: these colours are right for GNOME; may need adjusting for other OS */
- wxPen p (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
- wxBrush b (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
- dc.SetPen (p);
- dc.SetBrush (b);
- dc.DrawRectangle (_out_size.width, 0, _panel_size.width - _out_size.width, _panel_size.height);
- }
-
- if (_out_size.height < _panel_size.height) {
- wxPen p (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
- wxBrush b (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
- dc.SetPen (p);
- dc.SetBrush (b);
- int const gap = (_panel_size.height - _out_size.height) / 2;
- dc.DrawRectangle (0, 0, _panel_size.width, gap);
- dc.DrawRectangle (0, gap + _out_size.height + 1, _panel_size.width, gap + 1);
- }
-
- if (_outline_content) {
- wxPen p (wxColour (255, 0, 0), 2);
- dc.SetPen (p);
- dc.SetBrush (*wxTRANSPARENT_BRUSH);
- dc.DrawRectangle (_inter_position.x, _inter_position.y + (_panel_size.height - _out_size.height) / 2, _inter_size.width, _inter_size.height);
- }
-
- _state_timer.unset ();
-}
-
void
FilmViewer::set_outline_content (bool o)
{
}
void
-FilmViewer::panel_sized (wxSizeEvent& ev)
+FilmViewer::video_view_sized ()
{
- _panel_size.width = ev.GetSize().GetWidth();
- _panel_size.height = ev.GetSize().GetHeight();
-
calculate_sizes ();
if (!quick_refresh()) {
slow_refresh ();
Ratio const * container = _film->container ();
- float const panel_ratio = _panel_size.ratio ();
+ float const view_ratio = float(_video_view->get()->GetSize().x) / _video_view->get()->GetSize().y;
float const film_ratio = container ? container->ratio () : 1.78;
- if (panel_ratio < film_ratio) {
+ if (view_ratio < film_ratio) {
/* panel is less widscreen than the film; clamp width */
- _out_size.width = _panel_size.width;
+ _out_size.width = _video_view->get()->GetSize().x;
_out_size.height = lrintf (_out_size.width / film_ratio);
} else {
/* panel is more widescreen than the film; clamp height */
- _out_size.height = _panel_size.height;
+ _out_size.height = _video_view->get()->GetSize().y;
_out_size.width = lrintf (_out_size.height * film_ratio);
}
_out_size.width = max (64, _out_size.width);
_out_size.height = max (64, _out_size.height);
+ /* Make OpenGL happy; XXX: only do this in GLVideoView? Is the round-to-4 constraint a thing? */
+ _out_size.width &= ~3;
+ _out_size.height &= ~3;
+
_player->set_video_container_size (_out_size);
}
} catch (RtAudioError& e) {
#endif
error_dialog (
- _panel,
+ _video_view->get(),
_("Could not set up audio output. There will be no audio during the preview."), std_to_wx(e.what())
);
}
* @brief FilmViewer class.
*/
+#include "video_view.h"
#include "lib/film.h"
#include "lib/config.h"
#include "lib/player_text.h"
FilmViewer (wxWindow *);
~FilmViewer ();
- /** @return the panel showing the film's video */
- wxPanel* panel () const {
- return _panel;
+ /** @return the window showing the film's video */
+ wxWindow* panel () const {
+ return _video_view->get();
}
void show_closed_captions ();
boost::signals2::signal<bool ()> PlaybackPermitted;
private:
- void paint_panel ();
- void panel_sized (wxSizeEvent &);
+ void video_view_sized ();
void timer ();
void calculate_sizes ();
void player_change (ChangeType type, int, bool);
boost::shared_ptr<Film> _film;
boost::shared_ptr<Player> _player;
- /** The area that we put our image in */
- wxPanel* _panel;
+ VideoView* _video_view;
wxTimer _timer;
bool _coalesce_player_changes;
std::list<int> _pending_player_changes;
/** Size of our output (including padding if we have any) */
dcp::Size _out_size;
- /** Size of the panel that we have available */
- dcp::Size _panel_size;
RtAudio _audio;
int _audio_channels;
--- /dev/null
+/*
+ Copyright (C) 2018-2019 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic 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.
+
+ DCP-o-matic 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 DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "gl_video_view.h"
+#include "lib/image.h"
+#include "lib/dcpomatic_assert.h"
+#include "lib/exceptions.h"
+#include <boost/bind.hpp>
+#include <iostream>
+
+#ifdef DCPOMATIC_OSX
+#include <OpenGL/glu.h>
+#include <OpenGL/glext.h>
+#else
+#include <GL/glu.h>
+#include <GL/glext.h>
+#endif
+
+using std::cout;
+using boost::shared_ptr;
+
+GLVideoView::GLVideoView (wxWindow *parent)
+{
+ _canvas = new wxGLCanvas (parent, wxID_ANY, 0, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE);
+ _context = new wxGLContext (_canvas);
+ _canvas->Bind (wxEVT_PAINT, boost::bind(&GLVideoView::paint, this, _1));
+
+ glGenTextures (1, &_id);
+ glBindTexture (GL_TEXTURE_2D, _id);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+}
+
+GLVideoView::~GLVideoView ()
+{
+ glDeleteTextures (1, &_id);
+ delete _context;
+ delete _canvas;
+}
+
+static void
+check_gl_error (char const * last)
+{
+ GLenum const e = glGetError ();
+ if (e != GL_NO_ERROR) {
+ throw GLError (last, e);
+ }
+}
+
+void
+GLVideoView::paint (wxPaintEvent &)
+{
+ _canvas->SetCurrent (*_context);
+ wxPaintDC dc (_canvas);
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ check_gl_error ("glClear");
+
+ glClearColor (0.0f, 0.0f, 0.0f, 1.0f);
+ check_gl_error ("glClearColor");
+ glEnable (GL_TEXTURE_2D);
+ check_gl_error ("glEnable GL_TEXTURE_2D");
+ glEnable (GL_COLOR_MATERIAL);
+ check_gl_error ("glEnable GL_COLOR_MATERIAL");
+ glEnable (GL_BLEND);
+ check_gl_error ("glEnable GL_BLEND");
+ glDisable (GL_DEPTH_TEST);
+ check_gl_error ("glDisable GL_DEPTH_TEST");
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glViewport (0, 0, _canvas->GetSize().x, _canvas->GetSize().y);
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+
+ gluOrtho2D (0, _canvas->GetSize().x, _canvas->GetSize().y, 0);
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+
+ glTranslatef (0, 0, 0);
+
+ if (_size) {
+ glBegin (GL_QUADS);
+
+ glTexCoord2f (0, 1);
+ glVertex2f (0, _size->height);
+ glTexCoord2f (1, 1);
+ glVertex2f (_size->width, _size->height);
+ glTexCoord2f (1, 0);
+ glVertex2f (_size->width, 0);
+ glTexCoord2f (0, 0);
+ glVertex2f (0, 0);
+
+ glEnd ();
+ }
+
+ glFlush();
+ _canvas->SwapBuffers();
+}
+
+void
+GLVideoView::set_image (shared_ptr<const Image> image)
+{
+ /* XXX: put this somewhere sensible */
+ cout << glGetString (GL_VERSION) << "\n";
+
+ DCPOMATIC_ASSERT (image->pixel_format() == AV_PIX_FMT_RGB24);
+ DCPOMATIC_ASSERT (!image->aligned());
+
+ _size = image->size ();
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB8, _size->width, _size->height, 0, GL_RGB, GL_UNSIGNED_BYTE, image->data()[0]);
+ check_gl_error ("glTexImage2D");
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ check_gl_error ("glTexParameteri");
+
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ check_gl_error ("glTexParameterf");
+
+ _canvas->Refresh ();
+}
--- /dev/null
+/*
+ Copyright (C) 2019 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic 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.
+
+ DCP-o-matic 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 DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "video_view.h"
+#include <wx/wx.h>
+#include <wx/glcanvas.h>
+#include <dcp/util.h>
+#include <boost/shared_ptr.hpp>
+
+#undef None
+#undef Success
+
+class GLVideoView : public VideoView
+{
+public:
+ GLVideoView (wxWindow* parent);
+ ~GLVideoView ();
+
+ void set_image (boost::shared_ptr<const Image> image);
+ wxWindow* get () const {
+ return _canvas;
+ }
+
+private:
+ void paint (wxPaintEvent& event);
+
+ wxGLCanvas* _canvas;
+ wxGLContext* _context;
+ GLuint _id;
+ boost::optional<dcp::Size> _size;
+};
--- /dev/null
+/*
+ Copyright (C) 2019 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic 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.
+
+ DCP-o-matic 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 DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+SimpleVideoView::SimpleVideoView (wxWindow* parent)
+{
+ _panel = new wxPanel (parent);
+
+#ifndef __WXOSX__
+ _panel->SetDoubleBuffered (true);
+#endif
+
+ _panel->SetBackgroundStyle (wxBG_STYLE_PAINT);
+ _panel->SetBackgroundColour (*wxBLACK);
+
+ _panel->Bind (wxEVT_PAINT, boost::bind (&SimpleVideoView::paint_panel, this));
+ _panel->Bind (wxEVT_SIZE, boost::bind (&SimpleVideoView::panel_sized, this, _1));
+}
+
+void
+SimpleVideoView::paint_panel ()
+{
+ wxPaintDC dc (_panel);
+
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+ if (_background_image) {
+ dc.Clear ();
+ maybe_draw_background_image (dc);
+ _state_timer.unset ();
+ return;
+ }
+#endif
+
+ if (!_out_size.width || !_out_size.height || !_film || !_frame || _out_size != _frame->size()) {
+ dc.Clear ();
+ } else {
+
+ wxImage frame (_out_size.width, _out_size.height, _frame->data()[0], true);
+ wxBitmap frame_bitmap (frame);
+ dc.DrawBitmap (frame_bitmap, 0, max(0, (_panel_size.height - _out_size.height) / 2));
+
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+ DCPTime const period = DCPTime::from_seconds(Config::instance()->player_watermark_period() * 60);
+ int64_t n = _video_position.get() / period.get();
+ DCPTime from(n * period.get());
+ DCPTime to = from + DCPTime::from_seconds(Config::instance()->player_watermark_duration() / 1000.0);
+ if (from <= _video_position && _video_position <= to) {
+ if (!_in_watermark) {
+ _in_watermark = true;
+ _watermark_x = rand() % _panel_size.width;
+ _watermark_y = rand() % _panel_size.height;
+ }
+ dc.SetTextForeground(*wxWHITE);
+ string wm = Config::instance()->player_watermark_theatre();
+ boost::posix_time::ptime t = boost::posix_time::second_clock::local_time();
+ wm += "\n" + boost::posix_time::to_iso_extended_string(t);
+ dc.DrawText(std_to_wx(wm), _watermark_x, _watermark_y);
+ } else {
+ _in_watermark = false;
+ }
+#endif
+ }
+
+ if (_out_size.width < _panel_size.width) {
+ /* XXX: these colours are right for GNOME; may need adjusting for other OS */
+ wxPen p (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
+ wxBrush b (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
+ dc.SetPen (p);
+ dc.SetBrush (b);
+ dc.DrawRectangle (_out_size.width, 0, _panel_size.width - _out_size.width, _panel_size.height);
+ }
+
+ if (_out_size.height < _panel_size.height) {
+ wxPen p (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
+ wxBrush b (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
+ dc.SetPen (p);
+ dc.SetBrush (b);
+ int const gap = (_panel_size.height - _out_size.height) / 2;
+ dc.DrawRectangle (0, 0, _panel_size.width, gap);
+ dc.DrawRectangle (0, gap + _out_size.height + 1, _panel_size.width, gap + 1);
+ }
+
+ if (_outline_content) {
+ wxPen p (wxColour (255, 0, 0), 2);
+ dc.SetPen (p);
+ dc.SetBrush (*wxTRANSPARENT_BRUSH);
+ dc.DrawRectangle (_inter_position.x, _inter_position.y + (_panel_size.height - _out_size.height) / 2, _inter_size.width, _inter_size.height);
+ }
+}
+
+void
+SimpleVideoView::panel_sized (wxSizeEvent& ev)
+{
+ _panel_size.width = ev.GetSize().GetWidth();
+ _panel_size.height = ev.GetSize().GetHeight();
+
+ calculate_sizes ();
+ if (!quick_refresh()) {
+ slow_refresh ();
+ }
+ PositionChanged ();
+}
--- /dev/null
+/*
+ Copyright (C) 2019 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic 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.
+
+ DCP-o-matic 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 DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+class SimpleVideoView : public VideoView
+{
+public:
+ SimpleVideoView (wxWindow* parent);
+
+ void set_image (boost::shared_ptr<const Image> image);
+
+ wxWindow* get () const {
+ return _panel;
+ }
+
+private:
+ wxPanel* _panel;
+};
--- /dev/null
+/*
+ Copyright (C) 2019 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic 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.
+
+ DCP-o-matic 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 DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifndef DCPOMATIC_VIDEO_VIEW_H
+#define DCPOMATIC_VIDEO_VIEW_H
+
+#include <boost/shared_ptr.hpp>
+
+class Image;
+class wxWindow;
+
+class VideoView
+{
+public:
+ virtual ~VideoView () {}
+
+ virtual void set_image (boost::shared_ptr<const Image> image) = 0;
+ virtual wxWindow* get () const = 0;
+};
+
+#endif
full_config_dialog.cc
gain_calculator_dialog.cc
gdc_certificate_panel.cc
+ gl_video_view.cc
hints_dialog.cc
html_dialog.cc
initial_setup_dialog.cc
conf.check_cfg(msg='Checking for wxWidgets using gtk2-unicode-3.0',
package='',
path=wx_config,
- args='--cppflags --cxxflags --libs %s' % wx_libs,
+ args='--cppflags --cxxflags --libs %s --gl-libs' % wx_libs,
uselib_store='WXWIDGETS',
mandatory=True)
except:
conf.check_cfg(msg='Checking for wxWidgets using wx-config-3.0-gtk2',
package='',
path=wx_config,
- args='--cppflags --cxxflags --libs %s' % wx_libs,
+ args='--cppflags --cxxflags --libs %s --gl-libs' % wx_libs,
uselib_store='WXWIDGETS',
mandatory=True)
except:
conf.check_cfg(msg='Checking for wxWidgets using wx-config',
package='',
path=wx_config,
- args='--cppflags --cxxflags --libs %s' % wx_libs,
+ args='--cppflags --cxxflags --libs %s --gl-libs' % wx_libs,
uselib_store='WXWIDGETS',
mandatory=True)
define_name='DCPOMATIC_USE_RTERROR',
mandatory=False)
+ if conf.env.TARGET_WINDOWS or conf.env.TARGET_LINUX:
+ conf.check_cfg(package='gl', args='--cflags --libs', uselib_store='GL', mandatory=True)
+ conf.check_cfg(package='glu', args='--cflags --libs', uselib_store='GLU', mandatory=True)
+ else:
+ conf.env.STLIB_GL = 'gl'
+ conf.env.STLIB_GLU = 'glu'
+
def build(bld):
obj.name = 'libdcpomatic2-wx'
obj.export_includes = ['..']
- obj.uselib = 'BOOST_FILESYSTEM BOOST_THREAD BOOST_REGEX WXWIDGETS DCP SUB ZIP CXML RTAUDIO '
+ obj.uselib = 'BOOST_FILESYSTEM BOOST_THREAD BOOST_REGEX WXWIDGETS DCP SUB ZIP CXML RTAUDIO GL GLU '
if bld.env.TARGET_LINUX:
- obj.uselib += 'GTK '
+ obj.uselib += 'GTK GL GLU '
if bld.env.TARGET_WINDOWS:
- obj.uselib += 'WINSOCK2 OLE32 DSOUND WINMM KSUSER '
+ obj.uselib += 'WINSOCK2 OLE32 DSOUND WINMM KSUSER GL GLU '
if bld.env.TARGET_OSX:
- obj.framework = ['CoreAudio']
+ obj.framework = ['CoreAudio', 'OpenGL']
obj.use = 'libdcpomatic2'
if bld.env.VARIANT == 'swaroop':
obj.source = sources + " swaroop_controls.cc"