1 #include<HYDROOperations_Factory.h>
3 #include<HYDROData_Document.h>
4 #include<HYDROData_Iterator.h>
6 #include<ImageComposer_ColorMaskOperator.h>
7 #include<ImageComposer_CropOperator.h>
8 #include<ImageComposer_CutOperator.h>
9 #include<ImageComposer_FuseOperator.h>
10 #include<ImageComposer_Image.h>
15 HYDROOperations_Factory* FACTORY = 0;
17 HYDROOperations_Factory* HYDROOperations_Factory::Factory()
20 FACTORY = new HYDROOperations_Factory;
22 REGISTER_HYDRO_OPERATION(ImageComposer_ColorMaskOperator)
23 REGISTER_HYDRO_OPERATION(ImageComposer_CropOperator)
24 REGISTER_HYDRO_OPERATION(ImageComposer_CutOperator)
25 REGISTER_HYDRO_OPERATION(ImageComposer_FuseOperator)
30 ImageComposer_Operator* HYDROOperations_Factory::Operator(const QString theName) const
32 if (myOps.contains(theName)) {
33 return myOps[theName];
38 void HYDROOperations_Factory::Register(
39 ImageComposer_Operator* theOperator)
41 FACTORY->myOps[QString(typeid(*theOperator).name())] = theOperator;
44 HYDROOperations_Factory::HYDROOperations_Factory()
48 ImageComposer_Operator* HYDROOperations_Factory::Operator(
49 Handle(HYDROData_Image) theImage) const
51 // retreive operator instance by name
52 ImageComposer_Operator* anOp = Operator(theImage->OperatorName());
55 // fill arguments of the operator from theImage
57 anOp->setBinArgs(theImage->Args());
61 Handle(HYDROData_Image) HYDROOperations_Factory::CreateImage(
62 Handle(HYDROData_Document) theDoc, const ImageComposer_Operator* theOperator)
65 Handle(HYDROData_Image) anImage =
66 Handle(HYDROData_Image)::DownCast(theDoc->CreateObject(KIND_IMAGE));
67 // get data from operation
69 anImage->SetOperatorName(QString(typeid(*theOperator).name()));
70 anImage->SetArgs(theOperator->getBinArgs());
75 void HYDROOperations_Factory::UpdateImage(
76 Handle_HYDROData_Document theDoc, Handle(HYDROData_Image) theImage)
78 // fill by arguments and process the operation
79 ImageComposer_Operator* anOp = Operator(theImage);
80 if (anOp) { // update image only if there is an operation
81 QTransform aTransform;
82 ImageComposer_Image anImage1; // first referenced image
83 if (theImage->NbReferences()) {
84 Handle(HYDROData_Image) anImage = theImage->Reference(0);
85 anImage1 = anImage->Image();
86 anImage1.setTransform(anImage->Trsf());
87 aTransform = anImage1.transform();
89 ImageComposer_Image anImage2; // second referenced image
90 if (theImage->NbReferences() > 1) {
91 Handle(HYDROData_Image) anImage = theImage->Reference(1);
92 anImage2 = anImage->Image();
93 anImage2.setTransform(anImage->Trsf());
95 ImageComposer_Image aResImg = anOp->process(anImage1, anImage2);
96 theImage->SetImage(aResImg);
97 theImage->SetTrsf(aTransform);
99 // change the states of this and all depended images
100 theImage->MustBeUpdated(true);
101 SetMustBeUpdatedImages(theDoc);
102 theImage->MustBeUpdated(false);
105 void HYDROOperations_Factory::SetMustBeUpdatedImages(
106 Handle_HYDROData_Document theDoc) const
108 bool aChanged = true;
109 // iterate until there is no changes because images on all level of dependency must be updated
112 HYDROData_Iterator anIter(theDoc, KIND_IMAGE);
113 for(; anIter.More(); anIter.Next()) {
114 Handle(HYDROData_Image) anImage =
115 Handle(HYDROData_Image)::DownCast(anIter.Current());
116 if (!anImage->MustBeUpdated()) {
117 int a, aNBRefs = anImage->NbReferences();
118 for(a = 0; a < aNBRefs; a++) {
119 if (anImage->Reference(a)->MustBeUpdated()) {
120 // image references to updated => also must be updated
121 anImage->MustBeUpdated(true);