2 # KageFont library by eto 2003-0311
3 # $Id: kage.rb,v 1.2 2003-11-10 08:38:12 eto Exp $
4 # Copyright (C) 2002-2003 Kouichirou Eto, All rights reserved.
5 # This is free software with ABSOLUTELY NO WARRANTY.
6 # You can redistribute it and/or modify it under the terms of the GNU GPL2.
10 $LOAD_PATH << '../../lib' if $0 == __FILE__
11 require 'chise/kageserver'
14 #<?xml version="1.0"?>
15 #<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
16 #<svg viewBox="0 0 1000 1000">
17 #<path d="M 50,540 950,255 " style="fill: none; stroke: black; stroke-width: 10; stroke-linecap: round;"/>
18 #<path d="M 330,50 330,900 M 330,900 Q 330,950 380,950 M 380,950 840,950 M 840,950 Q 890,950 915,850 " style="fill: none; stroke: black; stroke-width: 10; stroke-linecap: round;"/>
22 class QuadraticPath #======================================================================動的な分割に対応できるようにする
24 def initialize(p1, p2, p3)
25 @p1, @p2, @p3 = p1, p2, p3
28 def divide_adaptic #適応的分割数をする。
33 def divide_num(num) #分割数を指定できる
38 #2次のbezier曲線の計算式、 P(t) = (1-t)^2*P1 + 2*t*(1-t)*P2 + t^2*P3
40 (num+1).times {|i| #ここで最後の点を含めないのがポイント。これによって次の曲線との重複が無いようにしている。
42 x = (1-t)*(1-t)*x1 + 2*t*(1-t)*x2 + t*t*x3
43 y = (1-t)*(1-t)*y1 + 2*t*(1-t)*y2 + t*t*y3
51 class PathResolver #======================================================================
53 #M 330,50 330,900 M 330,900 Q 330,950 380,950 M 380,950 840,950 M 840,950 Q 890,950 915,850
65 if par.length == 1 #コマンドである
66 exec_cmd(cmd) if 0 < cmd.length #前のコマンドが残っていたら実行
68 elsif par =~ /[,0-9]+/ #座標値である
69 sx, sy = par.split(/,/)
70 x, y = sx.to_i, sy.to_i
71 cmd << [x, y] #cmdへのargを追加
74 exec_cmd(cmd) if 0 < cmd.length #前のコマンドが残っていたら実行
81 cmd.each {|x, y| moveto(x, y) }
83 quadratic([@px, @py], cmd.shift, cmd.shift)
87 @lines << [@px, @py, x, y] if @px != -1
90 def quadratic(p1, p2, p3)
91 #p ['quadratic', p1, p2, p3]
92 qp = QuadraticPath.new(p1, p2, p3)
100 class KageParser #======================================================================
102 @strokes = Strokes.new
103 pr = PathResolver.new
104 lines = svg.split(/\n/)
106 next unless line =~ /^<path/
107 if line =~ /d=\"([a-zA-Z0-9, ]+)\"/
108 #lines = KageParser.parse_path($1)
110 lines.each {|px, py, x, y|
111 @strokes.add_line(px, 1000-py, x, 1000-y)
119 class KageGlyph #====================================================================== てなかんじ
120 def initialize(code, svg)
128 @strokes = KageParser.parse(@svg)
131 parse if @strokes.nil?
135 class KageFont #======================================================================
137 @server = KageServer.instance
139 @cache_list = @server.list_cache
141 @rend = StrokesRenderer.new
142 # @rend.hsv = [13, 100, 100]
143 # @rend.hsv = [0, 0, 0]
144 # @rend.hsv = [13, 100, 100] #黄色
145 @rend.hsv = [6, 100, 100] #オレンジ
147 attr_reader :cache_list, :server
149 return @glyphs[code] if @glyphs[code]
150 svg = @server.get(code)
151 return nil if svg.nil?
152 @glyphs[code] = KageGlyph.new(code, svg)
159 @rend.set_strokes(glyph.strokes)
167 char = Character.new(@code)
168 printf("[%s][%04x]\n", char.nil? ? "nil" : char.map_sjis, code)
174 #----------------------------------------------------------------------end.