pkg/generate_font_metadata.pl
changeset 970 272328fe1b4a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/generate_font_metadata.pl	Fri Jul 02 21:03:57 2010 -0700
@@ -0,0 +1,146 @@
+#! /usr/perl5/bin/perl -w
+
+#
+# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice (including the next
+# paragraph) shall be included in all copies or substantial portions of the
+# Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+#
+#
+
+require 5.005;				# minimal Perl version required
+use strict;				#
+use diagnostics;			#
+use integer;				#
+use File::Spec;				# pathname manipulation routines
+use English qw( -nomatchvars );
+use Getopt::Long;
+
+# Required arguments:
+# -p <proto_area>
+# -m <manifest>
+
+my $proto_dir;
+my $manifest;
+
+my $result = GetOptions('p|protodir=s' => \$proto_dir,
+                        'm|manifest=s' => \$manifest);
+
+if (!defined($proto_dir)) {
+  print STDERR "Missing required protodir argument\n";
+  exit(1);
+}
+
+if (!defined($manifest)) {
+  print STDERR "Missing required manifest argument\n";
+  exit(1);
+}
+
+# Directories containing font files
+my %fontdirs = ();
+
+open my $MANIFEST, '<', $manifest
+  or die "Cannot open manifest $manifest: $!\n";
+
+while (my $man = <$MANIFEST>) {
+  if ($man =~ m{path=(\S+)/fonts.dir}) {
+    $fontdirs{$1} = $1;
+  }
+}
+close $MANIFEST;
+
+foreach my $fd (keys %fontdirs) {
+  my $protofontpath = join('/', $proto_dir, $fd);
+  my $protometafile = join('/', $proto_dir, $fd, 'fonts.dir');
+  my %xlfds = ();
+
+  open my $XFILE, '<', $protometafile
+    or die "Cannot open $protometafile: $!\n";
+
+  while (my $x = <$XFILE>) {
+    chomp($x);
+    if ($x =~ m{\s+}) {
+      my ($fontfile, $fontxlfd) = split(/\s+/, $x, 2);
+      $xlfds{$fontxlfd} = $fontfile;
+      printf
+	qq(<transform file path="$fd/%s" -> add info.file.font.xlfd "%s">\n),
+	$fontfile, $fontxlfd;
+    }
+  }
+  close $XFILE;
+
+  $protometafile = join('/', $proto_dir, $fd, 'fonts.alias');
+
+  if (-f $protometafile) {
+
+    open my $XFILE, '<', $protometafile
+      or die "Cannot open $protometafile: $!\n";
+
+    while (my $x = <$XFILE>) {
+      chomp($x);
+      if ($x =~ m{\s+}) {
+	my ($fontalias, $fontxlfd) = split(/\s+/, $x, 2);
+	$fontxlfd =~ s{^"(.*)"$}{$1};
+	if (exists $xlfds{$fontxlfd}) {
+	  my $fontfile = $xlfds{$fontxlfd};
+	  printf
+	    qq(<transform file path="$fd/%s" -> add info.file.font.xlfd "%s">\n),
+	      $fontfile, $fontalias;
+	} else {
+#	  print STDERR qq(No match found for "$fontxlfd" in $protometafile\n);
+	}
+      }
+    }
+    close $XFILE;
+  }
+
+}
+
+# Run fc-scan from the proto area, since it wasn't delivered until build 141
+my $fc_scan = "$proto_dir/usr/bin/fc-scan";
+
+# See FcPatternFormat(3) for the full definition of the format syntax
+#  %{file} => print the named value for this font
+#  %{fullname|cescape} => print the named value with C-style string escapes
+#			  (adds \ in front of \ or " characters)
+#  %{?fullname{..A..}{..B..}} => if fullname is defined, then print A, else B
+#  []fullname,fullnamelang{..A..} => for each pair of fullname & fullnamelang,
+#					print A with those values substituted
+my $fc_scan_format = q(--format=%{?fullname{%{[]fullname,fullnamelang{<transform file path="%{file}" -> add info.file.font.name:%{fullnamelang} "%{fullname|cescape}">\n}}}{%{[]family,style{<transform file path="%{file}" -> add info.file.font.name "%{family|cescape} %{style|cescape} %{pixelsize}">\n}}}});
+
+
+chdir($proto_dir);
+system($fc_scan, $fc_scan_format, keys %fontdirs);
+if ($? == -1) {
+  print STDERR "failed to execute $fc_scan: $!\n";
+}
+elsif ($? & 127) {
+  printf STDERR "$fc_scan died with signal %d, %s coredump\n",
+    ($? & 127),  ($? & 128) ? 'with' : 'without';
+}
+elsif ($? != 0) {
+  my $exit_code = $? >> 8;
+  if ($exit_code != 1) {
+    printf STDERR "$fc_scan exited with value %d\n", $exit_code;
+    exit($exit_code);
+  }
+}
+
+exit(0);
+