X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fgl_video_view.h;h=70c81ea79e4bbeb72ce67d16c07ac5186a4cf7f7;hb=1d14e44952b8cd1430946437995ee0fa360d9bf7;hp=0186417d2dbc48c65e400361aaffaee8b2296700;hpb=4f4561c4b5bb1e8a2fa8e673606d18ffa25aec6c;p=dcpomatic.git diff --git a/src/wx/gl_video_view.h b/src/wx/gl_video_view.h index 0186417d2..70c81ea79 100644 --- a/src/wx/gl_video_view.h +++ b/src/wx/gl_video_view.h @@ -18,14 +18,25 @@ */ + +#include +LIBDCP_DISABLE_WARNINGS +#include +#include +LIBDCP_ENABLE_WARNINGS + + +/* The OpenGL API in wxWidgets 3.0.x is sufficiently different to make it awkward to support, + * and I think it may even have things missing that we require (e.g. the attributes parameter + * to wxGLContext). Hence we only support the GLVideoView on wxWidgets 3.1.0 and higher + * (which only excludes the old macOS builds, since wxWidgets 3.1.x does not support macOS + * 10.9 or earlier). + */ +#if wxCHECK_VERSION(3,1,0) + #include "video_view.h" #include "lib/signaller.h" #include "lib/position.h" -#include "lib/warnings.h" -DCPOMATIC_DISABLE_WARNINGS -#include -#include -DCPOMATIC_ENABLE_WARNINGS #include #include #include @@ -34,6 +45,26 @@ DCPOMATIC_ENABLE_WARNINGS #undef Success #undef Status + +class Texture +{ +public: + Texture (GLint unpack_alignment); + ~Texture (); + + Texture (Texture const&) = delete; + Texture& operator= (Texture const&) = delete; + + void bind (); + void set (std::shared_ptr image); + +private: + GLuint _name; + GLint _unpack_alignment; + boost::optional _size; +}; + + class GLVideoView : public VideoView { public: @@ -53,10 +84,14 @@ public: return _vsync_enabled; } + std::map information () const { + return _information; + } + private: - void set_image (std::shared_ptr image); + void set_image (std::shared_ptr pv); void set_image_and_draw (); - void draw (Position inter_position, dcp::Size inter_size); + void draw (); void thread (); void thread_playing (); void request_one_shot (); @@ -69,10 +104,37 @@ private: wxGLCanvas* _canvas; wxGLContext* _context; + template + class Last + { + public: + void set_next (T const& next) { + _next = next; + } + + bool changed () const { + return !_value || *_value != _next; + } + + void update () { + _value = _next; + } + + private: + boost::optional _value; + T _next; + }; + + Last _last_canvas_size; + Last _last_video_size; + Last> _last_inter_position; + Last _last_inter_size; + Last _last_out_size; + boost::atomic _canvas_size; - GLuint _texture; - boost::optional _size; - bool _have_storage; + std::unique_ptr _video_texture; + std::unique_ptr _subtitle_texture; + bool _have_subtitle_to_render = false; bool _vsync_enabled; boost::thread _thread; @@ -82,8 +144,12 @@ private: boost::atomic _one_shot; GLuint _vao; - GLint _draw_border; + GLint _fragment_type; bool _setup_shaders_done = false; std::shared_ptr _timer; + + std::map _information; }; + +#endif