7 # usage: ./merge.pl sfd_from sfd_to sfd_out
8 # will merge sfd_to with sfd_from into the sfd_out (if there are some merges)
9 # will print merged glyph codes on stdout
11 # SFD = ( 'header' => @header_lines, 'footer' => @footer_lines, 'glyphs' => ( glyphenc => @glyph_lines ) )
17 open (SFD
, $sfdfile) || die "Unable to open $sfdfile : $!\n";
18 # -1 = header, 0 = glyphs, 1 = footer
25 } elsif (/^Encoding:\s*(\d+)/) {
29 push (@
{$sfd{'header'}}, $_);
30 } elsif ($section == 1) {
31 push (@
{$sfd{'footer'}}, $_);
37 @
{$sfd{'glyphs'}{$enc}} = @cur;
47 my ($sfdfile, $sfd_ref) = @_;
49 open (SFD
, '>'.$sfdfile) || die "Unable to open $sfdfile : $!\n";
50 print SFD @
{$$sfd_ref{'header'}};
51 foreach $enc (sort { $a <=> $b } keys %{$$sfd_ref{'glyphs'}}) {
52 print SFD @
{$$sfd_ref{'glyphs'}{$enc}};
54 print SFD @
{$$sfd_ref{'footer'}};
58 sub is_dummy_glyph
(\@
) {
61 foreach $l (@
$glyph_ref) {
62 if ($l =~ /^Colour:/) {
63 # XXX this is quick'n'dirty hack to detect dummy glyphs
71 sub merge_glyphs
(\
%\
%) {
72 my ($sfd_from, $sfd_to) = @_;
75 foreach $enc (sort { $a <=> $b } keys %{$$sfd_from{'glyphs'}}) {
76 if (!exists ($$sfd_to{'glyphs'}{$enc}) ||
77 (!is_dummy_glyph
(@
{$$sfd_from{'glyphs'}{$enc}}) && is_dummy_glyph
(@
{$$sfd_to{'glyphs'}{$enc}}))) {
78 $$sfd_to{'glyphs'}{$enc} = $$sfd_from{'glyphs'}{$enc};
88 print STDERR
"usage: $0 sfd_from sfd_to sfd_out\n";
92 ($sfdfile_from, $sfdfile_to, $sfdfile_out) = @ARGV;
94 %sfd_from = load_sfd
($sfdfile_from);
95 %sfd_to = load_sfd
($sfdfile_to);
96 if (merge_glyphs
(%sfd_from, %sfd_to) > -1) {
97 save_sfd
($sfdfile_out, %sfd_to);