lib/prawn/svg/parser.rb in prawn-svg-0.16.0 vs lib/prawn/svg/parser.rb in prawn-svg-0.16.1

- old
+ new

@@ -121,30 +121,39 @@ [x(x), y(y)] end element.add_call "polygon", *points when 'circle' + xy, r = [x(attrs['cx'] || "0"), y(attrs['cy'] || "0")], distance(attrs['r']) + + return if zero_argument?(r) + if USE_NEW_CIRCLE_CALL - element.add_call "circle", - [x(attrs['cx'] || "0"), y(attrs['cy'] || "0")], distance(attrs['r']) + element.add_call "circle", xy, r else - element.add_call "circle_at", - [x(attrs['cx'] || "0"), y(attrs['cy'] || "0")], :radius => distance(attrs['r']) + element.add_call "circle_at", xy, :radius => r end when 'ellipse' - element.add_call USE_NEW_ELLIPSE_CALL ? "ellipse" : "ellipse_at", - [x(attrs['cx'] || "0"), y(attrs['cy'] || "0")], distance(attrs['rx']), distance(attrs['ry']) + xy, rx, ry = [x(attrs['cx'] || "0"), y(attrs['cy'] || "0")], distance(attrs['rx']), distance(attrs['ry']) + return if zero_argument?(rx, ry) + + element.add_call USE_NEW_ELLIPSE_CALL ? "ellipse" : "ellipse_at", xy, rx, ry + when 'rect' - radius = distance(attrs['rx'] || attrs['ry']) - args = [[x(attrs['x'] || '0'), y(attrs['y'] || '0')], distance(attrs['width']), distance(attrs['height'])] + xy = [x(attrs['x'] || '0'), y(attrs['y'] || '0')] + width, height = distance(attrs['width']), distance(attrs['height']) + radius = distance(attrs['rx'] || attrs['ry']) + + return if zero_argument?(width, height) + if radius # n.b. does not support both rx and ry being specified with different values - element.add_call "rounded_rectangle", *(args + [radius]) + element.add_call "rounded_rectangle", xy, width, height, radius else - element.add_call "rectangle", *args + element.add_call "rectangle", xy, width, height end when 'path' parse_path(element) @@ -236,9 +245,13 @@ missing_attrs = attrs - element.attributes.keys if missing_attrs.any? @document.warnings << "Must have attributes #{missing_attrs.join(", ")} on tag #{element.name}; skipping tag" end missing_attrs.empty? + end + + def zero_argument?(*args) + args.any? {|arg| arg.nil? || arg <= 0} end %w(x y distance).each do |method| define_method(method) {|*a| @document.send(method, *a)} end