phantom_svg 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +42 -0
- data/.rspec +3 -0
- data/.rubocop.yml +11 -0
- data/.travis.yml +9 -0
- data/Gemfile +16 -0
- data/Guardfile +12 -0
- data/LICENSE +165 -0
- data/README.md +6 -0
- data/lib/phantom/frame.rb +71 -0
- data/lib/phantom/parser/abstract_animation_reader.rb +117 -0
- data/lib/phantom/parser/json_animation_reader.rb +42 -0
- data/lib/phantom/parser/raster.rb +115 -0
- data/lib/phantom/parser/svg_reader.rb +131 -0
- data/lib/phantom/parser/svg_writer.rb +163 -0
- data/lib/phantom/parser/xml_animation_reader.rb +32 -0
- data/lib/phantom/svg.rb +139 -0
- data/lib/phantom_svg.rb +1 -0
- data/phantom_svg.gemspec +25 -0
- data/spec/images/apngasm.png +0 -0
- data/spec/images/ninja.svg +63 -0
- data/spec/images/stuck_out_tongue/0.svg +103 -0
- data/spec/images/stuck_out_tongue/1.svg +103 -0
- data/spec/images/stuck_out_tongue/10.svg +103 -0
- data/spec/images/stuck_out_tongue/11.svg +103 -0
- data/spec/images/stuck_out_tongue/2.svg +103 -0
- data/spec/images/stuck_out_tongue/3.svg +103 -0
- data/spec/images/stuck_out_tongue/4.svg +103 -0
- data/spec/images/stuck_out_tongue/5.svg +103 -0
- data/spec/images/stuck_out_tongue/6.svg +103 -0
- data/spec/images/stuck_out_tongue/7.svg +103 -0
- data/spec/images/stuck_out_tongue/8.svg +103 -0
- data/spec/images/stuck_out_tongue/9.svg +103 -0
- data/spec/images/stuck_out_tongue/loops_test.json +9 -0
- data/spec/images/stuck_out_tongue/loops_test.xml +4 -0
- data/spec/images/stuck_out_tongue/skip_first_test.json +10 -0
- data/spec/images/stuck_out_tongue/skip_first_test.xml +5 -0
- data/spec/images/stuck_out_tongue/test1.json +20 -0
- data/spec/images/stuck_out_tongue/test1.xml +15 -0
- data/spec/images/stuck_out_tongue/test2.json +13 -0
- data/spec/images/stuck_out_tongue/test2.xml +4 -0
- data/spec/phantom/svg_spec.rb +421 -0
- data/spec/spec_helper.rb +81 -0
- metadata +170 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
require 'rexml/document'
|
3
|
+
|
4
|
+
require_relative '../frame.rb'
|
5
|
+
require_relative 'abstract_animation_reader.rb'
|
6
|
+
|
7
|
+
module Phantom
|
8
|
+
module SVG
|
9
|
+
module Parser
|
10
|
+
# AnimationReader for XML.
|
11
|
+
class XMLAnimationReader < AbstractAnimationReader
|
12
|
+
private
|
13
|
+
|
14
|
+
# Read parameter from animation information file.
|
15
|
+
def read_parameter(path)
|
16
|
+
xml = REXML::Document.new(open(path))
|
17
|
+
|
18
|
+
animation = xml.elements['animation']
|
19
|
+
return if animation.nil?
|
20
|
+
|
21
|
+
animation.attributes.each do |key, val|
|
22
|
+
set_parameter(key, val)
|
23
|
+
end
|
24
|
+
|
25
|
+
animation.elements.each('frame') do |element|
|
26
|
+
add_frame_info(element.attributes['src'], element.attributes['delay'])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end # class XMLAnimationReader < AbstractAnimationReader
|
30
|
+
end # module Parser
|
31
|
+
end # module SVG
|
32
|
+
end # module Phantom
|
data/lib/phantom/svg.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
|
2
|
+
require_relative 'frame.rb'
|
3
|
+
require_relative 'parser/raster.rb'
|
4
|
+
require_relative 'parser/svg_reader.rb'
|
5
|
+
require_relative 'parser/svg_writer.rb'
|
6
|
+
require_relative 'parser/json_animation_reader.rb'
|
7
|
+
require_relative 'parser/xml_animation_reader.rb'
|
8
|
+
|
9
|
+
module Phantom
|
10
|
+
module SVG
|
11
|
+
class Base
|
12
|
+
include Parser::Raster
|
13
|
+
attr_accessor :frames, :width, :height, :loops, :skip_first
|
14
|
+
|
15
|
+
def initialize(path = nil, options = {})
|
16
|
+
reset
|
17
|
+
|
18
|
+
add_frame_from_file(path, options) if path
|
19
|
+
end
|
20
|
+
|
21
|
+
def reset
|
22
|
+
@frames = []
|
23
|
+
@width = 0
|
24
|
+
@height = 0
|
25
|
+
@loops = 0
|
26
|
+
@skip_first = false
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_frame_from_file(path, options = {})
|
30
|
+
create_file_list(path).each do |file|
|
31
|
+
case File.extname(file)
|
32
|
+
when '.svg' then load_from_svg(file, options)
|
33
|
+
when '.png' then load_from_png(file, options)
|
34
|
+
when '.json' then load_from_json(file, options)
|
35
|
+
when '.xml' then load_from_xml(file, options)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Creates a blank frame when no arguments are passed
|
41
|
+
# Takes another Phantom::SVG object or file path
|
42
|
+
def add_frame(frame = nil, options = {})
|
43
|
+
if frame.nil? then @frames << Phantom::SVG::Frame.new
|
44
|
+
elsif frame.instance_of?(Phantom::SVG::Frame) then @frames << frame
|
45
|
+
elsif frame.instance_of?(Phantom::SVG::Base) then @frames += frame.frames
|
46
|
+
elsif frame.instance_of?(String) then add_frame_from_file(frame, options)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_size
|
51
|
+
@width = 0
|
52
|
+
@height = 0
|
53
|
+
frames.each do |frame|
|
54
|
+
@width = frame.width.to_f if frame.width.to_f > @width
|
55
|
+
@height = frame.height.to_f if frame.height.to_f > @height
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def save_svg(path)
|
60
|
+
set_size if @width.to_i == 0 || @height.to_i == 0
|
61
|
+
|
62
|
+
Parser::SVGWriter.new.write(path, self)
|
63
|
+
end
|
64
|
+
|
65
|
+
def save_svg_frame(path, frame, width = nil, height = nil)
|
66
|
+
old_width = frame.width
|
67
|
+
old_height = frame.height
|
68
|
+
frame.width = width unless width.nil?
|
69
|
+
frame.height = height unless height.nil?
|
70
|
+
|
71
|
+
write_size = Parser::SVGWriter.new.write(path, frame)
|
72
|
+
|
73
|
+
frame.width = old_width
|
74
|
+
frame.height = old_height
|
75
|
+
|
76
|
+
write_size
|
77
|
+
end
|
78
|
+
|
79
|
+
def save_apng(path)
|
80
|
+
save_rasterized(path)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Calculate and return total duration.
|
84
|
+
def total_duration
|
85
|
+
result = 0.0
|
86
|
+
@frames.each_with_index do |frame, i|
|
87
|
+
next if i == 0 && @skip_first
|
88
|
+
result += frame.duration
|
89
|
+
end
|
90
|
+
result
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def load_from_svg(path, options)
|
96
|
+
reader = Parser::SVGReader.new(path, options)
|
97
|
+
if reader.has_animation?
|
98
|
+
@width = reader.width
|
99
|
+
@height = reader.height
|
100
|
+
@loops = reader.loops
|
101
|
+
@skip_first = reader.skip_first
|
102
|
+
end
|
103
|
+
|
104
|
+
@frames += reader.frames
|
105
|
+
end
|
106
|
+
|
107
|
+
def load_from_png(path, options)
|
108
|
+
load_raster(path, @frames.size)
|
109
|
+
end
|
110
|
+
|
111
|
+
def load_from_json(path, options)
|
112
|
+
load_from_reader(Parser::JSONAnimationReader.new(path), options)
|
113
|
+
end
|
114
|
+
|
115
|
+
def load_from_xml(path, options)
|
116
|
+
load_from_reader(Parser::XMLAnimationReader.new(path), options)
|
117
|
+
end
|
118
|
+
|
119
|
+
def load_from_reader(reader, options)
|
120
|
+
if @frames.empty?
|
121
|
+
@loops = reader.loops
|
122
|
+
@skip_first = reader.skip_first
|
123
|
+
@frames += reader.frames
|
124
|
+
set_size
|
125
|
+
elsif reader.skip_first
|
126
|
+
@frames += reader.frames.slice(1, reader.frames.length - 1)
|
127
|
+
else
|
128
|
+
@frames += reader.frames
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def create_file_list(path)
|
133
|
+
result = Dir.glob(path).sort_by { |k| k[/\d+/].to_i }
|
134
|
+
result << path if result.empty?
|
135
|
+
result
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
data/lib/phantom_svg.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'phantom/svg'
|
data/phantom_svg.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.platform = Gem::Platform::RUBY
|
3
|
+
s.name = 'phantom_svg'
|
4
|
+
s.version = '1.0.0'
|
5
|
+
s.license = 'LGPL-3.0'
|
6
|
+
s.summary = 'Hight end SVG manipulation tools for Ruby'
|
7
|
+
s.description = 'Hight end SVG manipulation tools for Ruby.\n' \
|
8
|
+
'Includes chained keyframe generation, (A)PNG conversion and more.'
|
9
|
+
s.authors = ['Rika Yoshida', 'Rei Kagetsuki', 'Naoki Iwakawa']
|
10
|
+
s.email = 'info@genshin.org'
|
11
|
+
s.homepage = 'http://github.com/Genshin/phantom_svg'
|
12
|
+
|
13
|
+
s.required_ruby_version = '~> 2.0.0'
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split($RS)
|
16
|
+
s.test_files = s.files.grep(/^spec\//)
|
17
|
+
s.require_path = 'lib'
|
18
|
+
|
19
|
+
s.requirements << 'libapngasm'
|
20
|
+
|
21
|
+
s.add_dependency 'cairo', '~> 1.12'
|
22
|
+
s.add_dependency 'rapngasm', '~> 3.1'
|
23
|
+
s.add_dependency 'gdk3', '~> 2.2'
|
24
|
+
s.add_dependency 'rsvg2', '~> 2.2'
|
25
|
+
end
|
Binary file
|
@@ -0,0 +1,63 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg version="1.1" id="レイヤー_1"
|
5
|
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="64px" height="64px"
|
6
|
+
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
|
7
|
+
<g>
|
8
|
+
<line style="fill:none;stroke:#190110;stroke-width:3;stroke-miterlimit:10;" x1="16.007" y1="20.647" x2="48.812" y2="37.975"/>
|
9
|
+
<polygon style="fill:#8F72B7;stroke:#1C0801;stroke-width:2.1575;stroke-miterlimit:10;" points="9.07,54.989 19.213,50.722
|
10
|
+
20.518,53.896 11.273,58.126 "/>
|
11
|
+
<path style="fill:#967656;stroke:#1C0801;stroke-width:2.0559;stroke-miterlimit:10;" d="M10.739,55.597
|
12
|
+
c0,0-2.537-0.584-3.197-3.166l-1.85-1.709L4.333,52.38l2.944,8.092l4.745-2.393L10.739,55.597z"/>
|
13
|
+
<path style="fill:#CE5A21;stroke:#1C0801;stroke-width:2;stroke-miterlimit:10;" d="M19.07,45.302
|
14
|
+
c-4.25,1.125-6.145,6.936-6.145,6.936s3.77,6.859,6.77,5.859s5.985-4.213,5.985-4.213l11.016-2.078l-7.063-12.209L19.07,45.302z"/>
|
15
|
+
<polygon style="fill:#8F72B7;stroke:#1C0801;stroke-width:2.1575;stroke-miterlimit:10;" points="55.183,46.021 44.54,48.813
|
16
|
+
43.696,45.487 53.444,42.604 "/>
|
17
|
+
<path style="fill:#967656;stroke:#1C0801;stroke-width:2.0559;stroke-miterlimit:10;" d="M53.616,45.185
|
18
|
+
c0,0,2.43,0.936,2.719,3.586l1.59,1.951l1.742-1.094l-1.934-8.783l-5.037,1.699L53.616,45.185z"/>
|
19
|
+
<polygon style="fill:#A53A0A;stroke:#1C0801;stroke-width:1.8151;stroke-miterlimit:10;" points="24.481,27.17 12.597,32.188
|
20
|
+
16.057,37.077 19.991,39.421 26.784,31.184 "/>
|
21
|
+
<path style="fill:#EFAF84;stroke:#1C0801;stroke-width:2;stroke-miterlimit:10;" d="M10.471,33.814c0,0,3.654-3.075,4.654-2.85
|
22
|
+
c1,0.225,2.761,3.976,2.761,3.976l-5.011,4.25C12.875,39.19,10.192,36.565,10.471,33.814z"/>
|
23
|
+
<g>
|
24
|
+
<polygon style="fill:#EFAF84;stroke:#1C0801;stroke-width:1.8205;stroke-miterlimit:10;" points="50.782,9.8 51.396,6.566
|
25
|
+
48.628,3.528 47.055,5.952 44.247,8.237 46.572,12.308 47.106,11.989 48.033,13.26 51.597,12.125 49.435,10.603 "/>
|
26
|
+
<path style="fill:#EFAF84;stroke:#1C0801;stroke-width:2.054;stroke-miterlimit:10;" d="M30.205,19.577l0.354-4.393
|
27
|
+
c0,0,9.317-3.975,13.338-6.469l2.585,2.723c0,0-13.133,9.837-14.09,11.798C31.436,25.198,30.205,19.577,30.205,19.577z"/>
|
28
|
+
<polygon style="fill:#8F72B7;" points="43.543,10.071 45.061,11.43 42.552,13.082 40.702,11.661 "/>
|
29
|
+
</g>
|
30
|
+
<path style="fill:#CE5A21;stroke:#1C0801;stroke-width:2;stroke-miterlimit:10;" d="M30.384,49.546c0,0,2.931,2.385,8.529,4.879
|
31
|
+
c5.738-2.074,11.799-6.035,11.799-6.035s-0.086-2-2.211-5.25c-4.125-1.25-7.732-2.295-7.732-2.295s0.107-2.424-3.072-4.146
|
32
|
+
C33.94,34.663,15.384,32.423,30.384,49.546z"/>
|
33
|
+
<g>
|
34
|
+
<path style="fill:#847340;stroke:#1C0801;stroke-miterlimit:10;" d="M23.561,39.892c0,0,1.939,2.654,2.439,3.154l8.751-6.25
|
35
|
+
l1.945-0.098c0,0-0.182-2.215-1.002-4.254l-8.57,6.232L23.561,39.892z"/>
|
36
|
+
<path style="fill:#847340;stroke:#1C0801;stroke-width:2;stroke-miterlimit:10;" d="M36.696,36.698c0,0-0.182-2.215-1.002-4.254"
|
37
|
+
/>
|
38
|
+
</g>
|
39
|
+
<path style="fill:#CE5A21;stroke:#1C0801;stroke-width:1.8151;stroke-miterlimit:10;" d="M20.32,23.595
|
40
|
+
c0,0,0.125-4.118,5.625-5.766c2.438-3.034,6.555-5.895,6.555-5.895l0.32,2.153l3.626,6.921l-2,3.735c0,0,0.201,1.017,3.25,3.094
|
41
|
+
c-2.25,6.958-3.33,5.037-4.407,6.356c-2.905,3.551-4.281,3.551-8.858,7.508c-4.75-4.324-3.976-15.176-3.976-15.176L20.32,23.595z"
|
42
|
+
/>
|
43
|
+
<polygon style="fill:#EFAF84;stroke:#1C0801;stroke-width:2;stroke-miterlimit:10;" points="15.82,25.073 20.518,27.838
|
44
|
+
22.999,33.67 23.561,24.693 20.57,19.443 "/>
|
45
|
+
<path style="fill:#CE5A21;stroke:#1C0801;stroke-width:2;stroke-miterlimit:10;" d="M8.34,15.101l1.942,9.32
|
46
|
+
c0,0,3.669,3.648,5.402,3.405c5.44-5.781,5.565-9.156,5.565-9.156l3.181-0.916l-2.192-3.458L23,7.67c0,0-3.732,1.548-9.221,1.237
|
47
|
+
C8.666,11.141,8.34,15.101,8.34,15.101z"/>
|
48
|
+
<polygon style="fill:#EFAF84;stroke:#1C0801;stroke-miterlimit:10;" points="8.971,18.129 20.32,15.021 14.646,19.443
|
49
|
+
9.866,22.428 "/>
|
50
|
+
<polygon style="fill:#AF400E;" points="20.32,14.43 9.563,15.711 9.813,17.357 "/>
|
51
|
+
<path style="fill:#AF400E;" d="M11.125,23.977l8.565-3.49c0,0-2.212,4.188-4.283,6.332C15.407,26.818,13.375,26.284,11.125,23.977z
|
52
|
+
"/>
|
53
|
+
<polygon style="fill:#AF400E;" points="32.813,16.045 35.376,21.045 31.851,29.311 "/>
|
54
|
+
<path style="fill:#AF400E;" d="M36.515,28.107c0,0-10.651,11.138-12.084,11.784C24.431,39.892,35.938,34.571,36.515,28.107z"/>
|
55
|
+
<path style="fill:#AF400E;" d="M27.25,47.296l-2.819,4l-8.314,3.613c0,0,1.683,2.951,2.634,2.512
|
56
|
+
c5.681-2.625,6.429-4.557,6.429-4.557l6.672-1.006L27.25,47.296z"/>
|
57
|
+
<path style="fill:#AF400E;" d="M38.938,53.421l9.563-6.375l-0.619-2.797l1.869,3.672C49.751,47.921,49.44,49.185,38.938,53.421z"/>
|
58
|
+
<polygon style="fill:#AF400E;" points="26.784,43.046 36.696,37.745 34.876,37.745 "/>
|
59
|
+
<polygon style="fill:#AF400E;" points="39.876,40.845 34.876,43.046 42.001,42.604 39.626,41.702 "/>
|
60
|
+
<path style="fill:none;stroke:#4C231B;stroke-width:2.2378;stroke-miterlimit:10;" d="M18.75,27.758c0,0,3.257,9.175,17.765,4.704"
|
61
|
+
/>
|
62
|
+
</g>
|
63
|
+
</svg>
|
@@ -0,0 +1,103 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg version="1.1" id="_x30_0" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
5
|
+
width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
|
6
|
+
<g>
|
7
|
+
<g>
|
8
|
+
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="15.4937" y1="-0.0762" x2="50.2369" y2="63.8233">
|
9
|
+
<stop offset="0" style="stop-color:#F8D8CB"/>
|
10
|
+
<stop offset="0.1365" style="stop-color:#F7D1C3"/>
|
11
|
+
<stop offset="0.3479" style="stop-color:#F5BEAD"/>
|
12
|
+
<stop offset="0.6075" style="stop-color:#F19F8A"/>
|
13
|
+
<stop offset="0.903" style="stop-color:#EB7459"/>
|
14
|
+
<stop offset="1" style="stop-color:#E96547"/>
|
15
|
+
</linearGradient>
|
16
|
+
<circle fill="url(#SVGID_1_)" cx="32.149" cy="30.558" r="28.191"/>
|
17
|
+
</g>
|
18
|
+
<defs>
|
19
|
+
<filter id="Adobe_OpacityMaskFilter" filterUnits="userSpaceOnUse" x="3.958" y="2.367" width="56.383" height="56.382">
|
20
|
+
|
21
|
+
<feColorMatrix type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" color-interpolation-filters="sRGB" result="source"/>
|
22
|
+
</filter>
|
23
|
+
</defs>
|
24
|
+
<mask maskUnits="userSpaceOnUse" x="3.958" y="2.367" width="56.383" height="56.382" id="SVGID_2_">
|
25
|
+
<g filter="url(#Adobe_OpacityMaskFilter)">
|
26
|
+
|
27
|
+
<image overflow="visible" width="62" height="61" xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEASABIAAD/7AARRHVja3kAAQAEAAAAHgAA/+4AIUFkb2JlAGTAAAAAAQMA
|
28
|
+
EAMCAwYAAAHWAAACYgAAA5X/2wCEABALCwsMCxAMDBAXDw0PFxsUEBAUGx8XFxcXFx8eFxoaGhoX
|
29
|
+
Hh4jJSclIx4vLzMzLy9AQEBAQEBAQEBAQEBAQEABEQ8PERMRFRISFRQRFBEUGhQWFhQaJhoaHBoa
|
30
|
+
JjAjHh4eHiMwKy4nJycuKzU1MDA1NUBAP0BAQEBAQEBAQEBAQP/CABEIAD0APgMBIgACEQEDEQH/
|
31
|
+
xACUAAADAAMBAQAAAAAAAAAAAAAABgcBBAUDAgEBAAAAAAAAAAAAAAAAAAAAABAAAQMDAwQDAAAA
|
32
|
+
AAAAAAAAAwIEBQEGBwAQIEASExUUFhcRAAIBAgIHAg0FAAAAAAAAAAECEQADIQQQIDFBEiITYQVR
|
33
|
+
cYGRscHhQoKiMxQVMmIjQyQSAQAAAAAAAAAAAAAAAAAAAED/2gAMAwEAAhEDEQAAAJ/9FVFVjb8i
|
34
|
+
YrVzBAcPyCNdUR3kAAAPOR2BLNR/i9jPUAADCE3Ro1G5RC7bURcR85yWmnT4gH//2gAIAQIAAQUA
|
35
|
+
6D//2gAIAQMAAQUA6D//2gAIAQEAAQUA0MZCkh8fSL1IsbQ6UOcaxSxzNkSsYitK0roYyFJaNqgj
|
36
|
+
Wm6kpVS+bTQNOsfRSXspxOFBwqgKIuzGQFJZ8nzYaMhYxcp7OTp9VeRLXmKxEq3ONwHhNSYoyP8A
|
37
|
+
ZOPZatS9FRaWUizfB2lZ6OiwXJcjmbc7xXve8X6F2SP3/wAD353l2//aAAgBAgIGPwAH/9oACAED
|
38
|
+
AgY/AAf/2gAIAQEBBj8ApbdpS7uYVRiSaF3ON9tbIwUYtQF13dwMW4iJ81EWLj233NJPpmmvJ/os
|
39
|
+
rJJUcwHi30QRBGBB0LbtqWdzCqNpJpMxmbYbN3AGYnGOwahVhIO0Gm70yKGf7bajb26GzN1Zt5cc
|
40
|
+
vg4jrPZcSrggg9tJ3SfpXLnEo/ZBePliszeMQ78vkAHq1+7LgHNdW6W+G05HprNZYtzcQYLOwRr5
|
41
|
+
IEjgsh1HxW7gNW77GLL8t3xbjS3rTBkcSCNW7mbjQVU8I3zX5Kf5up1PZ5sNCZLOgtlpARx7g7aW
|
42
|
+
9lrquriRBGlruYuiVGCgyTRxK5ZTyJ4e06g/F9acY4J4duO3loR04j3pmj1Ijf0v1fNR+96nUk/U
|
43
|
+
nyxPq0//2Q==" transform="matrix(1 0 0 1 1 0)">
|
44
|
+
</image>
|
45
|
+
</g>
|
46
|
+
</mask>
|
47
|
+
<g opacity="0.27" mask="url(#SVGID_2_)">
|
48
|
+
<circle fill="#EA7878" cx="32.149" cy="30.558" r="28.191"/>
|
49
|
+
</g>
|
50
|
+
</g>
|
51
|
+
<g opacity="0.8">
|
52
|
+
|
53
|
+
<image overflow="visible" width="62" height="12" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD8AAAANCAYAAAAe7bZ5AAAACXBIWXMAAAsSAAALEgHS3X78AAAA
|
54
|
+
GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAgdJREFUeNrUlttO20AQhteJ41Bx
|
55
|
+
iKhKgBtuuOSmFdf0UXgKHoOn6Lv0OkiovUEUCUHFMVXFIQfHDv9In6tRsEKlSk460i977d3R/+/M
|
56
|
+
zk4UnN0dfonCG/bhYH8c5sT+hu80zpFzVNOjISR8Gglj5uR8szmZ/ZPDfMbCPd/IcQ3u3Z5DIS3j
|
57
|
+
GzlH74Q1YR2RvxEa22Lm14UH4ZfQl8NshsI93wSODaYU7yb82pYIvUm+EaljizeFXeGj0BRuWGzv
|
58
|
+
fXbRNuJc+C5clDmsKNU930/CsjAQFpjWh/eTcCx04PvsMyDmmbCDJnxPWGXhiB1MEW9CT4Ul1l2I
|
59
|
+
zPMMjoDn+9mONdwSF3nT9si8wOb8FN9hUQPikmNg6bThHNUQXohvk/5pmcMKrciAFbIggWugRkXw
|
60
|
+
q3NMLWPvyeY/wgIfLM2/gVuiXliDNGoifge03SZVaUOEnHGmh050cNG38aLwnmfdF/nYIqbIpQju
|
61
|
+
INQivM1kG7dctGuuBlRu8LXAdIUT6k8LFAU6o2Ab355wxTHOPO8Yh7kc9igKgbOyxeSmq6gDxlbx
|
62
|
+
jyZ2vUrL4fhD+IqwZcevqPIDIm0Zcsn49T1PJa1TMVdxlhPxlrvy/BVyS8Wv/M5/47obuau6RrC6
|
63
|
+
XM95qXjnNEZ00SzEE43E1OZhDhqd8USTVtqYRf/SOs5Dq/u/teRzYy8CDAAUkd35+IZT8gAAAABJ
|
64
|
+
RU5ErkJggg==" transform="matrix(1 0 0 1 1.0781 19.0781)">
|
65
|
+
</image>
|
66
|
+
<g>
|
67
|
+
<g>
|
68
|
+
|
69
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="5.521" y1="23.466" x2="8.366" y2="26.819"/>
|
70
|
+
|
71
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="8.648" y1="23.466" x2="11.493" y2="26.819"/>
|
72
|
+
|
73
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="11.775" y1="23.466" x2="14.62" y2="26.819"/>
|
74
|
+
|
75
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="49.16" y1="23.466" x2="52.005" y2="26.818"/>
|
76
|
+
|
77
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="52.286" y1="23.466" x2="55.132" y2="26.818"/>
|
78
|
+
|
79
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="55.414" y1="23.466" x2="58.259" y2="26.818"/>
|
80
|
+
</g>
|
81
|
+
</g>
|
82
|
+
</g>
|
83
|
+
<ellipse fill="#78211C" cx="43.037" cy="17.842" rx="3.53" ry="5.06"/>
|
84
|
+
<ellipse fill="#78211C" cx="21.262" cy="17.842" rx="3.53" ry="5.06"/>
|
85
|
+
<path fill="#842C38" d="M50.572,33.182c0,10.365-8.246,18.771-18.423,18.771c-10.175,0-18.423-8.406-18.423-18.771
|
86
|
+
c7.438-0.216,8.249,1.555,18.423,1.555C42.326,34.736,42.326,33.182,50.572,33.182z"/>
|
87
|
+
<circle fill="none" stroke="#B95E5D" stroke-width="2.435" stroke-miterlimit="10" cx="32.149" cy="30.558" r="27.349"/>
|
88
|
+
<circle fill="none" stroke="#541715" stroke-width="2.435" stroke-miterlimit="10" cx="32.149" cy="30.558" r="28.191"/>
|
89
|
+
<polygon fill="#FFFFFF" points="50.427,38.572 13.872,38.572 13.872,33.701 31.913,35.256 50.427,33.701 "/>
|
90
|
+
<path fill="none" stroke="#51090E" stroke-width="1.948" stroke-miterlimit="10" d="M50.572,33.182
|
91
|
+
c0,10.365-8.246,18.771-18.423,18.771c-10.175,0-18.423-8.406-18.423-18.771c8.249,0,8.249,1.555,18.423,1.555
|
92
|
+
C42.326,34.736,42.326,33.182,50.572,33.182z"/>
|
93
|
+
<g>
|
94
|
+
<path fill="#EA7C91" stroke="#65132B" stroke-width="1.8384" stroke-miterlimit="10" d="M20.132,46.857
|
95
|
+
c0,0,5.132-1.748,10.785-1.748s9.44,0.297,12.716,2.008c0,0,0,4.999,0,8.024c0,3.026-6.805,6.012-12.029,6.012
|
96
|
+
c-5.225,0-11.473-2.588-11.473-6.012C20.132,51.717,20.132,46.857,20.132,46.857z"/>
|
97
|
+
<path fill="#E42A56" d="M42.94,46.457c0,0-5.326-2.251-10.937-2.251c-7.139,0-11.715,2.423-11.715,2.423v2.327
|
98
|
+
c0,0,4.87-1.18,10.513-1.316l1.202,8.48l1.168-8.501c3.103,0.031,6.27,0.535,9.769,1.183V46.457z"/>
|
99
|
+
<path fill="none" stroke="#65132B" stroke-width="1.8384" stroke-miterlimit="10" d="M20.132,45.911c0,0,5.132-1.751,10.785-1.751
|
100
|
+
s9.44,0.298,12.716,2.005c0,0,0,5.002,0,8.028c0,3.025-6.805,6.013-12.029,6.013c-5.225,0-11.473-2.589-11.473-6.013
|
101
|
+
C20.132,50.768,20.132,45.911,20.132,45.911z"/>
|
102
|
+
</g>
|
103
|
+
</svg>
|
@@ -0,0 +1,103 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg version="1.1" id="_x30_1_10_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
5
|
+
width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
|
6
|
+
<g>
|
7
|
+
<g>
|
8
|
+
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="15.4937" y1="-0.0762" x2="50.2369" y2="63.8233">
|
9
|
+
<stop offset="0" style="stop-color:#F8D8CB"/>
|
10
|
+
<stop offset="0.1365" style="stop-color:#F7D1C3"/>
|
11
|
+
<stop offset="0.3479" style="stop-color:#F5BEAD"/>
|
12
|
+
<stop offset="0.6075" style="stop-color:#F19F8A"/>
|
13
|
+
<stop offset="0.903" style="stop-color:#EB7459"/>
|
14
|
+
<stop offset="1" style="stop-color:#E96547"/>
|
15
|
+
</linearGradient>
|
16
|
+
<circle fill="url(#SVGID_1_)" cx="32.149" cy="30.558" r="28.191"/>
|
17
|
+
</g>
|
18
|
+
<defs>
|
19
|
+
<filter id="Adobe_OpacityMaskFilter" filterUnits="userSpaceOnUse" x="3.958" y="2.367" width="56.383" height="56.382">
|
20
|
+
|
21
|
+
<feColorMatrix type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" color-interpolation-filters="sRGB" result="source"/>
|
22
|
+
</filter>
|
23
|
+
</defs>
|
24
|
+
<mask maskUnits="userSpaceOnUse" x="3.958" y="2.367" width="56.383" height="56.382" id="SVGID_2_">
|
25
|
+
<g filter="url(#Adobe_OpacityMaskFilter)">
|
26
|
+
|
27
|
+
<image overflow="visible" width="62" height="61" xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEASABIAAD/7AARRHVja3kAAQAEAAAAHgAA/+4AIUFkb2JlAGTAAAAAAQMA
|
28
|
+
EAMCAwYAAAHWAAACYgAAA5X/2wCEABALCwsMCxAMDBAXDw0PFxsUEBAUGx8XFxcXFx8eFxoaGhoX
|
29
|
+
Hh4jJSclIx4vLzMzLy9AQEBAQEBAQEBAQEBAQEABEQ8PERMRFRISFRQRFBEUGhQWFhQaJhoaHBoa
|
30
|
+
JjAjHh4eHiMwKy4nJycuKzU1MDA1NUBAP0BAQEBAQEBAQEBAQP/CABEIAD0APgMBIgACEQEDEQH/
|
31
|
+
xACUAAADAAMBAQAAAAAAAAAAAAAABgcBBAUDAgEBAAAAAAAAAAAAAAAAAAAAABAAAQMDAwQDAAAA
|
32
|
+
AAAAAAAAAwIEBQEGBwAQIEASExUUFhcRAAIBAgIHAg0FAAAAAAAAAAECEQADIQQQIDFBEiITYQVR
|
33
|
+
cYGRscHhQoKiMxQVMmIjQyQSAQAAAAAAAAAAAAAAAAAAAED/2gAMAwEAAhEDEQAAAJ/9FVFVjb8i
|
34
|
+
YrVzBAcPyCNdUR3kAAAPOR2BLNR/i9jPUAADCE3Ro1G5RC7bURcR85yWmnT4gH//2gAIAQIAAQUA
|
35
|
+
6D//2gAIAQMAAQUA6D//2gAIAQEAAQUA0MZCkh8fSL1IsbQ6UOcaxSxzNkSsYitK0roYyFJaNqgj
|
36
|
+
Wm6kpVS+bTQNOsfRSXspxOFBwqgKIuzGQFJZ8nzYaMhYxcp7OTp9VeRLXmKxEq3ONwHhNSYoyP8A
|
37
|
+
ZOPZatS9FRaWUizfB2lZ6OiwXJcjmbc7xXve8X6F2SP3/wAD353l2//aAAgBAgIGPwAH/9oACAED
|
38
|
+
AgY/AAf/2gAIAQEBBj8ApbdpS7uYVRiSaF3ON9tbIwUYtQF13dwMW4iJ81EWLj233NJPpmmvJ/os
|
39
|
+
rJJUcwHi30QRBGBB0LbtqWdzCqNpJpMxmbYbN3AGYnGOwahVhIO0Gm70yKGf7bajb26GzN1Zt5cc
|
40
|
+
vg4jrPZcSrggg9tJ3SfpXLnEo/ZBePliszeMQ78vkAHq1+7LgHNdW6W+G05HprNZYtzcQYLOwRr5
|
41
|
+
IEjgsh1HxW7gNW77GLL8t3xbjS3rTBkcSCNW7mbjQVU8I3zX5Kf5up1PZ5sNCZLOgtlpARx7g7aW
|
42
|
+
9lrquriRBGlruYuiVGCgyTRxK5ZTyJ4e06g/F9acY4J4duO3loR04j3pmj1Ijf0v1fNR+96nUk/U
|
43
|
+
nyxPq0//2Q==" transform="matrix(1 0 0 1 1 0)">
|
44
|
+
</image>
|
45
|
+
</g>
|
46
|
+
</mask>
|
47
|
+
<g opacity="0.27" mask="url(#SVGID_2_)">
|
48
|
+
<circle fill="#EA7878" cx="32.149" cy="30.558" r="28.191"/>
|
49
|
+
</g>
|
50
|
+
</g>
|
51
|
+
<g opacity="0.8">
|
52
|
+
|
53
|
+
<image overflow="visible" width="62" height="12" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD8AAAANCAYAAAAe7bZ5AAAACXBIWXMAAAsSAAALEgHS3X78AAAA
|
54
|
+
GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAgdJREFUeNrUlttO20AQhteJ41Bx
|
55
|
+
iKhKgBtuuOSmFdf0UXgKHoOn6Lv0OkiovUEUCUHFMVXFIQfHDv9In6tRsEKlSk460i977d3R/+/M
|
56
|
+
zk4UnN0dfonCG/bhYH8c5sT+hu80zpFzVNOjISR8Gglj5uR8szmZ/ZPDfMbCPd/IcQ3u3Z5DIS3j
|
57
|
+
GzlH74Q1YR2RvxEa22Lm14UH4ZfQl8NshsI93wSODaYU7yb82pYIvUm+EaljizeFXeGj0BRuWGzv
|
58
|
+
fXbRNuJc+C5clDmsKNU930/CsjAQFpjWh/eTcCx04PvsMyDmmbCDJnxPWGXhiB1MEW9CT4Ul1l2I
|
59
|
+
zPMMjoDn+9mONdwSF3nT9si8wOb8FN9hUQPikmNg6bThHNUQXohvk/5pmcMKrciAFbIggWugRkXw
|
60
|
+
q3NMLWPvyeY/wgIfLM2/gVuiXliDNGoifge03SZVaUOEnHGmh050cNG38aLwnmfdF/nYIqbIpQju
|
61
|
+
INQivM1kG7dctGuuBlRu8LXAdIUT6k8LFAU6o2Ab355wxTHOPO8Yh7kc9igKgbOyxeSmq6gDxlbx
|
62
|
+
jyZ2vUrL4fhD+IqwZcevqPIDIm0Zcsn49T1PJa1TMVdxlhPxlrvy/BVyS8Wv/M5/47obuau6RrC6
|
63
|
+
XM95qXjnNEZ00SzEE43E1OZhDhqd8USTVtqYRf/SOs5Dq/u/teRzYy8CDAAUkd35+IZT8gAAAABJ
|
64
|
+
RU5ErkJggg==" transform="matrix(1 0 0 1 1.0781 19.0781)">
|
65
|
+
</image>
|
66
|
+
<g>
|
67
|
+
<g>
|
68
|
+
|
69
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="5.521" y1="23.466" x2="8.366" y2="26.819"/>
|
70
|
+
|
71
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="8.648" y1="23.466" x2="11.493" y2="26.819"/>
|
72
|
+
|
73
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="11.775" y1="23.466" x2="14.62" y2="26.819"/>
|
74
|
+
|
75
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="49.16" y1="23.466" x2="52.005" y2="26.818"/>
|
76
|
+
|
77
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="52.286" y1="23.466" x2="55.132" y2="26.818"/>
|
78
|
+
|
79
|
+
<line fill="none" stroke="#E43860" stroke-width="2.922" stroke-miterlimit="10" x1="55.414" y1="23.466" x2="58.259" y2="26.818"/>
|
80
|
+
</g>
|
81
|
+
</g>
|
82
|
+
</g>
|
83
|
+
<ellipse fill="#78211C" cx="43.037" cy="17.842" rx="3.53" ry="5.06"/>
|
84
|
+
<ellipse fill="#78211C" cx="21.262" cy="17.842" rx="3.53" ry="5.06"/>
|
85
|
+
<path fill="#842C38" d="M50.572,33.182c0,10.365-8.246,18.771-18.423,18.771c-10.175,0-18.423-8.406-18.423-18.771
|
86
|
+
c7.438-0.216,8.249,1.555,18.423,1.555C42.326,34.736,42.326,33.182,50.572,33.182z"/>
|
87
|
+
<circle fill="none" stroke="#B95E5D" stroke-width="2.435" stroke-miterlimit="10" cx="32.149" cy="30.558" r="27.349"/>
|
88
|
+
<circle fill="none" stroke="#541715" stroke-width="2.435" stroke-miterlimit="10" cx="32.149" cy="30.558" r="28.191"/>
|
89
|
+
<polygon fill="#FFFFFF" points="50.427,38.572 13.872,38.572 13.872,33.701 31.913,35.256 50.427,33.701 "/>
|
90
|
+
<path fill="none" stroke="#51090E" stroke-width="1.948" stroke-miterlimit="10" d="M50.572,33.182
|
91
|
+
c0,10.365-8.246,18.771-18.423,18.771c-10.175,0-18.423-8.406-18.423-18.771c8.249,0,8.249,1.555,18.423,1.555
|
92
|
+
C42.326,34.736,42.326,33.182,50.572,33.182z"/>
|
93
|
+
<g>
|
94
|
+
<path fill="#EA7C91" stroke="#65132B" stroke-width="1.3207" stroke-miterlimit="10" d="M20.132,43.96
|
95
|
+
c0,0,5.132-0.902,10.785-0.902s9.44,0.153,12.716,1.036c0,0,0,2.58,0,4.142c0,1.561-6.805,3.102-12.029,3.102
|
96
|
+
c-5.225,0-11.473-1.335-11.473-3.102C20.132,46.468,20.132,43.96,20.132,43.96z"/>
|
97
|
+
<path fill="#E42A56" d="M42.94,43.752c0,0-5.326-1.161-10.937-1.161c-7.139,0-11.715,1.251-11.715,1.251v1.201
|
98
|
+
c0,0,4.87-0.609,10.513-0.68l1.202,4.377l1.168-4.388c3.103,0.017,6.27,0.275,9.769,0.61V43.752z"/>
|
99
|
+
<path fill="none" stroke="#65132B" stroke-width="1.3207" stroke-miterlimit="10" d="M20.132,43.471c0,0,5.132-0.903,10.785-0.903
|
100
|
+
s9.44,0.152,12.716,1.034c0,0,0,2.582,0,4.143c0,1.563-6.805,3.104-12.029,3.104c-5.225,0-11.473-1.336-11.473-3.104
|
101
|
+
C20.132,45.978,20.132,43.471,20.132,43.471z"/>
|
102
|
+
</g>
|
103
|
+
</svg>
|