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 access to the canvas pointer.
48 // Must be called before get_canvas or locking the canvas.
49 void lock_canvas(const char *location);
53 void create_objects(EDL *edl);
54 void set_cursor(int cursor);
55 // Start video playback
59 // Start single frame processing. Causes the status indicator to update
63 void start_fullscreen();
64 void stop_fullscreen();
66 // Don't call from inside the canvas
71 // Processing or video playback changed.
72 virtual void status_event() {};
75 virtual void reset_camera() {}
76 virtual void reset_projector() {}
77 virtual void camera_keyframe() {}
78 virtual void projector_keyframe() {}
79 virtual void zoom_resize_window(float percentage) {}
80 virtual void zoom_auto() {}
81 virtual int cursor_leave_event() { return 0; }
82 virtual int cursor_enter_event() { return 0; }
83 virtual int button_release_event() { return 0; }
84 virtual int button_press_event();
85 virtual int cursor_motion_event() { return 0; }
86 virtual int need_overlays() { return 1; }
87 virtual void draw_overlays() {}
88 virtual void toggle_controls() {}
89 virtual int get_cwindow_controls() { return 0; }
90 virtual int get_fullscreen();
91 virtual void set_fullscreen(int value);
93 int cursor_leave_event_base(BC_WindowBase *caller);
94 int cursor_enter_event_base(BC_WindowBase *caller);
95 int button_press_event_base(BC_WindowBase *caller);
96 int keypress_event(BC_WindowBase *caller);
97 // Use menu different options for different windows
101 void use_auxwindow(BC_WindowBase *aux);
103 // Provide canvas dimensions since a BC_Bitmap containing obsolete dimensions
104 // is often the output being transferred to.
105 // This gets the input coordinates on the device output_frame
106 // and the corresponding output coordinates on the canvas.
107 // Must be floating point to support OpenGL.
108 void get_transfers(EDL *edl,
117 // passing -1 causes automatic size detection
120 void update_geometry(EDL *edl, int x, int y, int w, int h);
121 void reposition_window(EDL *edl, int x, int y, int w, int h);
122 virtual void reset_translation() {};
123 virtual void close_source() {};
124 // Updates the stores
125 virtual void update_zoom(int x, int y, float zoom) {};
126 void check_boundaries(EDL *edl, int &x, int &y, float &zoom);
127 void update_scrollbars(int flush);
128 // Get scrollbar positions relative to output.
129 // No correction is done if output is smaller than canvas
130 virtual int get_xscroll() { return 0; };
131 virtual int get_yscroll() { return 0; };
132 virtual float get_zoom() { return 0; };
133 // Updates the refresh_frame
134 void update_refresh(VideoDevice *device, VFrame *output_frame);
135 // Redraws the refresh_frame
136 virtual void draw_refresh(int flush = 1) {};
137 virtual void clear(int flush=1);
139 // Get top left offset of canvas relative to output.
140 // Normally negative. Can be positive if output is smaller than canvas.
141 float get_x_offset(EDL *edl,
146 float get_y_offset(EDL *edl,
151 void get_zooms(EDL *edl,
159 // Convert coord from output to canvas position, including
160 // x and y scroll offsets
161 void output_to_canvas(EDL *edl, int single_channel, float &x, float &y);
162 // Convert coord from canvas to output position
163 void canvas_to_output(EDL *edl, int single_channel, float &x, float &y);
165 // Get dimensions of frame being sent to canvas
166 virtual int get_output_w(EDL *edl);
167 virtual int get_output_h(EDL *edl);
168 // Get if scrollbars exist
169 int scrollbars_exist();
170 // Get cursor locations relative to canvas and not offset by scrollbars
173 int get_buttonpress();
174 // Gets whatever video surface is enabled
175 BC_WindowBase* get_canvas();
177 // The owner of the canvas
178 BC_WindowBase *subwindow;
179 // Video surface if a subwindow
180 CanvasOutput *canvas_subwindow;
181 // Video surface if fullscreen
182 CanvasFullScreen *canvas_fullscreen;
183 CanvasXScroll *xscroll;
184 CanvasYScroll *yscroll;
185 CanvasPopup *canvas_menu;
186 CanvasFullScreenPopup *fullscreen_menu;
189 BC_WindowBase *canvas_auxwindow;
190 // Used in record monitor
191 int output_w, output_h;
192 // Last frame played is stored here in driver format for
194 VFrame *refresh_frame;
195 // Results from last get_scrollbars
200 // For cases where video is not enabled on the canvas but processing is
201 // occurring for a single frame, this causes the status to update.
204 // Cursor is inside video surface
216 void get_scrollbars(EDL *edl,
217 int &canvas_x, int &canvas_y, int &canvas_w, int &canvas_h);
222 class CanvasOutput : public BC_SubWindow
225 CanvasOutput(Canvas *canvas,
226 int x, int y, int w, int h);
229 int cursor_leave_event();
230 int cursor_enter_event();
231 int button_press_event();
232 int button_release_event();
233 int cursor_motion_event();
234 int keypress_event();
242 class CanvasFullScreen : public BC_FullScreen
245 CanvasFullScreen(Canvas *canvas, int w, int h);
254 class CanvasXScroll : public BC_ScrollBar
257 CanvasXScroll(EDL *edl,
272 class CanvasYScroll : public BC_ScrollBar
275 CanvasYScroll(EDL *edl,
291 class CanvasFullScreenPopup : public BC_PopupMenu
294 CanvasFullScreenPopup(Canvas *canvas);
296 void create_objects();
302 class CanvasSubWindowItem : public BC_MenuItem
305 CanvasSubWindowItem(Canvas *canvas);
310 class CanvasPopup : public BC_PopupMenu
313 CanvasPopup(Canvas *canvas);
316 void create_objects();
322 CanvasToggleControls *toggle_controls;
325 class CanvasZoomSize : public BC_MenuItem
328 CanvasZoomSize(Canvas *canvas);
333 class CanvasSizeSubMenu : public BC_SubMenu
336 CanvasSizeSubMenu(CanvasZoomSize *zoom_size);
338 CanvasZoomSize *zoom_size;
341 class CanvasPopupSize : public BC_MenuItem
344 CanvasPopupSize(Canvas *canvas, char *text, float percentage);
351 class CanvasPopupAuto : public BC_MenuItem
354 CanvasPopupAuto(Canvas *canvas);
359 class CanvasPopupResetCamera : public BC_MenuItem
362 CanvasPopupResetCamera(Canvas *canvas);
367 class CanvasPopupResetProjector : public BC_MenuItem
370 CanvasPopupResetProjector(Canvas *canvas);
375 class CanvasPopupCameraKeyframe : public BC_MenuItem
378 CanvasPopupCameraKeyframe(Canvas *canvas);
383 class CanvasPopupProjectorKeyframe : public BC_MenuItem
386 CanvasPopupProjectorKeyframe(Canvas *canvas);
391 class CanvasToggleControls : public BC_MenuItem
394 CanvasToggleControls(Canvas *canvas);
396 static char* calculate_text(int cwindow_controls);
400 class CanvasFullScreenItem : public BC_MenuItem
403 CanvasFullScreenItem(Canvas *canvas);
408 class CanvasPopupResetTranslation : public BC_MenuItem
411 CanvasPopupResetTranslation(Canvas *canvas);
417 class CanvasPopupRemoveSource : public BC_MenuItem
420 CanvasPopupRemoveSource(Canvas *canvas);