vectory 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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