-
Notifications
You must be signed in to change notification settings - Fork 138
/
stylable.rb
116 lines (98 loc) · 4.04 KB
/
stylable.rb
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
109
110
111
112
113
114
115
#--
# $Id: stylable.rb,v 1.1 2005/03/12 17:02:00 rmagick Exp $
# Copyright (C) 2005 Timothy P. Hunter
#++
class Magick::RVG
#:stopdoc:
STYLES = [:clip_path, :clip_rule, :fill, :fill_opacity, :fill_rule, :font,
:font_family, :font_size, :font_stretch, :font_style, :font_weight,
:opacity, :stroke, :stroke_dasharray, :stroke_dashoffset, :stroke_linecap,
:stroke_linejoin, :stroke_miterlimit, :stroke_opacity, :stroke_width,
:text_anchor, :text_decoration,
:glyph_orientation_vertical, :glyph_orientation_horizontal,
:letter_spacing, :word_spacing, :baseline_shift, :writing_mode]
Styles = Struct.new(*STYLES)
# Styles is a Struct class with a couple of extra methods
class Styles
def set(styles)
begin
styles.each_pair do |style, value|
begin
self[style] = value
rescue NoMethodError
raise ArgumentError, "unknown style `#{style}'"
end
end
rescue NoMethodError
raise ArgumentError, "style arguments must be in the form `style => value'"
end
self
end
# Iterate over the style names. Yield for each style that has a value.
def each_value
each_pair do |style, value|
yield(style, value) if value
end
end
# The "usual" deep_copy method doesn't copy a Struct correctly.
def deep_copy(h=nil)
copy = Styles.new
each_pair { |style, value| copy[style] = value }
return copy
end
end # class Styles
#:startdoc:
# This module is mixed into classes that can have styles.
module Stylable
private
# For each style that has a value, add a style primitive to the gc.
# Use splat to splat out Array arguments such as stroke_dasharray.
def add_style_primitives(gc)
@styles.each_value do |style, value|
if value.respond_to? :add_primitives
value.add_primitives(gc, style)
else
gc.__send__(style, *value)
end
end
end
def initialize
super
@styles = Styles.new
end
public
# This method can be used with any RVG, Group, Use, Text, or
# shape object. The argument is a hash. The style names are
# the hash keys. The style names and values are:
# [:clip_path] clipping path defined by clip_path
# [:clip_rule] 'evenodd' or 'nozero'
# [:fill] color name
# [:fill_opacity] the fill opacity, 0.0<=N<=1.0
# [:fill_rule] 'evenodd' or 'nozero'
# [:font] font name or font file name
# [:font_family] font family name, ex. 'serif'
# [:font_size] font size in points
# [:font_stretch] 'normal','ultra_condensed','extra_condensed',
# 'condensed','semi_condensed','semi_expanded',
# 'expanded','extra_expanded','ultra_expanded'
# [:font_style] 'normal','italic','oblique'
# [:font_weight] 'normal','bold','bolder','lighter', or
# a multiple of 100 between 100 and 900.
# [:opacity] both fill and stroke opacity, 0.0<=N<=1.0
# [:stroke] color name
# [:stroke_dasharray] dash pattern (Array)
# [:stroke_dashoffset] initial distance into dash pattern
# [:stroke_linecap] 'butt', 'round', 'square'
# [:stroke_linejoin] 'miter', 'round', 'bevel'
# [:stroke_miterlimit] miter length constraint
# [:stroke_opacity] the stroke opacity, 0.0<=N<=1.0
# [:stroke_width] stroke width
# [:text_anchor] 'start','middle','end'
# [:text_decoration] 'none','underline','overline','line_through'
def styles(styles)
@styles.set(styles)
yield(self) if block_given?
self
end
end # module Stylable
end # class Magick::RVG