vectory 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +1 -1
  3. data/.github/workflows/release.yml +24 -0
  4. data/.gitignore +4 -0
  5. data/README.adoc +157 -1
  6. data/Rakefile +4 -0
  7. data/bin/vectory +9 -0
  8. data/emf.emf +1 -0
  9. data/lib/vectory/cli.rb +140 -0
  10. data/lib/vectory/datauri.rb +48 -0
  11. data/lib/vectory/emf.rb +31 -0
  12. data/lib/vectory/eps.rb +31 -0
  13. data/lib/vectory/file_magic.rb +53 -0
  14. data/lib/vectory/image.rb +23 -0
  15. data/lib/vectory/inkscape_converter.rb +72 -0
  16. data/lib/vectory/ps.rb +25 -0
  17. data/lib/vectory/svg.rb +27 -0
  18. data/lib/vectory/system_call.rb +49 -0
  19. data/lib/vectory/utils.rb +54 -0
  20. data/lib/vectory/vector.rb +74 -0
  21. data/lib/vectory/version.rb +1 -1
  22. data/lib/vectory.rb +34 -1
  23. data/spec/examples/emf2eps/img.emf +0 -0
  24. data/spec/examples/emf2eps/img.emf.datauri +1 -0
  25. data/spec/examples/emf2eps/img.eps +88 -0
  26. data/spec/examples/emf2ps/img.emf +0 -0
  27. data/spec/examples/emf2ps/img.ps +125 -0
  28. data/spec/examples/emf2svg/img.emf +0 -0
  29. data/spec/examples/emf2svg/img.svg +9 -0
  30. data/spec/examples/eps2emf/img.emf +0 -0
  31. data/spec/examples/eps2emf/img.eps +199 -0
  32. data/spec/examples/eps2emf/img.eps.datauri +1 -0
  33. data/spec/examples/eps2ps/img.eps +199 -0
  34. data/spec/examples/eps2ps/img.ps +549 -0
  35. data/spec/examples/eps2svg/img.eps +199 -0
  36. data/spec/examples/eps2svg/img.svg +173 -0
  37. data/spec/examples/eps_but_svg_extension.svg +199 -0
  38. data/spec/examples/img.jpg +0 -0
  39. data/spec/examples/ps2emf/img.emf +0 -0
  40. data/spec/examples/ps2emf/img.ps +549 -0
  41. data/spec/examples/ps2emf/img.ps.datauri +1 -0
  42. data/spec/examples/ps2eps/img.eps +844 -0
  43. data/spec/examples/ps2eps/img.ps +549 -0
  44. data/spec/examples/ps2svg/img.ps +549 -0
  45. data/spec/examples/ps2svg/img.svg +476 -0
  46. data/spec/examples/svg2emf/img.emf +0 -0
  47. data/spec/examples/svg2emf/img.svg +1 -0
  48. data/spec/examples/svg2emf/img.svg.datauri +1 -0
  49. data/spec/examples/svg2eps/img.eps +88 -0
  50. data/spec/examples/svg2eps/img.svg +1 -0
  51. data/spec/examples/svg2ps/img.ps +125 -0
  52. data/spec/examples/svg2ps/img.svg +1 -0
  53. data/spec/spec_helper.rb +7 -0
  54. data/spec/support/matchers.rb +39 -0
  55. data/spec/support/text_matcher.rb +63 -0
  56. data/spec/support/vectory_helper.rb +17 -0
  57. data/spec/vectory/cli_spec.rb +214 -0
  58. data/spec/vectory/datauri_spec.rb +101 -0
  59. data/spec/vectory/emf_spec.rb +38 -0
  60. data/spec/vectory/eps_spec.rb +40 -0
  61. data/spec/vectory/file_magic_spec.rb +24 -0
  62. data/spec/vectory/inkscape_converter_spec.rb +38 -0
  63. data/spec/vectory/ps_spec.rb +33 -0
  64. data/spec/vectory/svg_spec.rb +33 -0
  65. data/spec/vectory/vector_spec.rb +60 -0
  66. data/tmp/.keep +0 -0
  67. data/vectory.gemspec +10 -3
  68. metadata +163 -20
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Vectory
4
+ class Svg < Vector
5
+ SVG = { "m" => "http://www.w3.org/2000/svg" }.freeze
6
+
7
+ def self.default_extension
8
+ "svg"
9
+ end
10
+
11
+ def self.mimetype
12
+ "image/svg+xml"
13
+ end
14
+
15
+ def to_emf
16
+ convert_with_inkscape("--export-type=emf", Emf)
17
+ end
18
+
19
+ def to_eps
20
+ convert_with_inkscape("--export-type=eps", Eps)
21
+ end
22
+
23
+ def to_ps
24
+ convert_with_inkscape("--export-type=ps", Ps)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,49 @@
1
+ require "open3"
2
+
3
+ module Vectory
4
+ class SystemCall
5
+ attr_reader :status, :stdout, :stderr, :cmd
6
+
7
+ def initialize(cmd)
8
+ @cmd = cmd
9
+ end
10
+
11
+ def call
12
+ log_cmd(@cmd)
13
+
14
+ execute(@cmd)
15
+
16
+ log_result
17
+
18
+ raise_error unless @status.success?
19
+
20
+ self
21
+ end
22
+
23
+ private
24
+
25
+ def log_cmd(cmd)
26
+ Vectory.ui.debug("Cmd: '#{cmd}'")
27
+ end
28
+
29
+ def execute(cmd)
30
+ @stdout, @stderr, @status = Open3.capture3(cmd)
31
+ rescue Errno::ENOENT => e
32
+ raise SystemCallError, e.inspect
33
+ end
34
+
35
+ def log_result
36
+ Vectory.ui.debug("Status: #{@status.inspect}")
37
+ Vectory.ui.debug("Stdout: '#{@stdout.strip}'")
38
+ Vectory.ui.debug("Stderr: '#{@stderr.strip}'")
39
+ end
40
+
41
+ def raise_error
42
+ raise SystemCallError,
43
+ "Failed to run #{@cmd},\n " \
44
+ "status: #{@status.exitstatus},\n " \
45
+ "stdout: '#{@stdout.strip}',\n " \
46
+ "stderr: '#{@stderr.strip}'"
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Vectory
4
+ class Utils
5
+ # Extracted from https://github.com/metanorma/metanorma-utils/blob/v1.5.2/lib/utils/image.rb
6
+ class << self
7
+ # sources/plantuml/plantuml20200524-90467-1iqek5i.png
8
+ # already includes localdir
9
+ # Check whether just the local path or the other specified relative path
10
+ # works.
11
+ def datauri(uri, local_dir = ".")
12
+ return uri if datauri?(uri) || url?(uri)
13
+
14
+ options = absolute_path?(uri) ? [uri] : [uri, File.join(local_dir, uri)]
15
+ path = options.detect do |p|
16
+ File.exist?(p) ? p : nil
17
+ end
18
+
19
+ unless path
20
+ warn "Image specified at `#{uri}` does not exist."
21
+ return uri # Return original provided location
22
+ end
23
+
24
+ encode_datauri(path)
25
+ end
26
+
27
+ def encode_datauri(path)
28
+ return nil unless File.exist?(path)
29
+
30
+ type = Marcel::MimeType.for(Pathname.new(path)) ||
31
+ 'text/plain; charset="utf-8"'
32
+
33
+ bin = File.binread(path)
34
+ data = Base64.strict_encode64(bin)
35
+ "data:#{type};base64,#{data}"
36
+ rescue StandardError
37
+ warn "Data-URI encoding of `#{path}` failed."
38
+ nil
39
+ end
40
+
41
+ def datauri?(uri)
42
+ /^data:/.match?(uri)
43
+ end
44
+
45
+ def url?(url)
46
+ %r{^[A-Z]{2,}://}i.match?(url)
47
+ end
48
+
49
+ def absolute_path?(uri)
50
+ %r{^/}.match?(uri) || %r{^[A-Z]:/}.match?(uri)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "inkscape_converter"
4
+
5
+ module Vectory
6
+ class Vector < Image
7
+ def self.from_path(path)
8
+ content = File.read(path, mode: "rb")
9
+ new(content, path)
10
+ end
11
+
12
+ def self.default_extension
13
+ raise Vectory::NotImplementedError,
14
+ "#default_extension should be implemented in a subclass."
15
+ end
16
+
17
+ def self.mimetype
18
+ raise Vectory::NotImplementedError,
19
+ "#mimetype should be implemented in a subclass."
20
+ end
21
+
22
+ attr_reader :initial_path
23
+
24
+ def initialize(content = nil, initial_path = nil)
25
+ super(content)
26
+
27
+ @initial_path = initial_path
28
+ end
29
+
30
+ def to_uri
31
+ Datauri.from_vector(self)
32
+ end
33
+
34
+ def convert_with_inkscape(inkscape_options, target_class)
35
+ with_file(self.class.default_extension) do |input_path|
36
+ output_extension = target_class.default_extension
37
+ output_path = InkscapeConverter.instance.convert(input_path,
38
+ output_extension,
39
+ inkscape_options)
40
+
41
+ target_class.from_path(output_path)
42
+ end
43
+ end
44
+
45
+ def write(path = nil)
46
+ target_path = path || @path || tmp_path
47
+ File.binwrite(target_path, @content)
48
+ @path = File.expand_path(target_path)
49
+
50
+ self
51
+ end
52
+
53
+ def path
54
+ @path || raise(NotWrittenToDiskError)
55
+ end
56
+
57
+ private
58
+
59
+ def with_file(input_extension)
60
+ Dir.mktmpdir do |dir|
61
+ input_path = File.join(dir, "image.#{input_extension}")
62
+ File.binwrite(input_path, @content)
63
+
64
+ yield input_path
65
+ end
66
+ end
67
+
68
+ def tmp_path
69
+ dir = Dir.mktmpdir
70
+ filename = "image.#{self.class.default_extension}"
71
+ File.join(dir, filename)
72
+ end
73
+ end
74
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vectory
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/vectory.rb CHANGED
@@ -1,8 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "logger"
3
4
  require_relative "vectory/version"
5
+ require_relative "vectory/utils"
6
+ require_relative "vectory/image"
7
+ require_relative "vectory/datauri"
8
+ require_relative "vectory/vector"
9
+ require_relative "vectory/eps"
10
+ require_relative "vectory/ps"
11
+ require_relative "vectory/emf"
12
+ require_relative "vectory/svg"
4
13
 
5
14
  module Vectory
6
15
  class Error < StandardError; end
7
- # Your code goes here...
16
+
17
+ class ConversionError < Error; end
18
+
19
+ class SystemCallError < Error; end
20
+
21
+ class InkscapeNotFoundError < Error; end
22
+
23
+ class NotImplementedError < Error; end
24
+
25
+ class NotWrittenToDiskError < Error; end
26
+
27
+ def self.ui
28
+ @ui ||= Logger.new(STDOUT).tap do |logger|
29
+ logger.level = ENV['VECTORY_LOG'] || Logger::WARN
30
+ logger.formatter = proc { |severity, datetime, progname, msg| "#{msg}\n" }
31
+ end
32
+ end
33
+
34
+ def self.root_path
35
+ Pathname.new(File.dirname(__dir__))
36
+ end
37
+
38
+ def self.convert(image, format)
39
+ image.convert(format)
40
+ end
8
41
  end
Binary file
@@ -0,0 +1 @@
1
+ data:image/emf;base64,AQAAANQAAAAAAAAAAAAAAPsEAAD7BAAAAAAAAAAAAACLCgAAiwoAACBFTUYAAAEAMAQAACgAAAACAAAANAAAAGwAAAAAAAAA3ScAAH0zAADYAAAAFwEAAAAAAAAAAAAAAAAAAMBLAwDYQQQASQBuAGsAcwBjAGEAcABlACAAMQAuADMAIAAoADAAZQAxADUAMABlAGQALAAgADIAMAAyADMALQAwADcALQAyADEAKQAgAAAAZgBpAGwAZQAzAC4AcwB2AGcALgBlAG0AZgAAAAAAAAARAAAADAAAAAEAAAAkAAAAJAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAIAAABGAAAALAAAACAAAABTY3JlZW49MTAyMDV4MTMxODFweCwgMjE2eDI3OW1tAEYAAAAwAAAAIwAAAERyYXdpbmc9MTAwLjB4MTAwLjBweCwgMjYuNXgyNi41bW0AABIAAAAMAAAAAQAAABMAAAAMAAAAAgAAABYAAAAMAAAAGAAAABgAAAAMAAAAAAAAABQAAAAMAAAADQAAACcAAAAYAAAAAQAAAAAAAAAAAJkABgAAACUAAAAMAAAAAQAAADsAAAAIAAAAGwAAABAAAACkBAAAcQIAAAUAAAA0AAAAAAAAAAAAAAD//////////wMAAACkBAAAqAMAAKgDAACkBAAAcQIAAKQEAAAFAAAANAAAAAAAAAAAAAAA//////////8DAAAAOgEAAKQEAAA/AAAAqAMAAD8AAABxAgAABQAAADQAAAAAAAAAAAAAAP//////////AwAAAD8AAAA6AQAAOgEAAD8AAABxAgAAPwAAAAUAAAA0AAAAAAAAAAAAAAD//////////wMAAACoAwAAPwAAAKQEAAA6AQAApAQAAHECAAA9AAAACAAAADwAAAAIAAAAPgAAABgAAAAAAAAAAAAAAP//////////JQAAAAwAAAAFAACAKAAAAAwAAAABAAAAJwAAABgAAAABAAAAAAAAAP///wAGAAAAJQAAAAwAAAABAAAAOwAAAAgAAAAbAAAAEAAAAJ0BAABFAQAANgAAABAAAADPAwAARQEAAAUAAAA0AAAAAAAAAAAAAAD//////////wMAAABfBAAA7QEAAGQEAADjAgAA2wMAAJEDAAAFAAAANAAAAAAAAAAAAAAA//////////8DAAAAUgMAAD4EAABhAgAAcwQAAJ0BAAAOBAAANgAAABAAAACdAQAAyQIAADYAAAAQAAAA4gIAAMkCAAA2AAAAEAAAAOICAAAaAgAANgAAABAAAACdAQAAGgIAAD0AAAAIAAAAPAAAAAgAAAA+AAAAGAAAAAAAAAAAAAAA//////////8lAAAADAAAAAUAAIAoAAAADAAAAAEAAAAOAAAAFAAAAAAAAAAAAAAAMAQAAA==
@@ -0,0 +1,88 @@
1
+ %!PS-Adobe-3.0 EPSF-3.0
2
+ %%Creator: cairo 1.17.9 (https://cairographics.org)
3
+ %%CreationDate: Mon Oct 2 11:24:42 2023
4
+ %%Pages: 1
5
+ %%DocumentData: Clean7Bit
6
+ %%LanguageLevel: 2
7
+ %%BoundingBox: 3 5 72 74
8
+ %%EndComments
9
+ %%BeginProlog
10
+ 50 dict begin
11
+ /q { gsave } bind def
12
+ /Q { grestore } bind def
13
+ /cm { 6 array astore concat } bind def
14
+ /w { setlinewidth } bind def
15
+ /J { setlinecap } bind def
16
+ /j { setlinejoin } bind def
17
+ /M { setmiterlimit } bind def
18
+ /d { setdash } bind def
19
+ /m { moveto } bind def
20
+ /l { lineto } bind def
21
+ /c { curveto } bind def
22
+ /h { closepath } bind def
23
+ /re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
24
+ 0 exch rlineto 0 rlineto closepath } bind def
25
+ /S { stroke } bind def
26
+ /f { fill } bind def
27
+ /f* { eofill } bind def
28
+ /n { newpath } bind def
29
+ /W { clip } bind def
30
+ /W* { eoclip } bind def
31
+ /BT { } bind def
32
+ /ET { } bind def
33
+ /BDC { mark 3 1 roll /BDC pdfmark } bind def
34
+ /EMC { mark /EMC pdfmark } bind def
35
+ /cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
36
+ /Tj { show currentpoint cairo_store_point } bind def
37
+ /TJ {
38
+ {
39
+ dup
40
+ type /stringtype eq
41
+ { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
42
+ } forall
43
+ currentpoint cairo_store_point
44
+ } bind def
45
+ /cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
46
+ cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
47
+ /Tf { pop /cairo_font exch def /cairo_font_matrix where
48
+ { pop cairo_selectfont } if } bind def
49
+ /Td { matrix translate cairo_font_matrix matrix concatmatrix dup
50
+ /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
51
+ /cairo_font where { pop cairo_selectfont } if } bind def
52
+ /Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
53
+ cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
54
+ /g { setgray } bind def
55
+ /rg { setrgbcolor } bind def
56
+ /d1 { setcachedevice } bind def
57
+ /cairo_data_source {
58
+ CairoDataIndex CairoData length lt
59
+ { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
60
+ { () } ifelse
61
+ } def
62
+ /cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
63
+ /cairo_image { image cairo_flush_ascii85_file } def
64
+ /cairo_imagemask { imagemask cairo_flush_ascii85_file } def
65
+ %%EndProlog
66
+ %%BeginSetup
67
+ %%EndSetup
68
+ %%Page: 1 1
69
+ %%BeginPageSetup
70
+ %%PageBoundingBox: 3 5 72 74
71
+ %%EndPageSetup
72
+ q 3 5 69 69 rectclip
73
+ 1 0 0 -1 0 77 cm q
74
+ 0 0 0.6 rg
75
+ 71.281 37.5 m 71.281 56.16 56.16 71.281 37.5 71.281 c 18.84 71.281 3.781
76
+ 56.16 3.781 37.5 c 3.781 18.84 18.84 3.781 37.5 3.781 c 56.16 3.781 71.281
77
+ 18.84 71.281 37.5 c h
78
+ 71.281 37.5 m f
79
+ 1 g
80
+ 24.781 19.5 m 58.5 19.5 l 67.141 29.578 67.441 44.34 59.219 54.781 c 51
81
+ 65.16 36.539 68.34 24.781 62.281 c 24.781 42.781 l 44.281 42.781 l 44.281
82
+ 32.281 l 24.781 32.281 l h
83
+ 24.781 19.5 m f
84
+ Q Q
85
+ showpage
86
+ %%Trailer
87
+ end
88
+ %%EOF
Binary file
@@ -0,0 +1,125 @@
1
+ %!PS-Adobe-3.0
2
+ %%Creator: cairo 1.17.9 (https://cairographics.org)
3
+ %%CreationDate: Fri Oct 6 12:34:05 2023
4
+ %%Pages: 1
5
+ %%DocumentData: Clean7Bit
6
+ %%LanguageLevel: 2
7
+ %%DocumentMedia: 27x27mm 77 77 0 () ()
8
+ %%BoundingBox: 3 5 72 74
9
+ %%EndComments
10
+ %%BeginProlog
11
+ /languagelevel where
12
+ { pop languagelevel } { 1 } ifelse
13
+ 2 lt { /Helvetica findfont 12 scalefont setfont 50 500 moveto
14
+ (This print job requires a PostScript Language Level 2 printer.) show
15
+ showpage quit } if
16
+ /q { gsave } bind def
17
+ /Q { grestore } bind def
18
+ /cm { 6 array astore concat } bind def
19
+ /w { setlinewidth } bind def
20
+ /J { setlinecap } bind def
21
+ /j { setlinejoin } bind def
22
+ /M { setmiterlimit } bind def
23
+ /d { setdash } bind def
24
+ /m { moveto } bind def
25
+ /l { lineto } bind def
26
+ /c { curveto } bind def
27
+ /h { closepath } bind def
28
+ /re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
29
+ 0 exch rlineto 0 rlineto closepath } bind def
30
+ /S { stroke } bind def
31
+ /f { fill } bind def
32
+ /f* { eofill } bind def
33
+ /n { newpath } bind def
34
+ /W { clip } bind def
35
+ /W* { eoclip } bind def
36
+ /BT { } bind def
37
+ /ET { } bind def
38
+ /BDC { mark 3 1 roll /BDC pdfmark } bind def
39
+ /EMC { mark /EMC pdfmark } bind def
40
+ /cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
41
+ /Tj { show currentpoint cairo_store_point } bind def
42
+ /TJ {
43
+ {
44
+ dup
45
+ type /stringtype eq
46
+ { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
47
+ } forall
48
+ currentpoint cairo_store_point
49
+ } bind def
50
+ /cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
51
+ cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
52
+ /Tf { pop /cairo_font exch def /cairo_font_matrix where
53
+ { pop cairo_selectfont } if } bind def
54
+ /Td { matrix translate cairo_font_matrix matrix concatmatrix dup
55
+ /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
56
+ /cairo_font where { pop cairo_selectfont } if } bind def
57
+ /Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
58
+ cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
59
+ /g { setgray } bind def
60
+ /rg { setrgbcolor } bind def
61
+ /d1 { setcachedevice } bind def
62
+ /cairo_data_source {
63
+ CairoDataIndex CairoData length lt
64
+ { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
65
+ { () } ifelse
66
+ } def
67
+ /cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
68
+ /cairo_image { image cairo_flush_ascii85_file } def
69
+ /cairo_imagemask { imagemask cairo_flush_ascii85_file } def
70
+ /cairo_set_page_size {
71
+ % Change paper size, but only if different from previous paper size otherwise
72
+ % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size
73
+ % so we use the same when checking if the size changes.
74
+ /setpagedevice where {
75
+ pop currentpagedevice
76
+ /PageSize known {
77
+ 2 copy
78
+ currentpagedevice /PageSize get aload pop
79
+ exch 4 1 roll
80
+ sub abs 5 gt
81
+ 3 1 roll
82
+ sub abs 5 gt
83
+ or
84
+ } {
85
+ true
86
+ } ifelse
87
+ {
88
+ 2 array astore
89
+ 2 dict begin
90
+ /PageSize exch def
91
+ /ImagingBBox null def
92
+ currentdict end
93
+ setpagedevice
94
+ } {
95
+ pop pop
96
+ } ifelse
97
+ } {
98
+ pop
99
+ } ifelse
100
+ } def
101
+ %%EndProlog
102
+ %%BeginSetup
103
+ %%EndSetup
104
+ %%Page: 1 1
105
+ %%BeginPageSetup
106
+ %%PageMedia: 27x27mm
107
+ %%PageBoundingBox: 3 5 72 74
108
+ 77 77 cairo_set_page_size
109
+ %%EndPageSetup
110
+ q 3 5 69 69 rectclip
111
+ 1 0 0 -1 0 77 cm q
112
+ 0 0 0.6 rg
113
+ 71.281 37.5 m 71.281 56.16 56.16 71.281 37.5 71.281 c 18.84 71.281 3.781
114
+ 56.16 3.781 37.5 c 3.781 18.84 18.84 3.781 37.5 3.781 c 56.16 3.781 71.281
115
+ 18.84 71.281 37.5 c h
116
+ 71.281 37.5 m f
117
+ 1 g
118
+ 24.781 19.5 m 58.5 19.5 l 67.141 29.578 67.441 44.34 59.219 54.781 c 51
119
+ 65.16 36.539 68.34 24.781 62.281 c 24.781 42.781 l 44.281 42.781 l 44.281
120
+ 32.281 l 24.781 32.281 l h
121
+ 24.781 19.5 m f
122
+ Q Q
123
+ showpage
124
+ %%Trailer
125
+ %%EOF
Binary file
@@ -0,0 +1,9 @@
1
+
2
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1275.0000" height="1275.0000">
3
+ <g transform="translate(-0.0000, -0.0000)">
4
+ <g transform="matrix(1.0000 0.0000 0.0000 1.0000 0.0000 0.0000)">
5
+ <path d="M 1188.0000,625.0000 C 1188.0000,936.0000 936.0000,1188.0000 625.0000,1188.0000 C 314.0000,1188.0000 63.0000,936.0000 63.0000,625.0000 C 63.0000,314.0000 314.0000,63.0000 625.0000,63.0000 C 936.0000,63.0000 1188.0000,314.0000 1188.0000,625.0000 Z " fill="#000099" stroke="none" />
6
+ <path d="M 413.0000,325.0000 L 975.0000,325.0000 C 1119.0000,493.0000 1124.0000,739.0000 987.0000,913.0000 C 850.0000,1086.0000 609.0000,1139.0000 413.0000,1038.0000 L 413.0000,713.0000 L 738.0000,713.0000 L 738.0000,538.0000 L 413.0000,538.0000 Z " fill="#FFFFFF" stroke="none" />
7
+ </g>
8
+ </g>
9
+ </svg>
Binary file
@@ -0,0 +1,199 @@
1
+ %!PS-Adobe-3.0 EPSF-3.0
2
+ %%Document-Fonts: Times-Roman
3
+ %%Title: circle.eps
4
+ %%Creator: PS_Write.F
5
+ %%CreationDate: 02-Aug-99
6
+ %%Pages: 1
7
+ %%BoundingBox: 36 36 576 756
8
+ %%LanguageLevel: 1
9
+ %%EndComments
10
+ %%BeginProlog
11
+ %%EndProlog
12
+ /inch {72 mul} def
13
+ /Palatino-Roman findfont
14
+ 1.00 inch scalefont
15
+ setfont
16
+ 0.0000 0.0000 0.0000 setrgbcolor
17
+ %% Page: 1 1
18
+ save
19
+ 63 153 moveto
20
+ newpath
21
+ 63 153 moveto
22
+ 549 153 lineto
23
+ stroke
24
+ newpath
25
+ 549 153 moveto
26
+ 549 639 lineto
27
+ stroke
28
+ newpath
29
+ 549 639 moveto
30
+ 63 639 lineto
31
+ stroke
32
+ newpath
33
+ 63 639 moveto
34
+ 63 153 lineto
35
+ stroke
36
+ newpath
37
+ 360 261 108 0 360 arc
38
+ closepath stroke
39
+ newpath
40
+ 361 357 moveto
41
+ 358 358 lineto
42
+ 353 356 lineto
43
+ 348 353 lineto
44
+ 342 347 lineto
45
+ 336 340 lineto
46
+ 329 331 lineto
47
+ 322 321 lineto
48
+ 315 309 lineto
49
+ 307 296 lineto
50
+ 300 283 lineto
51
+ 292 268 lineto
52
+ 285 253 lineto
53
+ 278 237 lineto
54
+ 271 222 lineto
55
+ 266 206 lineto
56
+ 260 191 lineto
57
+ 256 177 lineto
58
+ 252 164 lineto
59
+ 249 152 lineto
60
+ 247 141 lineto
61
+ 246 131 lineto
62
+ 246 123 lineto
63
+ 247 117 lineto
64
+ 248 113 lineto
65
+ 251 111 lineto
66
+ 254 110 lineto
67
+ 259 112 lineto
68
+ 264 115 lineto
69
+ 270 121 lineto
70
+ 276 128 lineto
71
+ 283 137 lineto
72
+ 290 147 lineto
73
+ 297 159 lineto
74
+ 305 172 lineto
75
+ 312 185 lineto
76
+ 320 200 lineto
77
+ 327 215 lineto
78
+ 334 231 lineto
79
+ 341 246 lineto
80
+ 346 262 lineto
81
+ 352 277 lineto
82
+ 356 291 lineto
83
+ 360 304 lineto
84
+ 363 316 lineto
85
+ 365 327 lineto
86
+ 366 337 lineto
87
+ 366 345 lineto
88
+ 365 351 lineto
89
+ 364 355 lineto
90
+ 361 357 lineto
91
+ stroke
92
+ newpath
93
+ 171 261 moveto
94
+ 171 531 lineto
95
+ stroke
96
+ newpath
97
+ 198 261 moveto
98
+ 198 531 lineto
99
+ stroke
100
+ newpath
101
+ 225 261 moveto
102
+ 225 531 lineto
103
+ stroke
104
+ newpath
105
+ 252 261 moveto
106
+ 252 531 lineto
107
+ stroke
108
+ newpath
109
+ 279 261 moveto
110
+ 279 531 lineto
111
+ stroke
112
+ newpath
113
+ 306 261 moveto
114
+ 306 531 lineto
115
+ stroke
116
+ newpath
117
+ 333 261 moveto
118
+ 333 531 lineto
119
+ stroke
120
+ newpath
121
+ 360 261 moveto
122
+ 360 531 lineto
123
+ stroke
124
+ newpath
125
+ 387 261 moveto
126
+ 387 531 lineto
127
+ stroke
128
+ newpath
129
+ 414 261 moveto
130
+ 414 531 lineto
131
+ stroke
132
+ newpath
133
+ 441 261 moveto
134
+ 441 531 lineto
135
+ stroke
136
+ newpath
137
+ 171 261 moveto
138
+ 441 261 lineto
139
+ stroke
140
+ newpath
141
+ 171 288 moveto
142
+ 441 288 lineto
143
+ stroke
144
+ newpath
145
+ 171 315 moveto
146
+ 441 315 lineto
147
+ stroke
148
+ newpath
149
+ 171 342 moveto
150
+ 441 342 lineto
151
+ stroke
152
+ newpath
153
+ 171 369 moveto
154
+ 441 369 lineto
155
+ stroke
156
+ newpath
157
+ 171 396 moveto
158
+ 441 396 lineto
159
+ stroke
160
+ newpath
161
+ 171 423 moveto
162
+ 441 423 lineto
163
+ stroke
164
+ newpath
165
+ 171 450 moveto
166
+ 441 450 lineto
167
+ stroke
168
+ newpath
169
+ 171 477 moveto
170
+ 441 477 lineto
171
+ stroke
172
+ newpath
173
+ 171 504 moveto
174
+ 441 504 lineto
175
+ stroke
176
+ newpath
177
+ 171 531 moveto
178
+ 441 531 lineto
179
+ stroke
180
+ newpath
181
+ 306 396 5 0 360 arc
182
+ closepath stroke
183
+ 0.0000 1.0000 0.0000 setrgbcolor
184
+ newpath
185
+ 387 477 54 0 90 arc
186
+ stroke
187
+ 171 261 moveto
188
+ 0.0000 0.0000 0.0000 setrgbcolor
189
+ /Palatino-Roman findfont
190
+ 0.250 inch scalefont
191
+ setfont
192
+ (This is "circle.plot".) show
193
+ 171 342 moveto
194
+ /Palatino-Roman findfont
195
+ 0.125 inch scalefont
196
+ setfont
197
+ (This is small print.) show
198
+ restore showpage
199
+ %%Trailer