You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
4.1 KiB
143 lines
4.1 KiB
module Squib |
|
# @api private |
|
class Card |
|
|
|
# :nodoc: |
|
# @api private |
|
def rect(box, draw, trans) |
|
use_cairo do |cc| |
|
cc.rotate_about(box.x, box.y, trans.angle) |
|
cc.rounded_rectangle(box.x, box.y, box.width, box.height, |
|
box.x_radius, box.y_radius) |
|
cc.fill_n_stroke(draw) |
|
end |
|
end |
|
|
|
# :nodoc: |
|
# @api private |
|
def circle(box, draw) |
|
x, y, r = box.x, box.y, box.radius |
|
use_cairo do |cc| |
|
if box.arc_direction == :clockwise |
|
cc.arc(x, y, r, box.arc_start, box.arc_end) |
|
else |
|
cc.arc_negative(x, y, r, box.arc_start, box.arc_end) |
|
end |
|
if box.arc_close |
|
cc.close_path(); |
|
end |
|
cc.fill_n_stroke(draw) |
|
end |
|
end |
|
|
|
# Ellipse drawing taken from looking at the control points in Inkscape |
|
# Think of it like a rectangle. Curves go from mid-points of the sides |
|
# of the rectangle. Control points are at 1/4 and 3/4 of the side. |
|
# :nodoc: |
|
# @api private |
|
def ellipse(box, draw, trans) |
|
x, y, w, h = box.x, box.y, box.width, box.height |
|
use_cairo do |cc| |
|
cc.rotate_about(box.x, box.y, trans.angle) |
|
cc.move_to(x, y + 0.5 * h) # start west |
|
cc.curve_to(x, y + 0.25 * h, # west to north |
|
x + 0.25 * w, y, |
|
x + 0.5 * w, y) |
|
cc.curve_to(x + 0.75 * w, y, # north to east |
|
x + w, y + 0.25 * h, |
|
x + w, y + 0.5 * h) |
|
cc.curve_to(x + w, y + 0.75 * h, # east to south |
|
x + 0.75 * w, y + h, |
|
x + 0.5 * w, y + h) |
|
cc.curve_to(x + 0.25 * w, y + h, # south to west |
|
x, y + 0.75 * h, |
|
x, y + 0.5 * h) |
|
cc.fill_n_stroke(draw) |
|
end |
|
end |
|
|
|
# :nodoc: |
|
# @api private |
|
def grid(box, draw) |
|
x, y, w, h = box.x, box.y, box.width, box.height |
|
use_cairo do |cc| |
|
(x..@width + w).step(w) { |ix| line_xy(ix, y - @height, ix, @height + y, draw) } |
|
(y..@height + h).step(h) { |iy| line_xy(x - @width, iy, @width + x, iy, draw) } |
|
end |
|
end |
|
|
|
# :nodoc: |
|
# @api private |
|
def triangle(tri, draw) |
|
use_cairo do |cc| |
|
cc.triangle(tri.x1, tri.y1, tri.x2, tri.y2, tri.x3, tri.y3) |
|
cc.fill_n_stroke(draw) |
|
end |
|
end |
|
|
|
# :nodoc: |
|
# @api private |
|
def line(coord, draw) |
|
line_xy(coord.x1, coord.y1, coord.x2, coord.y2, draw) |
|
end |
|
|
|
# :nodoc: |
|
# @api private |
|
def line_xy(x1, y1, x2, y2, draw) |
|
use_cairo do |cc| |
|
cc.move_to(x1, y1) |
|
cc.line_to(x2, y2) |
|
cc.fancy_stroke(draw) |
|
end |
|
end |
|
|
|
# :nodoc: |
|
# @api private |
|
def curve(bez, draw) |
|
x1, y1, cx1, cy1 = bez.x1, bez.y1, bez.cx1, bez.cy1 |
|
cx2, cy2, x2, y2 = bez.cx2, bez.cy2, bez.x2, bez.y2 |
|
use_cairo do |cc| |
|
cc.move_to(x1, y1) |
|
cc.curve_to(cx1, cy1, cx2, cy2, x2, y2) |
|
cc.fill_n_stroke(draw) |
|
end |
|
end |
|
|
|
# :nodoc: |
|
# @api private |
|
def star(poly, trans, draw) |
|
x, y, n = poly.x, poly.y, poly.n |
|
inner_radius, outer_radius = poly.inner_radius, poly.outer_radius |
|
use_cairo do |cc| |
|
cc.rotate_about(x, y, trans.angle) |
|
cc.move_to(x + outer_radius, y) # i = 0, so cos(0)=1 and sin(0)=0 |
|
theta = Math::PI / n.to_f # i.e. (2*pi) / (2*n) |
|
0.upto(2 * n) do |i| |
|
radius = i.even? ? outer_radius : inner_radius |
|
cc.line_to(x + radius * Math::cos(i * theta), |
|
y + radius * Math::sin(i * theta)) |
|
end |
|
cc.close_path |
|
cc.fill_n_stroke(draw) |
|
end |
|
end |
|
|
|
# :nodoc: |
|
# @api private |
|
def polygon(poly, trans, draw) |
|
x, y, n, radius = poly.x, poly.y, poly.n, poly.radius |
|
use_cairo do |cc| |
|
cc.rotate_about(x, y, trans.angle) |
|
cc.move_to(x + radius, y) # i = 0, so cos(0)=1 and sin(0)=0 |
|
theta = (2 * Math::PI) / n.to_f |
|
0.upto(n) do |i| |
|
cc.line_to(x + radius * Math::cos(i * theta), |
|
y + radius * Math::sin(i * theta)) |
|
end |
|
cc.close_path |
|
cc.fill_n_stroke(draw) |
|
end |
|
end |
|
|
|
end |
|
end
|
|
|