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
27 #include "mwindow.inc"
29 // Output for all X11 video
32 class CanvasFullScreen;
36 class CanvasFullScreenPopup;
37 class CanvasToggleControls;
39 // The EDL arguments can be set to 0 if the canvas_w and canvas_h are used
43 Canvas(MWindow *mwindow,
44 BC_WindowBase *subwindow,
55 // Get dimensions given a zoom
56 void calculate_sizes(float aspect_ratio,
62 // Lock access to the canvas pointer.
63 // Must be called before get_canvas or locking the canvas.
64 void lock_canvas(const char *location);
68 void create_objects(EDL *edl);
69 void set_cursor(int cursor);
70 // Start video playback
74 // Start single frame processing. Causes the status indicator to update
78 void start_fullscreen();
79 void stop_fullscreen();
81 // Don't call from inside the canvas
86 // Processing or video playback changed.
87 virtual void status_event() {};
90 virtual void reset_camera() {};
91 virtual void reset_projector() {};
92 virtual void zoom_resize_window(float percentage) {};
93 virtual void zoom_auto() {};
94 virtual int cursor_leave_event() { return 0; };
95 virtual int cursor_enter_event() { return 0; };
96 virtual int button_release_event() { return 0; };
97 virtual int button_press_event();
98 virtual int cursor_motion_event() { return 0; };
99 virtual void draw_overlays() { };
100 virtual void toggle_controls() { } ;
101 virtual int get_cwindow_controls() { return 0; };
102 virtual int get_fullscreen() { return 0; }
103 virtual void set_fullscreen(int value) { };
105 int cursor_leave_event_base(BC_WindowBase *caller);
106 int cursor_enter_event_base(BC_WindowBase *caller);
107 int button_press_event_base(BC_WindowBase *caller);
108 int keypress_event(BC_WindowBase *caller);
109 // Use menu different options for different windows
113 void use_auxwindow(BC_WindowBase *aux);
115 // Provide canvas dimensions since a BC_Bitmap containing obsolete dimensions
116 // is often the output being transferred to.
117 // This gets the input coordinates on the device output_frame
118 // and the corresponding output coordinates on the canvas.
119 // Must be floating point to support OpenGL.
120 void get_transfers(EDL *edl,
129 // passing -1 causes automatic size detection
132 void reposition_window(EDL *edl, int x, int y, int w, int h);
133 virtual void reset_translation() {};
134 virtual void close_source() {};
135 // Updates the stores
136 virtual void update_zoom(int x, int y, float zoom) {};
137 void check_boundaries(EDL *edl, int &x, int &y, float &zoom);
138 void update_scrollbars(int flush);
139 // Get scrollbar positions relative to output.
140 // No correction is done if output is smaller than canvas
141 virtual int get_xscroll() { return 0; };
142 virtual int get_yscroll() { return 0; };
143 virtual float get_zoom() { return 0; };
145 virtual void draw_refresh(int flush = 1) {};
147 // Get top left offset of canvas relative to output.
148 // Normally negative. Can be positive if output is smaller than canvas.
149 float get_x_offset(EDL *edl,
154 float get_y_offset(EDL *edl,
159 void get_zooms(EDL *edl,
167 // Convert coord from output to canvas position, including
168 // x and y scroll offsets
169 void output_to_canvas(EDL *edl, int single_channel, float &x, float &y);
170 // Convert coord from canvas to output position
171 void canvas_to_output(EDL *edl, int single_channel, float &x, float &y);
173 // Get dimensions of frame being sent to canvas
174 virtual int get_output_w(EDL *edl);
175 virtual int get_output_h(EDL *edl);
176 // Get if scrollbars exist
177 int scrollbars_exist();
178 // Get cursor locations relative to canvas and not offset by scrollbars
181 int get_buttonpress();
182 // Gets whatever video surface is enabled
183 BC_WindowBase* get_canvas();
185 // The owner of the canvas
186 BC_WindowBase *subwindow;
187 // Video surface if a subwindow
188 CanvasOutput *canvas_subwindow;
189 // Video surface if fullscreen
190 CanvasFullScreen *canvas_fullscreen;
191 CanvasXScroll *xscroll;
192 CanvasYScroll *yscroll;
193 CanvasPopup *canvas_menu;
194 CanvasFullScreenPopup *fullscreen_menu;
197 BC_WindowBase *canvas_auxwindow;
198 // Used in record monitor
199 int output_w, output_h;
200 // Last frame played is stored here in driver format for
202 VFrame *refresh_frame;
203 // Results from last get_scrollbars
208 // For cases where video is not enabled on the canvas but processing is
209 // occurring for a single frame, this causes the status to update.
211 // Cursor is inside video surface
223 void get_scrollbars(EDL *edl,
232 class CanvasOutput : public BC_SubWindow
235 CanvasOutput(Canvas *canvas,
242 int cursor_leave_event();
243 int cursor_enter_event();
244 int button_press_event();
245 int button_release_event();
246 int cursor_motion_event();
247 int keypress_event();
255 class CanvasFullScreen : public BC_FullScreen
258 CanvasFullScreen(Canvas *canvas,
269 class CanvasXScroll : public BC_ScrollBar
272 CanvasXScroll(EDL *edl,
287 class CanvasYScroll : public BC_ScrollBar
290 CanvasYScroll(EDL *edl,
306 class CanvasFullScreenPopup : public BC_PopupMenu
309 CanvasFullScreenPopup(Canvas *canvas);
311 void create_objects();
317 class CanvasSubWindowItem : public BC_MenuItem
320 CanvasSubWindowItem(Canvas *canvas);
325 class CanvasPopup : public BC_PopupMenu
328 CanvasPopup(Canvas *canvas);
331 void create_objects();
337 CanvasToggleControls *toggle_controls;
340 class CanvasPopupSize : public BC_MenuItem
343 CanvasPopupSize(Canvas *canvas, char *text, float percentage);
350 class CanvasPopupAuto : public BC_MenuItem
353 CanvasPopupAuto(Canvas *canvas);
358 class CanvasPopupResetCamera : public BC_MenuItem
361 CanvasPopupResetCamera(Canvas *canvas);
366 class CanvasPopupResetProjector : public BC_MenuItem
369 CanvasPopupResetProjector(Canvas *canvas);
374 class CanvasToggleControls : public BC_MenuItem
377 CanvasToggleControls(Canvas *canvas);
379 static char* calculate_text(int cwindow_controls);
383 class CanvasFullScreenItem : public BC_MenuItem
386 CanvasFullScreenItem(Canvas *canvas);
391 class CanvasPopupResetTranslation : public BC_MenuItem
394 CanvasPopupResetTranslation(Canvas *canvas);
400 class CanvasPopupRemoveSource : public BC_MenuItem
403 CanvasPopupRemoveSource(Canvas *canvas);