113 lines
3 KiB
Groff
113 lines
3 KiB
Groff
# Canvas backward support for using 3.0 API with FlightGear 2.8
|
|
|
|
(func {
|
|
|
|
# 2.8 uses multiple properties for representing a color. Also different names
|
|
# are used for the colors and no CSS syntax like #rrggbb are supported.
|
|
var color_components = ["red", "green", "blue", "alpha"];
|
|
var setColorNodes = func(obj, name, color)
|
|
{
|
|
if( size(color) == 1 )
|
|
color = color[0];
|
|
|
|
if( typeof(color) != "vector" )
|
|
debug.warn("Wrong type for color");
|
|
else if( size(color) < 3 or size(color) > 4 )
|
|
debug.warn("Color needs 3 or 4 values (RGB or RGBA)");
|
|
else
|
|
{
|
|
var node = obj._node.getNode(name, 1);
|
|
for(var i = 0; i < size(color_components); i += 1)
|
|
node.getNode(color_components[i], 1)
|
|
.setDoubleValue( i < size(color) ? color[i]
|
|
: 1 ); # default alpha is 1
|
|
}
|
|
|
|
return obj;
|
|
};
|
|
|
|
Element.setColor = func setColorNodes(me, "color", arg);
|
|
Element.setColorFill = func {
|
|
setColorNodes(me, "color-fill", arg);
|
|
me.setBool("fill", 1);
|
|
};
|
|
Path.setColor = Element.setColor;
|
|
Path.setColorFill = Element.setColorFill;
|
|
Text.setColor = Element.setColor;
|
|
Text.setColorFill = Element.setColorFill;
|
|
|
|
#
|
|
Canvas.setColorBackground = func()
|
|
{
|
|
me._node = me.texture;
|
|
setColorNodes(me, "color-background", arg);
|
|
};
|
|
|
|
# 2.8 uses multiple properties instead of a single string property
|
|
Canvas.setStrokeDashArray = func(pattern)
|
|
{
|
|
me._node.removeChildren('stroke-dasharray');
|
|
|
|
if( typeof(pattern) == 'vector' )
|
|
me._node.setValues({'stroke-dasharray': pattern});
|
|
else
|
|
debug.warn("setStrokeDashArray: vector expected!");
|
|
|
|
return me;
|
|
};
|
|
|
|
# Create a canvas object from the given node. Used instead of ghost available
|
|
# in newer FG versions.
|
|
var makeCanvas = func(node)
|
|
{
|
|
return {
|
|
_node_ghost: node._g,
|
|
createGroup: func props.wrapNode(me._node_ghost).addChild("group", 0, 0)._g
|
|
};
|
|
};
|
|
|
|
# Internal helper for creating a canvas.
|
|
#
|
|
# @note In 2.9+ this function is replaced by a C++ function. This
|
|
# implementation is just used as fallback for 2.8 and for usage
|
|
# in other programs.
|
|
canvas._newCanvasGhost = func()
|
|
{
|
|
return makeCanvas( Canvas.property_root.addChild("texture", 0, 0) );
|
|
};
|
|
|
|
# Internal helper for retrieving an existing canvas.
|
|
#
|
|
canvas._getCanvasGhost = func(arg_ghost)
|
|
{
|
|
var arg = props.wrapNode(arg_ghost);
|
|
|
|
# get a canvas specified by its root node
|
|
if( Canvas.property_root.getPath() == arg.getParent().getPath() )
|
|
var node = Canvas.property_root.getChild("texture", arg.getIndex());
|
|
|
|
# get a canvas by its name
|
|
else if( (var name = arg.getChild("name")) != nil )
|
|
{
|
|
name = name.getValue();
|
|
var node = nil;
|
|
foreach(var c; Canvas.property_root.getChildren("texture"))
|
|
{
|
|
if( c.getValue("name") == name )
|
|
node_canvas = c;
|
|
}
|
|
}
|
|
|
|
# get a canvas by its index
|
|
else if( (var index = arg.getChild("index")) != nil )
|
|
var node = Canvas.property_root.getChild("texture", index.getValue());
|
|
|
|
if( node == nil )
|
|
return nil;
|
|
|
|
return makeCanvas( node );
|
|
};
|
|
|
|
print("Canvas API: FlightGear 2.8 backward support loaded.");
|
|
|
|
})();
|