Initial revision
[chise/kage.git] / makettf / makettf.cgi
1 #!/usr/bin/perl
2 use utf8;
3 use CGI;
4
5 $FONTFORGE = "/usr/local/bin/fontforge";
6 $PERL = "/usr/bin/perl";
7 $ECHO = "/bin/echo";
8 $RM = "/bin/rm";
9 $TEMP = "/tmp/tempKAGE";
10 $KAGESCRIPT = "/home/kamichi/perl";
11 $FMT = "svg";
12 $LICENSE = 'Created by KAGE system. (http://fonts.jp/)';
13
14 $form = new CGI;
15
16 $fontname_en = $form->param('fontname-en');
17 $fontname_en =~ s/[\;\&\#\"\'\%\\\$\:\!\=\~\^\`]//g;
18 $fontname_ja = $form->param('fontname-ja');
19 $fontname_ja =~ s/[\;\&\#\"\'\%\\\$\:\!\=\~\^\`]//g;
20 utf8::decode($fontname_ja);
21 if($fontname_en eq ""){
22     $fontname_en = "Untitled";
23 }
24 if($fontname_ja eq ""){
25     $fontname_ja = $fontname_en;
26 }
27 $partsdata = $form->param('partsdata');
28 $partsdata =~ s/[\;\&\#\"\'\%\\]//g;
29 $mappingtable = $form->param('mappingtable');
30 $mappingtable =~ s/[\;\&\#\"\'\%\\\$\:]//g;
31 @unicoderange = ();
32 for(my $i = 0; $i < 16; $i++){
33     $unicoderange[$i] = $form->param("unicoderange$i");
34     $unicoderange[$i] =~ s/[^0-9a-fA-F\-]//g;
35     if($unicoderange[$i] eq ""){
36         $unicoderange[$i] = "--";
37     }
38 }
39 for(my $i = 0; $i < 4; $i++){
40     $codepagerange[$i] = $form->param("codepagerange$i");
41     $codepagerange[$i] =~ s/[^0-9a-fA-F]//g;
42     if($codepagerange[$i] eq ""){
43         $codepagerange[$i] = "00";
44     }
45 }
46
47 #open FH, "<", "parts.txt";
48 #$temp = "";
49 #%parts = ();
50 #foreach(<FH>){
51 #    $temp .= $_;
52 #    @temp = split(/ \t|\r\n|\r|\n/, $_);
53 #    $parts{$temp[0]} = $temp[1];
54 #}
55 #close FH;
56 @temp2 = split(/\r\n|\r|\n/, $partsdata);
57 $temp = "";
58 %parts = ();
59 foreach(@temp2){
60     $temp .= $_;
61     @temp = split(/ |\t|\r\n|\r|\n/, $_);
62     $parts{$temp[0]} = $temp[1];
63 }
64 open FH, ">", "$TEMP.parts.txt";
65 $temp =~ s/ /\t/g;
66 print FH $temp;
67 close FH;
68
69 #open FH, "<", "map.txt";
70 #%map = ();
71 #foreach(<FH>){
72 #    @temp = split(/\t|\r\n|\r|\n/, $_);
73 #    $map{$temp[0]} = $temp[1];
74 #}
75 #close FH;
76 @temp2 = split(/\r\n|\r|\n/, $mappingtable);
77 %map = ();
78 foreach(@temp2){
79     @temp = split(/ |\t|\r\n|\r|\n/, $_);
80     $map{$temp[0]} = $temp[1];
81 }
82
83 $script =<<"EOT";
84 New()
85 Reencode("UnicodeFull")
86 SetTTFName(0x409,0,"$LICENSE")
87 SetTTFName(0x409,1,"$fontname_en")
88 SetTTFName(0x409,4,"$fontname_en")
89 SetTTFName(0x411,1,"$fontname_ja")
90 SetTTFName(0x411,4,"$fontname_ja")
91 EOT
92
93 foreach(sort(keys %map)){
94     $temp = $parts{$map{$_}};
95     $dummy = `cd $KAGESCRIPT; $ECHO '$temp' | $PERL $KAGESCRIPT/kagepre.pl $TEMP.parts.txt | $PERL $KAGESCRIPT/kage$FMT.pl > $TEMP.$_.$FMT`;
96     &addglyph($_);
97 }
98 &makefont;
99
100 sub addglyph{
101     $script .=<<"EOT";
102 Select(0u$_[0])
103 Clear()
104 Import("$TEMP.$_[0].$FMT")
105 #Import("$TEMP.$_[0].$FMT",0,2)
106 RemoveOverlap()
107 Simplify()
108 SetWidth(1000)
109 SetVWidth(1000)
110 Move(0, 50)
111 RoundToInt()
112 AutoHint()
113 EOT
114 }
115
116 sub makefont{
117     $script .= "Generate(\"$TEMP.ttf\", \"\", 0)\n";
118     $script .= "Quit()\n";
119     open FH, ">:utf8", "$TEMP.scr";
120     print FH $script;
121     close FH;
122     
123     $dummy = `export LANG=utf-8; $FONTFORGE -script $TEMP.scr 2>/dev/null`;
124     
125     my $fdata = "";
126     my $fsize = 0;
127     my $i;
128     my @bdata;
129     open FH, "<$TEMP.ttf";
130     $fsize = -s FH;
131     read FH, $fdata, $fsize;
132     close FH;
133     @bdata = unpack("C*", $fdata);
134     for($i = 0; $i < $fsize - 23; $i++){
135         if($bdata[$i] == ord("P") && $bdata[$i+1] == ord("f") && $bdata[$i+2] == ord("E") && $bdata[$i+3] == ord("d")){
136             #$bdata[$i-5] = 0x10;
137             for($j = 0; $j < 16; $j++){
138                 if($unicoderange[$j] ne "--"){
139                     $bdata[$i-16+$j] = eval('0x'.$unicoderange[$j]);
140                 }
141             }
142             #$bdata[$i+20] = 0x80; # Symbol
143             #$bdata[$i+21] = 0x02; # JIS/Japan
144             #$bdata[$i+22] = 0x00;
145             #$bdata[$i+23] = 0x03; # Latin 1 & 2 
146             for($j = 0; $j < 4; $j++){
147               $bdata[$i+20+$j] = eval('0x'.$codepagerange[$j]);
148             }
149         }
150     }
151     $fdata = pack("C*", @bdata);
152     #open FH, ">./$fontname.ttf";
153     #print FH $fdata;
154     #close FH;
155     print <<"EOT";
156 Content-type: application/octet-stream
157 Content-Disposition: attachment; filename = $fontname_en.ttf
158
159 $fdata
160 EOT
161     
162     $dummy = `$RM $TEMP*`;
163 }
164