text2svg 0.3.4 → 0.3.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 357a62eff27092a7b4e254787d0a864a35806029
4
- data.tar.gz: f8550343fa880b9dcc680947d3098c6f71ee264c
3
+ metadata.gz: 5dc265c2022da3597a26d0b43dd53540ff28000d
4
+ data.tar.gz: 666f2d5988a3cb2be258b695edb1ee2ed7152dfd
5
5
  SHA512:
6
- metadata.gz: 3db21fadbd92f6b74eecbff8a628dac2fc26041633867648e54736d5fdef7970d06a797407c9031ae3aa750048f3471e2e9034e94341d2d2c7bf3b1d2683e161
7
- data.tar.gz: 87db9c21fddd3c7298eb4701f45339e30791a2883dca29d104a67df1e2848a7ee8eb7f960476885cc5ef2d14509e54cfc89c8d7649a1b9d7736c7a8b41c001fb
6
+ metadata.gz: a2ebd92f86fb3b0b69d2abe5c529a5b66e08581790533ab75d72270bc2bdd3b0a17fcfb567ac5b99cc71f886bb828e014a75c25fcf45bdaf656d4f8db83079fd
7
+ data.tar.gz: 39329909625340a14ca97d2f0d9df5775dd21dfec2380f5510dbe617b33e4b6d655fc5da49c138ca1e2ff3ef38cbfc9f156ae5a69774a8e1b233c64f7f30fbc5
data/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ before_install:
3
+ - sudo apt-get install -qq libfreetype6-dev
4
+ rvm:
5
+ - 2.1.7 # ffi is not support to 2.1.8
6
+ - 2.2.4
7
+ - 2.3.0
8
+ matrix:
9
+ allow_failures:
10
+ - rvm: ruby-head
11
+ notifications:
12
+ email: false
13
+ before_install: gem install bundler -v 1.11.2
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Text2svg
2
2
 
3
+ [![Build Status](https://travis-ci.org/ksss/text2svg.svg?branch=master)](https://travis-ci.org/ksss/text2svg)
4
+
3
5
  Build svg path data from font file
4
6
 
5
7
  Using by freetype API
data/data/Lobster.otf ADDED
Binary file
data/data/sporq.ttf ADDED
Binary file
@@ -19,7 +19,7 @@ module Text2svgCLITest
19
19
  def test_start(t)
20
20
  %w(left right center).each do |text_align|
21
21
  ARGV[0] = "Hello,\nWorld!"
22
- ARGV[1] = '--font=/Library/Fonts/Times New Roman.ttf'
22
+ ARGV[1] = '--font=data/sporq.ttf'
23
23
  ARGV[2] = "--text-align=#{text_align}"
24
24
 
25
25
  check(t)
@@ -32,7 +32,7 @@ module Text2svgCLITest
32
32
  ['utf-32', "\x00\x00\xFE\xFF\x00\x00\xF0\x9B".force_encoding(Encoding::ASCII_8BIT)],
33
33
  ].each do |(encoding, text)|
34
34
  ARGV[0] = text
35
- ARGV[1] = '--font=~/Library/Fonts/fontawesome-webfont.ttf'
35
+ ARGV[1] = '--font=data/sporq.ttf'
36
36
  ARGV[2] = "--encoding=#{encoding}"
37
37
  check(t)
38
38
  end
@@ -40,14 +40,14 @@ module Text2svgCLITest
40
40
 
41
41
  def test_bold(t)
42
42
  ARGV[0] = 'Hello'
43
- ARGV[1] = '--font=/Library/Fonts/Times New Roman.ttf'
43
+ ARGV[1] = '--font=data/sporq.ttf'
44
44
  ARGV[2] = '--bold'
45
45
  check(t)
46
46
  end
47
47
 
48
48
  def test_italic(t)
49
49
  ARGV[0] = 'Hello'
50
- ARGV[1] = '--font=/Library/Fonts/Times New Roman.ttf'
50
+ ARGV[1] = '--font=data/sporq.ttf'
51
51
  ARGV[2] = '--italic'
52
52
  check(t)
53
53
  end
@@ -47,13 +47,14 @@ module Text2svg
47
47
  lines = []
48
48
  line = []
49
49
  lines << line
50
- first_hori_bearing_x = [0]
50
+ min_hori_bearing_x_by_line = [0]
51
51
 
52
52
  space_width = f.glyph(' '.freeze).char_width
53
53
  text.each_char.with_index do |char, index|
54
54
  if NEW_LINE.match char
55
+ min_hori_bearing_x_by_line[-1] = min_hori_bearing_x(line)
56
+ min_hori_bearing_x_by_line << 0
55
57
  line = []
56
- first_hori_bearing_x << 0
57
58
  lines << line
58
59
  next
59
60
  end
@@ -74,33 +75,42 @@ module Text2svg
74
75
  glyph.bold if option.bold
75
76
  glyph.italic if option.italic
76
77
 
77
- hori_advance, width, is_draw = if IDEOGRAPHIC_SPACE.match char
78
- [space_width * 2r, space_width * 2r, false]
78
+ metrics = FreeType::C::FT_Glyph_Metrics.new
79
+ is_draw = if IDEOGRAPHIC_SPACE.match char
80
+ FreeType::C::FT_Glyph_Metrics.members.each do |m|
81
+ metrics[m] = space_width * 2r
82
+ end
83
+ false
79
84
  elsif WHITESPACE.match char
80
- [space_width, space_width, false]
85
+ FreeType::C::FT_Glyph_Metrics.members.each do |m|
86
+ metrics[m] = space_width
87
+ end
88
+ false
81
89
  else
82
- if line.empty?
83
- first_hori_bearing_x[-1] = glyph.metrics[:horiBearingX]
90
+ FreeType::C::FT_Glyph_Metrics.members.each do |m|
91
+ metrics[m] = glyph.metrics[m]
84
92
  end
85
- [glyph.metrics[:horiAdvance], glyph.metrics[:width], true]
93
+ true
86
94
  end
87
- line << CharSet.new(char, hori_advance, width, is_draw, glyph.outline.svg_path_data)
95
+ line << CharSet.new(char, metrics, is_draw, glyph.outline.svg_path_data)
88
96
  end
89
97
 
98
+ min_hori_bearing_x_by_line[-1] = min_hori_bearing_x(line)
90
99
  inter_char_space = space_width / INTER_CHAR_SPACE_DIV
100
+ min_hori_bearing_x_all = min_hori_bearing_x_by_line.min
91
101
 
92
- width_by_line = lines.zip(first_hori_bearing_x).map do |(line, hori_bearing_x)|
102
+ width_by_line = lines.map do |line|
93
103
  before_char = nil
94
104
  if line.empty?.!
95
105
  line.map { |cs|
96
- cs.width = if cs.equal?(line.last)
97
- [cs.width, cs.hori_advance].max
106
+ width = if cs.equal?(line.last)
107
+ cs.metrics[:width] + cs.metrics[:horiBearingX]
98
108
  else
99
- cs.hori_advance
109
+ cs.metrics[:horiAdvance]
100
110
  end
101
- w = cs.width + f.kerning_unfitted(before_char, cs.char).x
111
+ w = width + f.kerning_unfitted(before_char, cs.char).x
102
112
  w.tap { before_char = cs.char }
103
- }.inject(:+) + (line.length - 1) * inter_char_space - [0, hori_bearing_x].min
113
+ }.inject(:+) + (line.length - 1) * inter_char_space - min_hori_bearing_x_all
104
114
  else
105
115
  0
106
116
  end
@@ -113,7 +123,7 @@ module Text2svg
113
123
 
114
124
  output << %(<g #{option.attribute}>\n) if option.attribute
115
125
 
116
- lines.zip(width_by_line, first_hori_bearing_x).each do |(line, line_width, hori_bearing_x)|
126
+ lines.zip(width_by_line).each do |(line, line_width)|
117
127
  x = 0r
118
128
  y += line_height
119
129
  before_char = nil
@@ -131,13 +141,13 @@ module Text2svg
131
141
 
132
142
  output << %!<g transform="matrix(1,0,0,1,0,#{y.to_i})">\n!
133
143
 
134
- x -= hori_bearing_x
144
+ x -= min_hori_bearing_x_all
135
145
  line.each do |cs|
136
146
  x += f.kerning_unfitted(before_char, cs.char).x.to_i
137
147
  if cs.draw?
138
148
  output << %! <path transform="matrix(1,0,0,1,#{x.to_i},0)" d="#{cs.outline2d.join(' '.freeze)}"/>\n!
139
149
  end
140
- x += cs.width
150
+ x += cs.metrics[:horiAdvance]
141
151
  x += inter_char_space if cs != line.last
142
152
  before_char = cs.char
143
153
  end
@@ -150,10 +160,23 @@ module Text2svg
150
160
  Content.new(output, (max_width + option_width).to_i, (y + line_height / 4).to_i, notdef_indexes)
151
161
  end
152
162
  end
163
+
164
+ private
165
+
166
+ def min_hori_bearing_x(line)
167
+ return 0 if line.empty?
168
+ point = 0
169
+ bearings = line.map do |cs|
170
+ (cs.metrics[:horiBearingX] + point).tap {
171
+ point += cs.metrics[:horiAdvance]
172
+ }
173
+ end
174
+ [bearings.min, 0].min
175
+ end
153
176
  end
154
177
  end
155
178
 
156
- CharSet = Struct.new(:char, :hori_advance, :width, :is_draw, :outline2d) do
179
+ CharSet = Struct.new(:char, :metrics, :is_draw, :outline2d) do
157
180
  def draw?
158
181
  is_draw
159
182
  end
@@ -14,34 +14,35 @@ module Text2svgTypographyTest
14
14
  t.error('error conditions was changed')
15
15
  end
16
16
 
17
- opt = Text2svg::Option.new(
18
- '/Library/Fonts/Times New Roman.ttf',
19
- nil,
20
- )
21
- [nil, :left, :right, :center].each do |text_align|
22
- opt.text_align = text_align
23
- [Encoding::UTF_8, Encoding::ASCII_8BIT].each do |encoding|
24
- opt.encoding = encoding
25
- [nil, 'fill="red"'].each do |attribute|
26
- opt.attribute = attribute
27
- [false, true].each do |bold|
28
- opt.bold = bold
29
- [false, true].each do |italic|
30
- opt.italic = italic
31
- ['ABC', "\n", "\n\nA", "", "A\nB\n\n", "A\n\n\nC", "<", ">", "&", "=", "@", "%", "#", "("].each do |text|
32
- begin
33
- c = Text2svg::Typography.build(text, opt)
34
- rescue => e
35
- t.log("raise error #{e.class}: #{e.message} with text=\"#{text}\",opt=#{opt}")
36
- raise
37
- end
17
+ Dir["data/*"].grep(/otf|ttf/).each do |font|
18
+ [nil, :left, :right, :center].each do |text_align|
19
+ [Encoding::UTF_8, Encoding::ASCII_8BIT].each do |encoding|
20
+ [nil, 'fill="red"'].each do |attribute|
21
+ [false, true].each do |bold|
22
+ [false, true].each do |italic|
23
+ opt = Text2svg::Option.new
24
+ opt.font = font
25
+ opt.text_align = text_align
26
+ opt.encoding = encoding
27
+ opt.attribute = attribute
28
+ opt.bold = bold
29
+ opt.italic = italic
38
30
 
39
- unless Text2svg::Content === c
40
- t.error('return value was break')
41
- end
31
+ ['ABC', "\n", "\n\nA", "", "A\nB\n\n", "A\n\n\nC", "<", ">", "&", "=", "@", "%", "#", "("].each do |text|
32
+ begin
33
+ c = Text2svg::Typography.build(text, opt)
34
+ rescue => e
35
+ t.log("raise error #{e.class}: #{e.message} with text=\"#{text}\",opt=#{opt}")
36
+ raise
37
+ end
38
+
39
+ unless Text2svg::Content === c
40
+ t.error('return value was break')
41
+ end
42
42
 
43
- unless c.data.encoding == Encoding::UTF_8
44
- t.error('encoding was changed')
43
+ unless c.data.encoding == Encoding::UTF_8
44
+ t.error('encoding was changed')
45
+ end
45
46
  end
46
47
  end
47
48
  end
@@ -60,7 +61,7 @@ module Text2svgTypographyTest
60
61
 
61
62
  def benchmark_build(b)
62
63
  str = [*'!'..'z'].join
63
- opt = Text2svg::Option.new('/Library/Fonts/Times New Roman.ttf')
64
+ opt = Text2svg::Option.new('data/sporq.ttf')
64
65
  b.reset_timer
65
66
  i = 0
66
67
  while i < b.n
@@ -1,3 +1,3 @@
1
1
  module Text2svg
2
- VERSION = '0.3.4'
2
+ VERSION = '0.3.5'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: text2svg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - ksss
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-03 00:00:00.000000000 Z
11
+ date: 2016-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: freetype
@@ -75,6 +75,7 @@ extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
77
  - ".gitignore"
78
+ - ".travis.yml"
78
79
  - CODE_OF_CONDUCT.md
79
80
  - Gemfile
80
81
  - LICENSE.txt
@@ -82,7 +83,9 @@ files:
82
83
  - Rakefile
83
84
  - bin/console
84
85
  - bin/setup
86
+ - data/Lobster.otf
85
87
  - data/sample.jpg
88
+ - data/sporq.ttf
86
89
  - exe/text2svg
87
90
  - lib/text2svg.rb
88
91
  - lib/text2svg/cli.rb