blob: 1235a66dd138a24379ed35e9b3d107ba6e551a4d [file] [log] [blame]
-- modeltype HSVTree: '../../model/HSVTree.ecore'; -- modeltype instead of import to match QVTo
import 'HSVTree.ecore'::HSVTree; -- modeltype instead of import to match QVTo
import 'HSLTree.ecore'::HSLTree; -- No name because we defined the package
import hsv2hsl_0 : 'HSV2HSL.ecore'::HSV2HSL; -- A name is useful to define an alias for the same metamodel
-- library '../../myOclHelper.ocl'; -- Import a complete OCL with helpers
transformation hsv2hsl {
hsv imports HSVTree; -- Should specify the correct package
hsl imports HSLTree; --
-- hsl imports "strict" HSLTree; --
-- hsl imports HSLTree{strict}; -- The model has to strictly conform to the HSLTree mm, without strict the model can have classes that match the name but not completely conform to the mm
middle imports HSV2HSL;
query hsl2rgb(color : HSLTree::HSL) : HSV2HSL::RGB;
query hsv2rgb(color : HSVTree::HSV) : HSV2HSL::RGB;
query rgb2hsl(color : HSV2HSL::RGB) : HSLTree::HSL;
query rgb2hsv(color : HSV2HSL::RGB) : HSVTree::HSV;
entry __root__ input hsv output hsl {
append nodes : HSVTree::HSVNode;
for hsvRoot : HSVTree::HSVNode in nodes {
call HSV2MiddleRoot {
hsvRoot iterates hsvRoot;
}
}
}
map HSV2MiddleRoot { -- Mapping root nodes L to M
guard:hsv hsvRoot : HSVNode;
check hsvRoot.parent = null;
new:middle middleRoot : HSVNode2HSLNode;
set middleRoot.hsv := hsvRoot;
set middleRoot.name := hsvRoot.name;
-- set middleRoot.rgb := hsv2rgb(hsvRoot.hsv);
for hsvChild in hsvRoot.children { -- recursive call to visit children
call HSV2MiddleRecursion {
hsvNode iterates hsvChild;
middleParent uses middleRoot;
}
}
call Middle2HSLRoot { -- invoke middle to outset mapping
middleNode uses middleRoot;
}
}
map HSV2MiddleRecursion { -- Mapping child nodes L to M
guard:hsv hsvNode : HSVNode;
in:middle middleParent : HSVNode2HSLNode;
new:middle middleNode : HSVNode2HSLNode;
set middleNode.parent := middleParent;
set middleNode.hsv := hsvNode;
set middleNode.name := hsvNode.name;
-- set middleNode.rgb := hsv2rgb(hsvNode.hsv);
for hsvChild in hsvNode.children { -- recursive call to visit children
call HSV2MiddleRecursion {
hsvNode iterates hsvChild;
middleParent uses middleNode;
}
}
}
map Middle2HSLRoot { -- Mapping root nodes M to R
in:middle middleNode : HSVNode2HSLNode;
new:hsl hslNode : HSLNode;
set hslNode.parent := null;
set middleNode.hsl := hslNode;
set hslNode.name := middleNode.name;
-- set hslNode.hsl := rgb2hsl(middleNode.rgb);
for middleChild in middleNode.children { -- recursive call to visit children
call Middle2HSLRecursion {
middleNode iterates middleChild;
}
}
}
map Middle2HSLRecursion { -- Mapping child nodes M to R
guard:middle middleNode : HSVNode2HSLNode;
new:hsl hslNode : HSLNode;
set hslNode.parent := middleNode.parent.hsl;
set middleNode.hsl := hslNode;
set hslNode.name := middleNode.name;
-- set hslNode.hsl := rgb2hsl(middleNode.rgb);
for middleChild in middleNode.children { -- recursive call to visit children
call Middle2HSLRecursion {
middleNode iterates middleChild;
}
}
}
}