r870: Merge 2.1:
[cinelerra_cv.git] / cinelerra / floatauto.C
blob135c797983999e68e4a528143352e9bf766ed7f9
1 #include "autos.h"
2 #include "clip.h"
3 #include "edl.h"
4 #include "filexml.h"
5 #include "floatauto.h"
6 #include "localsession.h"
8 FloatAuto::FloatAuto(EDL *edl, FloatAutos *autos)
9  : Auto(edl, (Autos*)autos)
11         value = 0;
12         control_in_value = 0;
13         control_out_value = 0;
14         control_in_position = 0;
15         control_out_position = 0;
18 FloatAuto::~FloatAuto()
22 int FloatAuto::operator==(Auto &that)
24         return identical((FloatAuto*)&that);
28 int FloatAuto::operator==(FloatAuto &that)
30         return identical((FloatAuto*)&that);
34 int FloatAuto::identical(FloatAuto *src)
36         return EQUIV(value, src->value) &&
37                 EQUIV(control_in_value, src->control_in_value) &&
38                 EQUIV(control_out_value, src->control_out_value) &&
39                 control_in_position == src->control_in_position &&
40                 control_out_position == src->control_out_position;
43 float FloatAuto::value_to_percentage()
45         if(!edl) return 0;
46         float automation_min = edl->local_session->automation_min;
47         float automation_max = edl->local_session->automation_max;
48         float automation_range = automation_max - automation_min;
49         return (value - automation_min) / automation_range;
52 float FloatAuto::invalue_to_percentage()
54         if(!edl) return 0;
55         float automation_min = edl->local_session->automation_min;
56         float automation_max = edl->local_session->automation_max;
57         float automation_range = automation_max - automation_min;
58         return (value + control_in_value - automation_min) / 
59                 automation_range;
62 float FloatAuto::outvalue_to_percentage()
64         if(!edl) return 0;
65         float automation_min = edl->local_session->automation_min;
66         float automation_max = edl->local_session->automation_max;
67         float automation_range = automation_max - automation_min;
68         return (value + control_out_value - automation_min) / 
69                 automation_range;
72 // float FloatAuto::percentage_to_value(float percentage)
73 // {
74 //      return percentage * (autos->max - autos->min) + autos->min;
75 // }
76 // 
77 // float FloatAuto::percentage_to_invalue(float percentage)
78 // {
79 //      return percentage * (autos->max - autos->min) + autos->min - value;
80 // }
81 // 
82 // float FloatAuto::percentage_to_outvalue(float percentage)
83 // {
84 //      return percentage * (autos->max - autos->min) + autos->min - value;
85 // }
87 void FloatAuto::copy_from(Auto *that)
89         copy_from((FloatAuto*)that);
92 void FloatAuto::copy_from(FloatAuto *that)
94         Auto::copy_from(that);
95         this->value = that->value;
96         this->control_in_value = that->control_in_value;
97         this->control_out_value = that->control_out_value;
98         this->control_in_position = that->control_in_position;
99         this->control_out_position = that->control_out_position;
102 int FloatAuto::value_to_str(char *string, float value)
104         int j = 0, i = 0;
105         if(value > 0) 
106                 sprintf(string, "+%.2f", value);
107         else
108                 sprintf(string, "%.2f", value);
110 // fix number
111         if(value == 0)
112         {
113                 j = 0;
114                 string[1] = 0;
115         }
116         else
117         if(value < 1 && value > -1) 
118         {
119                 j = 1;
120                 string[j] = string[0];
121         }
122         else 
123         {
124                 j = 0;
125                 string[3] = 0;
126         }
127         
128         while(string[j] != 0) string[i++] = string[j++];
129         string[i] = 0;
131         return 0;
134 void FloatAuto::copy(int64_t start, int64_t end, FileXML *file, int default_auto)
136         file->tag.set_title("AUTO");
137         if(default_auto)
138                 file->tag.set_property("POSITION", 0);
139         else
140                 file->tag.set_property("POSITION", position - start);
141         file->tag.set_property("VALUE", value);
142         file->tag.set_property("CONTROL_IN_VALUE", control_in_value);
143         file->tag.set_property("CONTROL_OUT_VALUE", control_out_value);
144         file->tag.set_property("CONTROL_IN_POSITION", control_in_position);
145         file->tag.set_property("CONTROL_OUT_POSITION", control_out_position);
146         file->append_tag();
147         file->tag.set_title("/AUTO");
148         file->append_tag();
149         file->append_newline();
152 void FloatAuto::load(FileXML *file)
154         value = file->tag.get_property("VALUE", value);
155         control_in_value = file->tag.get_property("CONTROL_IN_VALUE", control_in_value);
156         control_out_value = file->tag.get_property("CONTROL_OUT_VALUE", control_out_value);
157         control_in_position = file->tag.get_property("CONTROL_IN_POSITION", control_in_position);
158         control_out_position = file->tag.get_property("CONTROL_OUT_POSITION", control_out_position);