canvas/svg.nas add optional basic support for linked images
canvas/api.nas add alternative signature for ellipse and circle
This commit is contained in:
parent
07ac341b70
commit
a91ebe4676
2 changed files with 42 additions and 5 deletions
|
@ -1005,11 +1005,17 @@ var Path = {
|
||||||
#
|
#
|
||||||
# @param rx radius x
|
# @param rx radius x
|
||||||
# @param ry radius y
|
# @param ry radius y
|
||||||
# @param cx (optional) center x coordinate
|
# @param cx (optional) center x coordinate or vector [cx, cy]
|
||||||
# @param cy (optional) center y coordinate
|
# @param cy (optional) center y coordinate
|
||||||
ellipse: func(rx, ry, cx = nil, cy = nil) {
|
ellipse: func(rx, ry, cx = nil, cy = nil) {
|
||||||
cx = num(cx) or 0;
|
if (typeof(cx) == "vector") {
|
||||||
cy = num(cy) or 0;
|
cy = cx[1];
|
||||||
|
cx = cx[0];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cx = num(cx) or 0;
|
||||||
|
cy = num(cy) or 0;
|
||||||
|
}
|
||||||
me.moveTo(cx - rx, cy)
|
me.moveTo(cx - rx, cy)
|
||||||
.arcSmallCW(rx, ry, 0, 2*rx, 0)
|
.arcSmallCW(rx, ry, 0, 2*rx, 0)
|
||||||
.arcSmallCW(rx, ry, 0, -2*rx, 0);
|
.arcSmallCW(rx, ry, 0, -2*rx, 0);
|
||||||
|
@ -1020,7 +1026,7 @@ var Path = {
|
||||||
# Add a circle to the path
|
# Add a circle to the path
|
||||||
#
|
#
|
||||||
# @param r radius
|
# @param r radius
|
||||||
# @param cx (optional) center x coordinate
|
# @param cx (optional) center x coordinate or vector [cx, cy]
|
||||||
# @param cy (optional) center y coordinate
|
# @param cy (optional) center y coordinate
|
||||||
circle: func(r, cx = nil, cy = nil) {
|
circle: func(r, cx = nil, cy = nil) {
|
||||||
return me.ellipse(r, r, cx, cy);
|
return me.ellipse(r, r, cx, cy);
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
# @param group The canvas.Group instance to append the parsed elements to
|
# @param group The canvas.Group instance to append the parsed elements to
|
||||||
# @param path The path of the svg file (absolute or relative to FG_ROOT)
|
# @param path The path of the svg file (absolute or relative to FG_ROOT)
|
||||||
# @param options Optional hash of options
|
# @param options Optional hash of options
|
||||||
|
# font-mapper func
|
||||||
|
# parse_images bool
|
||||||
var parsesvg = func(group, path, options = nil)
|
var parsesvg = func(group, path, options = nil)
|
||||||
{
|
{
|
||||||
if( !isa(group, Group) )
|
if( !isa(group, Group) )
|
||||||
|
@ -572,7 +574,7 @@ var parsesvg = func(group, path, options = nil)
|
||||||
if( dash and size(dash) > 3 )
|
if( dash and size(dash) > 3 )
|
||||||
# at least 2 comma separated values...
|
# at least 2 comma separated values...
|
||||||
stack[-1].setStrokeDashArray(split(',', dash));
|
stack[-1].setStrokeDashArray(split(',', dash));
|
||||||
}
|
} #end path/rect/ellipse/circle
|
||||||
else if( name == "use" )
|
else if( name == "use" )
|
||||||
{
|
{
|
||||||
var ref = attr["xlink:href"];
|
var ref = attr["xlink:href"];
|
||||||
|
@ -595,6 +597,35 @@ var parsesvg = func(group, path, options = nil)
|
||||||
append(defs_stack, "defs");
|
append(defs_stack, "defs");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (name == "image" and options["parse_images"])
|
||||||
|
{
|
||||||
|
var ref = attr["xlink:href"];
|
||||||
|
# ref must not be missing and shall not contain Windows path separator
|
||||||
|
# find("\\") is correct, backslash is control character and must be escaped
|
||||||
|
# by adding another backslash - otherwise parse error anywhere below
|
||||||
|
if (ref == nil or find("\\", ref) > -1)
|
||||||
|
{
|
||||||
|
return printlog("info", "Invalid or missing href in image tag: '" ~ ref ~ "'");
|
||||||
|
}
|
||||||
|
if (substr(ref, 0, 5) == "data:") {
|
||||||
|
return printlog("info", "Unsupported embedded image");
|
||||||
|
}
|
||||||
|
elsif (substr(ref, 0, 5) != "file:") {
|
||||||
|
# absolute paths seem to start with "file:"
|
||||||
|
# prepend relative paths with the path of SVG file and hope the image is there
|
||||||
|
# file access limitations apply
|
||||||
|
ref = io.dirname(path) ~ ref;
|
||||||
|
}
|
||||||
|
pushElement("image", attr["id"]);
|
||||||
|
|
||||||
|
if (attr["x"] != nil and attr["y"] != nil) {
|
||||||
|
stack[-1].setTranslation(attr["x"], attr["y"]);
|
||||||
|
}
|
||||||
|
if (attr["width"] != nil and attr["height"] != nil) {
|
||||||
|
stack[-1].setSize(attr["width"], attr["height"]);
|
||||||
|
}
|
||||||
|
stack[-1].setFile(ref);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printlog("info", "Skipping unknown element '" ~ name ~ "'");
|
printlog("info", "Skipping unknown element '" ~ name ~ "'");
|
||||||
|
|
Loading…
Reference in a new issue