Merge remote-tracking branch 'origin/master'
[chise/kage.git] / makettf / makettf.pl
1 #!/usr/bin/perl
2
3 $FONTFORGE = "export LANG=utf-8; /usr/bin/fontforge";
4 $MAKEGLYPH = "/usr/bin/js ./makeglyph.js";
5 $MV = "/bin/mv";
6 $HEADER_FILENAME = "head.txt";
7 $PARTS_FILENAME = "parts.txt";
8 $FOOTER_FILENAME = "foot.txt";
9 $TEMPNAME = "temp";
10
11 use utf8;
12 use CGI;
13 binmode STDOUT, ":utf8";
14
15 if(scalar(@ARGV) != 4){
16   print "Usage: makettf.pl WorkingDirectory WorkingName Shotai Weight\n";
17   print "Shotai: mincho or gothic\n";
18   print "Weight: 1 3 5 7\n";
19   exit;
20 }
21
22 $WORKDIR=$ARGV[0];
23 $WORKNAME=$ARGV[1];
24 $SHOTAI=$ARGV[2];
25 $WEIGHT=$ARGV[3];
26
27 unlink "$WORKDIR/$WORKNAME.log";
28 unlink "$WORKDIR/$WORKNAME.scr";
29 unlink "$WORKDIR/$WORKNAME.ttf";
30 mkdir "$WORKDIR/build";
31
32 open LOG, ">>:utf8", "$WORKDIR/$WORKNAME.log";
33 select((select(LOG), $| = 1)[0]);
34
35 # initialize
36 if(-e "$WORKDIR/$HEADER_FILENAME"){
37   open FH, "<:utf8", "$WORKDIR/$HEADER_FILENAME";
38   open FH2, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
39   while(!eof FH){
40     my $buffer = <FH>;
41     print FH2 $buffer;
42   }
43   close FH;
44   close FH2;
45   
46   print LOG "Prepare header file ... done.\n";
47 }
48 else{
49   print LOG "No header file.\n";
50   close LOG;
51   exit;
52 }
53
54 # parse buhin
55 %buhin = ();
56 if(-e "$WORKDIR/$PARTS_FILENAME"){
57   open FH, "<:utf8", "$WORKDIR/$PARTS_FILENAME";
58   my $buffer = "";
59   while(<FH>){
60     $buffer .= $_;
61   }
62   close FH;
63   $temp = $buffer;
64   
65   print LOG "Prepare parts file ... done.\n";
66 }
67 else{
68   print LOG "No parts file.\n";
69   close LOG;
70   exit;
71 }
72 @temp = split(/\r\n|\r|\n/, $temp);
73 foreach(@temp){
74   if($_ =~ m/:/){
75     @temp2 = split(/ +|\t/, $_);
76     $buhin{$temp2[0]} = $temp2[1];
77   }
78 }
79 print LOG "Prepare parts data ... done.\n";
80
81 # parse target code point
82 %target = ();
83 foreach(sort(keys %buhin)){
84   if($_ =~ m/^\[([^\]])\]$/){
85     $target = sprintf("%X", unpack('U', $1));
86   } elsif(length($_) == 1){
87     $target = sprintf("%X", unpack('U', $_));
88   } elsif($_ =~ m/^[Uu]{0,1}[\+\-]{0,1}([0-9A-Fa-f]{1,8})$/){
89     $target = $1;
90   } else {
91     next;
92   }
93   $target =~ s/^0+//g; # delete zero for the beginning
94   $name = $_;
95   $target{$target} = $name;
96 }
97 print LOG "Prepare target code point ... done.\n";
98
99 # make glyph for each target
100 print LOG "Prepare each glyph.\n";
101 foreach(sort(keys(%target))){
102   $code = $_;
103   print LOG "$code : ";
104   $target = $target{$code};
105   %subset = ();
106   &addsubset($target);
107   $partsdata = "";
108   foreach(keys(%subset)){
109     $partsdata .= $_." ".$subset{$_}."\n";
110   }
111   utf8::encode($target);
112   $target =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
113   $target =~ s/\s/+/g;
114   utf8::encode($partsdata);
115   $partsdata =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
116   $partsdata =~ s/\s/+/g;
117   $svg =  `$MAKEGLYPH $target $partsdata $SHOTAI $WEIGHT`;
118   print LOG "$MAKEGLYPH $target $partsdata $SHOTAI $WEIGHT\n";
119   open FH, ">$WORKDIR/build/$code.svg";
120   print FH $svg;
121   close FH;
122   &addglyph($code);
123 }
124 print LOG "Prepare each glyph ... done.\n";
125
126 # scripts footer
127 if(-e "$WORKDIR/$FOOTER_FILENAME"){
128   open FH, "<:utf8", "$WORKDIR/$FOOTER_FILENAME";
129   open FH2, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
130   while(!eof FH){
131     my $buffer = <FH>;
132     print FH2 $buffer;
133   }
134   close FH;
135   close FH2;
136   
137   print LOG "Prepare footer file ... done.\n";
138 }
139 else{
140   print LOG "No footer file.\n";
141   close LOG;
142   exit;
143 }
144
145 close LOG;
146 &makefont;
147
148 ##############################################################################
149
150 sub addglyph{
151   my $buffer =<<"EOT";
152 Print(0u$_[0])
153 Select(0u$_[0])
154 Clear()
155 Import("$WORKDIR/build/$_[0].svg")
156 Scale(500)
157 Move(400, -400)
158 RemoveOverlap()
159 Simplify()
160 SetWidth(1000)
161 Move(0, 50)
162 RoundToInt()
163 AutoHint()
164 EOT
165   open FH, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
166   print FH $buffer;
167   close FH;
168 }
169
170 ##############################################################################
171
172 sub makefont{
173   my $buffer = "Generate(\"$WORKDIR/$WORKNAME.ttf\", \"\", 0)\n";
174   $buffer .= "Quit()\n";
175   open FH, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
176   print FH $buffer;
177   close FH;
178   
179   $buffer = `export LANG=utf-8; $FONTFORGE -script $WORKDIR/$WORKNAME.scr >> $WORKDIR/$WORKNAME.log 2>&1`;
180 }
181
182 ##############################################################################
183
184 sub addsubset{
185   $subset{$_[0]} = $buhin{$_[0]};
186   my $buffer = '$'.$buhin{$_[0]}.'$';
187   while($buffer =~ m/\$99:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:([^\$]*)/gc){
188     if(!exists($subset{$1})){
189       &addsubset($1);
190     }
191   }
192 }
193
194 ##############################################################################