1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
# encoding: utf-8
# dash.rb : Implements stroke dashing
#
# Contributed by Daniel Nelson. October, 2009
#
# This is free software. Please see the LICENSE and COPYING files for details.
#
module Prawn
module Graphics
module Dash
# @group Stable API
# Sets the dash pattern for stroked lines and curves or return the
# current dash pattern setting if +length+ is nil.
#
# There are two ways to set the dash pattern:
#
# * If the parameter +length+ is an Integer/Float, it specifies
# the length of the dash and of the gap. The length of the gap
# can be customized by setting the :space option.
#
# Examples:
#
# length = 3
# 3 on, 3 off, 3 on, 3 off, ...
# length = 3, :space =2
# 3 on, 2 off, 3 on, 2 off, ...
#
# * If the parameter +length+ is an array, it specifies the
# lengths of alternating dashes and gaps. The :space option is
# ignored in this case.
#
# Examples:
#
# length = [2, 1]
# 2 on, 1 off, 2 on, 1 off, ...
# length = [3, 1, 2, 3]
# 3 on, 1 off, 2 on, 3 off, 3 on, 1 off, ...
#
# Options may contain the keys :space and :phase
#
# :space:: The space between the dashes (only used when +length+
# is not an array)
#
# :phase:: The distance into the dash pattern at which to start
# the dash. For example, a phase of 0 starts at the
# beginning of the dash; whereas, if the phase is equal
# to the length of the dash, then stroking will begin at
# the beginning of the space. Default is 0.
#
# Integers or Floats may be used for length and the option values.
# Dash units are in PDF points (1/72 inch).
#
def dash(length = nil, options = {})
return current_dash_state if length.nil?
if length == 0 || length.kind_of?(Array) && length.any? { |e| e == 0 }
fail ArgumentError,
"Zero length dashes are invalid. Call #undash to disable dashes."
end
self.current_dash_state = { :dash => length,
:space => length.kind_of?(Array) ? nil : options[:space] || length,
:phase => options[:phase] || 0 }
write_stroke_dash
end
alias_method :dash=, :dash
# Stops dashing, restoring solid stroked lines and curves
#
def undash
self.current_dash_state = undashed_setting
write_stroke_dash
end
# Returns when stroke is dashed, false otherwise
#
def dashed?
current_dash_state != undashed_setting
end
private
def write_stroke_dash
renderer.add_content dash_setting
end
def undashed_setting
{ :dash => nil, :space => nil, :phase => 0 }
end
def current_dash_state=(dash_options)
graphic_state.dash = dash_options
end
def current_dash_state
graphic_state.dash
end
def dash_setting
graphic_state.dash_setting
end
end
end
end
|