#!/usr/bin/perl use utf8; use CGI; $FONTFORGE = "/usr/local/bin/fontforge"; $PERL = "/usr/bin/perl"; $ECHO = "/bin/echo"; $RM = "/bin/rm"; $TEMP = "/tmp/tempKAGE"; $KAGESCRIPT = "/home/kamichi/perl"; $FMT = "svg"; $LICENSE = 'Created by KAGE system. (http://fonts.jp/)'; $form = new CGI; $fontname_en = $form->param('fontname-en'); $fontname_en =~ s/[\;\&\#\"\'\%\\\$\:\!\=\~\^\`]//g; $fontname_ja = $form->param('fontname-ja'); $fontname_ja =~ s/[\;\&\#\"\'\%\\\$\:\!\=\~\^\`]//g; utf8::decode($fontname_ja); if($fontname_en eq ""){ $fontname_en = "Untitled"; } if($fontname_ja eq ""){ $fontname_ja = $fontname_en; } $partsdata = $form->param('partsdata'); $partsdata =~ s/[\;\&\#\"\'\%\\]//g; $mappingtable = $form->param('mappingtable'); $mappingtable =~ s/[\;\&\#\"\'\%\\\$\:]//g; @unicoderange = (); for(my $i = 0; $i < 16; $i++){ $unicoderange[$i] = $form->param("unicoderange$i"); $unicoderange[$i] =~ s/[^0-9a-fA-F\-]//g; if($unicoderange[$i] eq ""){ $unicoderange[$i] = "--"; } } for(my $i = 0; $i < 4; $i++){ $codepagerange[$i] = $form->param("codepagerange$i"); $codepagerange[$i] =~ s/[^0-9a-fA-F]//g; if($codepagerange[$i] eq ""){ $codepagerange[$i] = "00"; } } #open FH, "<", "parts.txt"; #$temp = ""; #%parts = (); #foreach(){ # $temp .= $_; # @temp = split(/ \t|\r\n|\r|\n/, $_); # $parts{$temp[0]} = $temp[1]; #} #close FH; @temp2 = split(/\r\n|\r|\n/, $partsdata); $temp = ""; %parts = (); foreach(@temp2){ $temp .= $_; @temp = split(/ |\t|\r\n|\r|\n/, $_); $parts{$temp[0]} = $temp[1]; } open FH, ">", "$TEMP.parts.txt"; $temp =~ s/ /\t/g; print FH $temp; close FH; #open FH, "<", "map.txt"; #%map = (); #foreach(){ # @temp = split(/\t|\r\n|\r|\n/, $_); # $map{$temp[0]} = $temp[1]; #} #close FH; @temp2 = split(/\r\n|\r|\n/, $mappingtable); %map = (); foreach(@temp2){ @temp = split(/ |\t|\r\n|\r|\n/, $_); $map{$temp[0]} = $temp[1]; } $script =<<"EOT"; New() Reencode("UnicodeFull") SetTTFName(0x409,0,"$LICENSE") SetTTFName(0x409,1,"$fontname_en") SetTTFName(0x409,4,"$fontname_en") SetTTFName(0x411,1,"$fontname_ja") SetTTFName(0x411,4,"$fontname_ja") EOT foreach(sort(keys %map)){ $temp = $parts{$map{$_}}; $dummy = `cd $KAGESCRIPT; $ECHO '$temp' | $PERL $KAGESCRIPT/kagepre.pl $TEMP.parts.txt | $PERL $KAGESCRIPT/kage$FMT.pl > $TEMP.$_.$FMT`; &addglyph($_); } &makefont; sub addglyph{ $script .=<<"EOT"; Select(0u$_[0]) Clear() Import("$TEMP.$_[0].$FMT") #Import("$TEMP.$_[0].$FMT",0,2) RemoveOverlap() Simplify() SetWidth(1000) SetVWidth(1000) Move(0, 50) RoundToInt() AutoHint() EOT } sub makefont{ $script .= "Generate(\"$TEMP.ttf\", \"\", 0)\n"; $script .= "Quit()\n"; open FH, ">:utf8", "$TEMP.scr"; print FH $script; close FH; $dummy = `export LANG=utf-8; $FONTFORGE -script $TEMP.scr 2>/dev/null`; my $fdata = ""; my $fsize = 0; my $i; my @bdata; open FH, "<$TEMP.ttf"; $fsize = -s FH; read FH, $fdata, $fsize; close FH; @bdata = unpack("C*", $fdata); for($i = 0; $i < $fsize - 23; $i++){ if($bdata[$i] == ord("P") && $bdata[$i+1] == ord("f") && $bdata[$i+2] == ord("E") && $bdata[$i+3] == ord("d")){ #$bdata[$i-5] = 0x10; for($j = 0; $j < 16; $j++){ if($unicoderange[$j] ne "--"){ $bdata[$i-16+$j] = eval('0x'.$unicoderange[$j]); } } #$bdata[$i+20] = 0x80; # Symbol #$bdata[$i+21] = 0x02; # JIS/Japan #$bdata[$i+22] = 0x00; #$bdata[$i+23] = 0x03; # Latin 1 & 2 for($j = 0; $j < 4; $j++){ $bdata[$i+20+$j] = eval('0x'.$codepagerange[$j]); } } } $fdata = pack("C*", @bdata); #open FH, ">./$fontname.ttf"; #print FH $fdata; #close FH; print <<"EOT"; Content-type: application/octet-stream Content-Disposition: attachment; filename = $fontname_en.ttf $fdata EOT $dummy = `$RM $TEMP*`; }