4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #include "mwindow.inc"
29 #include "videodevice.inc"
30 // Output for all X11 video
32 // The EDL arguments can be set to 0 if the canvas_w and canvas_h are used
36 Canvas(MWindow *mwindow, BC_WindowBase *subwindow,
37 int x, int y, int w, int h,
38 int output_w, int output_h,
43 // Get dimensions given a zoom
44 void calculate_sizes(float aspect_ratio,
45 int output_w, int output_h, float zoom,
47 // Lock canvas pointer and window
48 BC_WindowBase *lock_canvas(const char *loc);
51 void create_objects(EDL *edl);
52 void set_cursor(int cursor);
53 // Start video playback
57 // Start single frame processing. Causes the status indicator to update
61 // Don't call from inside the canvas
64 // Processing or video playback changed.
65 virtual void status_event() {};
67 virtual void reset_camera() {}
68 virtual void reset_projector() {}
69 virtual void camera_keyframe() {}
70 virtual void projector_keyframe() {}
71 virtual void zoom_resize_window(float percentage) {}
72 virtual int cursor_leave_event() { return 0; }
73 virtual int cursor_enter_event() { return 0; }
74 virtual int button_release_event() { return 0; }
75 virtual int button_press_event();
76 virtual int cursor_motion_event() { return 0; }
77 virtual int need_overlays() { return 1; }
78 virtual void draw_overlays() {}
79 virtual void toggle_controls() {}
80 virtual int get_cwindow_controls() { return 0; }
81 virtual int get_fullscreen();
82 virtual void set_fullscreen(int value);
83 virtual int get_clear_color();
84 virtual int use_fullscreen(int on);
86 int cursor_leave_event_base(BC_WindowBase *caller);
87 int cursor_enter_event_base(BC_WindowBase *caller);
88 int button_press_event_base(BC_WindowBase *caller);
89 int keypress_event(BC_WindowBase *caller);
90 // Use menu different options for different windows
94 void use_auxwindow(BC_WindowBase *aux);
96 // Provide canvas dimensions since a BC_Bitmap containing obsolete dimensions
97 // is often the output being transferred to.
98 // This gets the input coordinates on the device output_frame
99 // and the corresponding output coordinates on the canvas.
100 // Must be floating point to support OpenGL.
101 void get_transfers(EDL *edl,
110 // passing -1 causes automatic size detection
113 void update_geometry(EDL *edl, int x, int y, int w, int h);
114 void reposition_window(EDL *edl, int x, int y, int w, int h);
115 virtual void reset_translation() {};
116 virtual void close_source() {};
117 // Updates the stores
118 virtual void update_zoom(int x, int y, float zoom) {}
119 void check_boundaries(EDL *edl, int &x, int &y, float &zoom);
120 void clear_borders(EDL *edl);
121 void update_scrollbars(EDL *edl, int flush);
122 // Get scrollbar positions relative to output.
123 // No correction is done if output is smaller than canvas
124 virtual int get_xscroll() { return 0; }
125 virtual int get_yscroll() { return 0; }
126 virtual float get_zoom() { return 0; }
127 virtual float get_auto_zoom(EDL *edl);
128 virtual void zoom_auto();
129 // Updates the refresh_frame
130 void update_refresh(VideoDevice *device, VFrame *output_frame);
131 // Redraws the refresh_frame
132 virtual void draw_refresh(int flush = 1) {};
133 virtual void clear(int flash=1);
135 // Get top left offset of canvas relative to output.
136 // Normally negative. Can be positive if output is smaller than canvas.
137 float get_x_offset(EDL *edl, int single_channel, float zoom_x,
138 float conformed_w, float conformed_h);
139 float get_y_offset(EDL *edl, int single_channel, float zoom_y,
140 float conformed_w, float conformed_h);
142 void get_zooms(EDL *edl, int single_channel,
143 float &zoom_x, float &zoom_y,
144 float &conformed_w, float &conformed_h);
145 void set_zoom(EDL *edl, float zoom);
146 void set_zoom(EDL *edl, float zoom, float cx, float cy);
148 // Convert coord from output to canvas position, including
149 // x and y scroll offsets
150 void output_to_canvas(EDL *edl, int single_channel, float &x, float &y);
151 // Convert coord from canvas to output position
152 void canvas_to_output(EDL *edl, int single_channel, float &x, float &y);
154 // Get dimensions of frame being sent to canvas
155 virtual int get_output_w(EDL *edl);
156 virtual int get_output_h(EDL *edl);
157 // Get if scrollbars exist
158 int scrollbars_exist();
159 // Get cursor locations relative to canvas and not offset by scrollbars
162 int get_buttonpress();
163 // Gets whatever video surface is enabled
164 BC_WindowBase* get_canvas();
165 // draw_refresh, with/without locks
166 int refresh(int flush);
167 int redraw(int flush);
169 // The owner of the canvas
170 BC_WindowBase *subwindow;
171 // Video surface if a subwindow
172 CanvasOutput *canvas_subwindow;
173 // Video surface if fullscreen
174 CanvasFullScreen *canvas_fullscreen;
175 CanvasXScroll *xscroll;
176 CanvasYScroll *yscroll;
177 CanvasPopup *canvas_menu;
178 CanvasFullScreenPopup *fullscreen_menu;
181 BC_WindowBase *canvas_auxwindow;
182 // Used in record monitor
183 int output_w, output_h;
184 // Last frame played is stored here in driver format for
186 VFrame *refresh_frame;
187 // Results from last get_scrollbars
188 int w_needed, h_needed;
189 int w_visible, h_visible;
190 // For cases where video is not enabled on the canvas but processing is
191 // occurring for a single frame, this causes the status to update.
194 // Cursor is inside video surface
196 int view_x, view_y, view_w, view_h;
203 int get_scrollbars(EDL *edl);
204 void start_fullscreen();
205 void stop_fullscreen();
207 // Lock access to the canvas pointer.
208 Condition *canvas_lock;
212 class CanvasOutput : public BC_SubWindow
215 CanvasOutput(Canvas *canvas,
216 int x, int y, int w, int h);
219 int cursor_leave_event();
220 int cursor_enter_event();
221 int button_press_event();
222 int button_release_event();
223 int cursor_motion_event();
224 int keypress_event();
232 class CanvasFullScreen : public BC_FullScreen
235 CanvasFullScreen(Canvas *canvas, int w, int h);
244 class CanvasXScroll : public BC_ScrollBar
247 CanvasXScroll(EDL *edl,
262 class CanvasYScroll : public BC_ScrollBar
265 CanvasYScroll(EDL *edl,
281 class CanvasFullScreenPopup : public BC_PopupMenu
284 CanvasFullScreenPopup(Canvas *canvas);
286 void create_objects();
292 class CanvasSubWindowItem : public BC_MenuItem
295 CanvasSubWindowItem(Canvas *canvas);
300 class CanvasPopup : public BC_PopupMenu
303 CanvasPopup(Canvas *canvas);
306 void create_objects();
312 CanvasToggleControls *toggle_controls;
315 class CanvasZoomSize : public BC_MenuItem
318 CanvasZoomSize(Canvas *canvas);
323 class CanvasSizeSubMenu : public BC_SubMenu
326 CanvasSizeSubMenu(CanvasZoomSize *zoom_size);
328 CanvasZoomSize *zoom_size;
331 class CanvasPopupSize : public BC_MenuItem
334 CanvasPopupSize(Canvas *canvas, char *text, float percentage);
341 class CanvasPopupAuto : public BC_MenuItem
344 CanvasPopupAuto(Canvas *canvas);
349 class CanvasPopupResetCamera : public BC_MenuItem
352 CanvasPopupResetCamera(Canvas *canvas);
357 class CanvasPopupResetProjector : public BC_MenuItem
360 CanvasPopupResetProjector(Canvas *canvas);
365 class CanvasPopupCameraKeyframe : public BC_MenuItem
368 CanvasPopupCameraKeyframe(Canvas *canvas);
373 class CanvasPopupProjectorKeyframe : public BC_MenuItem
376 CanvasPopupProjectorKeyframe(Canvas *canvas);
381 class CanvasToggleControls : public BC_MenuItem
384 CanvasToggleControls(Canvas *canvas);
386 static char* calculate_text(int cwindow_controls);
390 class CanvasFullScreenItem : public BC_MenuItem
393 CanvasFullScreenItem(Canvas *canvas);
398 class CanvasPopupResetTranslation : public BC_MenuItem
401 CanvasPopupResetTranslation(Canvas *canvas);
407 class CanvasPopupRemoveSource : public BC_MenuItem
410 CanvasPopupRemoveSource(Canvas *canvas);