identity sh-f11=cam/sh-f12=proj keyframes, odd jpeg fix, zoom submenu, shudmp
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / panautos.C
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 #include "automation.inc"
23 #include "panauto.h"
24 #include "panautos.h"
25 #include "transportque.inc"
26
27 PanAutos::PanAutos(EDL *edl, Track *track)
28  : Autos(edl, track)
29 {
30         type = AUTOMATION_TYPE_PAN;
31 }
32
33 PanAutos::~PanAutos()
34 {
35 }
36
37
38 Auto* PanAutos::new_auto()
39 {
40         return new PanAuto(edl, this);
41 }
42
43 void PanAutos::get_handle(int &handle_x,
44                 int &handle_y,
45                 int64_t position,
46                 int direction,
47                 PanAuto* &previous,
48                 PanAuto* &next)
49 {
50         previous = (PanAuto*)get_prev_auto(position, direction, (Auto* &)previous);
51         next = (PanAuto*)get_next_auto(position, direction, (Auto* &)next);
52
53 // Constant
54         if(previous->handle_x == next->handle_x &&
55                 previous->handle_y == next->handle_y)
56         {
57                 handle_x = previous->handle_x;
58                 handle_y = previous->handle_y;
59                 return;
60         }
61
62 // Interpolate
63         int64_t total = labs(next->position - previous->position);
64         double fraction;
65         if(direction == PLAY_FORWARD)
66         {
67                 fraction = (double)(position - previous->position) / total;
68         }
69         else
70         {
71                 fraction = (double)(previous->position - position) / total;
72         }
73
74         handle_x = (int)(previous->handle_x + (next->handle_x - previous->handle_x) * fraction);
75         handle_y = (int)(previous->handle_y + (next->handle_y - previous->handle_y) * fraction);
76 }
77
78 void PanAutos::dump()
79 {
80         printf("        PanAutos::dump %p\n", this);
81         printf("        Default: position %jd\n", default_auto->position);
82         ((PanAuto*)default_auto)->dump();
83         for(Auto* current = first; current; current = NEXT)
84         {
85                 printf("        position %jd\n", current->position);
86                 ((PanAuto*)current)->dump();
87         }
88 }