add preset mask shapes, add ctr/nrml btns, new igor icons, enables apply to mask...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / maskauto.C
index 8b5a2a4222d35a501cc9c2cb2cb457227da9cde8..e490f4c854334bf259f9a1bc4958ebabe2cef1e6 100644 (file)
@@ -96,10 +96,12 @@ int SubMask::operator==(SubMask& ptr)
        return equivalent(ptr);
 }
 
-void SubMask::copy_from(SubMask& ptr)
+void SubMask::copy_from(SubMask& ptr, int do_name)
 {
-       memset(name, 0, sizeof(name));
-       strncpy(name, ptr.name, sizeof(name-1));
+       if( do_name ) {
+               memset(name, 0, sizeof(name));
+               strncpy(name, ptr.name, sizeof(name-1));
+       }
        fader = ptr.fader;
        feather = ptr.feather;
        points.remove_all_objects();
@@ -140,7 +142,8 @@ void SubMask::copy(FileXML *file)
        if(points.total)
        {
                file->tag.set_title("MASK");
-               file->tag.set_property("NUMBER", keyframe->masks.number_of(this));
+               file->tag.set_property("NUMBER",
+                       !keyframe ? -1 : keyframe->masks.number_of(this));
                file->tag.set_property("NAME", name);
                file->tag.set_property("FADER", fader);
                file->tag.set_property("FEATHER", feather);
@@ -174,12 +177,12 @@ void SubMask::copy(FileXML *file)
        }
 }
 
-void SubMask::dump()
+void SubMask::dump(FILE *fp)
 {
        for( int i=0; i<points.size(); ++i ) {
-               printf("        mask: %d, name: %s, fader: %f, feather %f\n", i,
+               fprintf(fp, "   mask: %d, name: %s, fader: %f, feather %f\n", i,
                        name, fader, feather);
-               printf("          point=%d x=%.2f y=%.2f in_x=%.2f in_y=%.2f out_x=%.2f out_y=%.2f\n",
+               fprintf(fp, "     point=%d x=%.2f y=%.2f in_x=%.2f in_y=%.2f out_x=%.2f out_y=%.2f\n",
                        i, points.values[i]->x, points.values[i]->y,
                        points.values[i]->control_x1, points.values[i]->control_y1,
                        points.values[i]->control_x2, points.values[i]->control_y2);
@@ -345,9 +348,9 @@ void MaskAuto::set_points(ArrayList<MaskPoint*> *points,
 void MaskAuto::load(FileXML *file)
 {
 // legacy, moved to SubMask
-       int old_mode = file->tag.get_property("MODE", MASK_MULTIPLY_ALPHA);
-       int old_feather = file->tag.get_property("FEATHER", 0);
+       int old_mode = file->tag.get_property("MODE", -1);
        int old_value = file->tag.get_property("VALUE", 100);
+       float old_feather = file->tag.get_property("FEATHER", 0);
        apply_before_plugins = file->tag.get_property("APPLY_BEFORE_PLUGINS", apply_before_plugins);
        disable_opengl_masking = file->tag.get_property("DISABLE_OPENGL_MASKING", disable_opengl_masking);
        for( int i=0; i<masks.size(); ++i ) {
@@ -368,12 +371,11 @@ void MaskAuto::load(FileXML *file)
                        strncpy(mask->name, name, sizeof(mask->name));
                        mask->feather = file->tag.get_property("FEATHER", old_feather);
                        mask->fader = file->tag.get_property("FADER", old_value);
-                       if( old_mode == MASK_SUBTRACT_ALPHA )
+                       if( old_mode == MASK_MULTIPLY_ALPHA )
                                mask->fader = -mask->fader;
                        mask->load(file);
                }
        }
-//     dump();
 }
 
 void MaskAuto::copy(int64_t start, int64_t end, FileXML *file, int default_auto)
@@ -393,11 +395,13 @@ void MaskAuto::copy(int64_t start, int64_t end, FileXML *file, int default_auto)
        file->append_newline();
 }
 
-void MaskAuto::dump()
+void MaskAuto::dump(FILE *fp)
 {
+       fprintf(fp,"mask_auto:  apply_before_plugins %d, disable_opengl_masking %d\n",
+               apply_before_plugins, disable_opengl_masking);
        for( int i=0; i<masks.size(); ++i ) {
-               printf("         submask %d\n", i);
-               masks.values[i]->dump();
+               fprintf(fp,"    submask %d:\n", i);
+               masks.values[i]->dump(fp);
        }
 }
 
@@ -435,4 +439,17 @@ void MaskAuto::scale_submasks(int orig_scale, int new_scale)
        }
 }
 
+int MaskAuto::has_active_mask()
+{
+       int total_points = 0;
+       float min_fader = 100;
+       for( int i=0; i<masks.size(); ++i ) {
+               SubMask *mask = get_submask(i);
+               int submask_points = mask->points.size();
+               if( submask_points > 1 ) total_points += submask_points;
+               int fader = mask->fader;
+               if( fader < min_fader ) min_fader = fader;
+       }
+       return min_fader >= 0 && total_points < 2 ? 0 : 1;
+}