c5d53703a791cd34d9e6e6bd5b432ebcf04b9875
[goodguy/history.git] / cinelerra-5.1 / cinelerra / canvas.h
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
5  *
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.
10  *
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.
15  *
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
19  *
20  */
21
22 #ifndef CANVAS_H
23 #define CANVAS_H
24
25 #include "edl.inc"
26 #include "guicast.h"
27 #include "mwindow.inc"
28 #include "videodevice.inc"
29
30 // Output for all X11 video
31
32 class CanvasOutput;
33 class CanvasFullScreen;
34 class CanvasXScroll;
35 class CanvasYScroll;
36 class CanvasPopup;
37 class CanvasFullScreenPopup;
38 class CanvasToggleControls;
39
40 // The EDL arguments can be set to 0 if the canvas_w and canvas_h are used
41 class Canvas
42 {
43 public:
44         Canvas(MWindow *mwindow,
45                 BC_WindowBase *subwindow,
46                 int x,
47                 int y,
48                 int w,
49                 int h,
50                 int output_w,
51                 int output_h,
52                 int use_scrollbars);
53         virtual ~Canvas();
54
55         void reset();
56 // Get dimensions given a zoom
57         void calculate_sizes(float aspect_ratio,
58                 int output_w,
59                 int output_h,
60                 float zoom,
61                 int &w,
62                 int &h);
63 // Lock access to the canvas pointer.
64 // Must be called before get_canvas or locking the canvas.
65         void lock_canvas(const char *location);
66         void unlock_canvas();
67         int is_locked();
68
69         void create_objects(EDL *edl);
70         void set_cursor(int cursor);
71 // Start video playback
72         void start_video();
73         void stop_video();
74
75 // Start single frame processing.  Causes the status indicator to update
76         void start_single();
77         void stop_single();
78
79         void start_fullscreen();
80         void stop_fullscreen();
81
82 // Don't call from inside the canvas
83         void create_canvas();
84
85
86
87 // Processing or video playback changed.
88         virtual void status_event() {};
89
90
91         virtual void reset_camera() {};
92         virtual void reset_projector() {};
93         virtual void zoom_resize_window(float percentage) {};
94         virtual void zoom_auto() {};
95         virtual int cursor_leave_event() { return 0; };
96         virtual int cursor_enter_event() { return 0; };
97         virtual int button_release_event() { return 0; };
98         virtual int button_press_event();
99         virtual int cursor_motion_event() { return 0; };
100         virtual void draw_overlays() { };
101         virtual void toggle_controls() { } ;
102         virtual int get_cwindow_controls() { return 0; };
103         virtual int get_fullscreen() { return 0; }
104         virtual void set_fullscreen(int value) { };
105
106         int cursor_leave_event_base(BC_WindowBase *caller);
107         int cursor_enter_event_base(BC_WindowBase *caller);
108         int button_press_event_base(BC_WindowBase *caller);
109         int keypress_event(BC_WindowBase *caller);
110 // Use menu different options for different windows
111         void use_cwindow();
112         void use_rwindow();
113         void use_vwindow();
114         void use_auxwindow(BC_WindowBase *aux);
115
116 // Provide canvas dimensions since a BC_Bitmap containing obsolete dimensions
117 // is often the output being transferred to.
118 // This gets the input coordinates on the device output_frame
119 // and the corresponding output coordinates on the canvas.
120 // Must be floating point to support OpenGL.
121         void get_transfers(EDL *edl,
122                 float &output_x1,
123                 float &output_y1,
124                 float &output_x2,
125                 float &output_y2,
126                 float &canvas_x1,
127                 float &canvas_y1,
128                 float &canvas_x2,
129                 float &canvas_y2,
130 // passing -1 causes automatic size detection
131                 int canvas_w = -1,
132                 int canvas_h = -1);
133         void reposition_window(EDL *edl, int x, int y, int w, int h);
134         virtual void reset_translation() {};
135         virtual void close_source() {};
136 // Updates the stores
137         virtual void update_zoom(int x, int y, float zoom) {};
138         void check_boundaries(EDL *edl, int &x, int &y, float &zoom);
139         void update_scrollbars(int flush);
140 // Get scrollbar positions relative to output.
141 // No correction is done if output is smaller than canvas
142         virtual int get_xscroll() { return 0; };
143         virtual int get_yscroll() { return 0; };
144         virtual float get_zoom() { return 0; };
145 // Updates the refresh_frame
146         void update_refresh(VideoDevice *device, VFrame *output_frame);
147 // Redraws the refresh_frame
148         virtual void draw_refresh(int flush = 1) {};
149
150 // Get top left offset of canvas relative to output.
151 // Normally negative.  Can be positive if output is smaller than canvas.
152         float get_x_offset(EDL *edl,
153                 int single_channel,
154                 float zoom_x,
155                 float conformed_w,
156                 float conformed_h);
157         float get_y_offset(EDL *edl,
158                 int single_channel,
159                 float zoom_y,
160                 float conformed_w,
161                 float conformed_h);
162         void get_zooms(EDL *edl,
163                 int single_channel,
164                 float &zoom_x,
165                 float &zoom_y,
166                 float &conformed_w,
167                 float &conformed_h);
168
169
170 // Convert coord from output to canvas position, including
171 // x and y scroll offsets
172         void output_to_canvas(EDL *edl, int single_channel, float &x, float &y);
173 // Convert coord from canvas to output position
174         void canvas_to_output(EDL *edl, int single_channel, float &x, float &y);
175
176 // Get dimensions of frame being sent to canvas
177         virtual int get_output_w(EDL *edl);
178         virtual int get_output_h(EDL *edl);
179 // Get if scrollbars exist
180         int scrollbars_exist();
181 // Get cursor locations relative to canvas and not offset by scrollbars
182         int get_cursor_x();
183         int get_cursor_y();
184         int get_buttonpress();
185 // Gets whatever video surface is enabled
186         BC_WindowBase* get_canvas();
187
188 // The owner of the canvas
189         BC_WindowBase *subwindow;
190 // Video surface if a subwindow
191         CanvasOutput *canvas_subwindow;
192 // Video surface if fullscreen
193         CanvasFullScreen *canvas_fullscreen;
194         CanvasXScroll *xscroll;
195         CanvasYScroll *yscroll;
196         CanvasPopup *canvas_menu;
197         CanvasFullScreenPopup *fullscreen_menu;
198         int x, y, w, h;
199         int use_scrollbars;
200         BC_WindowBase *canvas_auxwindow;
201 // Used in record monitor
202         int output_w, output_h;
203 // Last frame played is stored here in driver format for
204 // refreshes.
205         VFrame *refresh_frame;
206 // Results from last get_scrollbars
207         int w_needed;
208         int h_needed;
209         int w_visible;
210         int h_visible;
211 // For cases where video is not enabled on the canvas but processing is
212 // occurring for a single frame, this causes the status to update.
213         int is_processing;
214 // Cursor is inside video surface
215         int cursor_inside;
216         int view_x;
217         int view_y;
218         int view_w;
219         int view_h;
220         int scr_w0;
221         int root_w, root_h;
222
223         MWindow *mwindow;
224
225 private:
226         void get_scrollbars(EDL *edl,
227                 int &canvas_x,
228                 int &canvas_y,
229                 int &canvas_w,
230                 int &canvas_h);
231         Mutex *canvas_lock;
232 };
233
234
235 class CanvasOutput : public BC_SubWindow
236 {
237 public:
238         CanvasOutput(Canvas *canvas,
239         int x,
240         int y,
241         int w,
242         int h);
243         ~CanvasOutput();
244
245         int cursor_leave_event();
246         int cursor_enter_event();
247         int button_press_event();
248         int button_release_event();
249         int cursor_motion_event();
250         int keypress_event();
251
252         Canvas *canvas;
253 };
254
255
256
257
258 class CanvasFullScreen : public BC_FullScreen
259 {
260 public:
261         CanvasFullScreen(Canvas *canvas,
262         int w,
263         int h);
264         ~CanvasFullScreen();
265
266         Canvas *canvas;
267 };
268
269
270
271
272 class CanvasXScroll : public BC_ScrollBar
273 {
274 public:
275         CanvasXScroll(EDL *edl,
276                 Canvas *canvas,
277                 int x,
278                 int y,
279                 int length,
280                 int position,
281                 int handle_length,
282                 int pixels);
283         ~CanvasXScroll();
284
285         int handle_event();
286         Canvas *canvas;
287         EDL *edl;
288 };
289
290 class CanvasYScroll : public BC_ScrollBar
291 {
292 public:
293         CanvasYScroll(EDL *edl,
294                 Canvas *canvas,
295                 int x,
296                 int y,
297                 int length,
298                 int position,
299                 int handle_length,
300                 int pixels);
301         ~CanvasYScroll();
302
303         int handle_event();
304
305         Canvas *canvas;
306         EDL *edl;
307 };
308
309 class CanvasFullScreenPopup : public BC_PopupMenu
310 {
311 public:
312         CanvasFullScreenPopup(Canvas *canvas);
313
314         void create_objects();
315         void use_cwindow();
316
317         Canvas *canvas;
318 };
319
320 class CanvasSubWindowItem : public BC_MenuItem
321 {
322 public:
323         CanvasSubWindowItem(Canvas *canvas);
324         int handle_event();
325         Canvas *canvas;
326 };
327
328 class CanvasPopup : public BC_PopupMenu
329 {
330 public:
331         CanvasPopup(Canvas *canvas);
332         ~CanvasPopup();
333
334         void create_objects();
335         void use_cwindow();
336         void use_rwindow();
337         void use_vwindow();
338
339         Canvas *canvas;
340         CanvasToggleControls *toggle_controls;
341 };
342
343 class CanvasPopupSize : public BC_MenuItem
344 {
345 public:
346         CanvasPopupSize(Canvas *canvas, char *text, float percentage);
347         ~CanvasPopupSize();
348         int handle_event();
349         Canvas *canvas;
350         float percentage;
351 };
352
353 class CanvasPopupAuto : public BC_MenuItem
354 {
355 public:
356         CanvasPopupAuto(Canvas *canvas);
357         int handle_event();
358         Canvas *canvas;
359 };
360
361 class CanvasPopupResetCamera : public BC_MenuItem
362 {
363 public:
364         CanvasPopupResetCamera(Canvas *canvas);
365         int handle_event();
366         Canvas *canvas;
367 };
368
369 class CanvasPopupResetProjector : public BC_MenuItem
370 {
371 public:
372         CanvasPopupResetProjector(Canvas *canvas);
373         int handle_event();
374         Canvas *canvas;
375 };
376
377 class CanvasToggleControls : public BC_MenuItem
378 {
379 public:
380         CanvasToggleControls(Canvas *canvas);
381         int handle_event();
382         static char* calculate_text(int cwindow_controls);
383         Canvas *canvas;
384 };
385
386 class CanvasFullScreenItem : public BC_MenuItem
387 {
388 public:
389         CanvasFullScreenItem(Canvas *canvas);
390         int handle_event();
391         Canvas *canvas;
392 };
393
394 class CanvasPopupResetTranslation : public BC_MenuItem
395 {
396 public:
397         CanvasPopupResetTranslation(Canvas *canvas);
398         int handle_event();
399         Canvas *canvas;
400 };
401
402
403 class CanvasPopupRemoveSource : public BC_MenuItem
404 {
405 public:
406         CanvasPopupRemoveSource(Canvas *canvas);
407         int handle_event();
408         Canvas *canvas;
409 };
410
411
412
413
414
415 #endif