Hi,
The version which I currently use isn't too long. Effectively, it is a hack,
but it does what I need now. Here is a diff for TTFMetrics.pm.
I think a major rework were possible. It could work by so, that we read the the
whole ttf in a step. We build a hash for the glyphes, and another for the
character -> glyph conversion. It will use a little bit more memory, but can be
even 1000 times faster.
But this hack made the width generation 100 times faster.
In my current project, I create big tables, even with hundred of thousands of
strings. And it _does_ matter, that a table generation lasts 30 sec or needs 50
minutes.
Thanks,
Akos
--- /home/cardiff2/adhoak0/tool/lib/perl5/site_perl/5.14.2/Font/TTFMetrics.pm
2003-06-12 17:44:29.000000000 +0200
+++ TTFMetrics.pm 2012-04-11 14:32:23.975126000 +0200
@@ -122,6 +122,8 @@
use Carp;
use strict;
+#use Devel::NYTProf;
+
my @glyph_name_index = ();
my @post_glyph_name = ();
my @mac_glyph_name = ();
@@ -168,7 +170,7 @@
$self->{encoding} = 1;
$self->{subfamily} = undef;
$self->{glyph_index} = [];
- $self->{advance_width} = [];
+ $self->{advance_width} = ();
$self->{lsb} = [];
# $self->{number_of_glyphs} = undef;
@@ -266,7 +268,9 @@
my $fh = $self->get_file_handle();
my $buf = "";
- eval { read( $fh, $buf, 12 ) };
+ #eval { read( $fh, $buf, 12 ) };
+ read( $fh, $buf, 12 ) == 12 or die "can't read in font path";
+
if ($@) {
croak "Read error in Pastel::Font::TTF::make_directory_entry\n";
}
@@ -322,7 +326,6 @@
}
my $index = $self->get_glyph_index($ord);
return $self->get_advance_width($index);
-
}
=head2 string_width()
@@ -802,6 +805,11 @@
sub get_advance_width {
my $self = shift;
my $index = shift; # glyph index
+
+ if (exists $self->{advance_width}{$index}) {
+ return $self->{advance_width}{$index};
+ }
+
my $fh = $self->get_file_handle();
my $buf;
@@ -830,10 +838,13 @@
#if ( $index > @lsb ) { $index = @lsb; }
my $a =
- $advanced_width[$index] - ( $advanced_width[$index] > 32768 ? 65536 : 0
);
- #my $l = $lsb[$index] - ( $lsb[$index] > 32768 ? 65536 : 0 );
+ $advanced_width[$index] - ( $advanced_width[$index] >= 32768 ? 65536 : 0
);
+ #my $l = $lsb[$index] - ( $lsb[$index] >= 32768 ? 65536 : 0 );
#return $a, $l;
+ if ($a) {
+ $self->{advance_width}{$index} = $a;
+ }
return $a ? $a : undef;
}
-----Ursprüngliche Nachricht-----
Von: Malay Basu [mailto:[email protected]]
Gesendet: Mittwoch, 11. April 2012 19:02
An: Horvath, Akos
Cc: Matt S Trout; [email protected]; [email protected]
Betreff: Re: warning: false alarm, possible bug in Font::TTFMetrics
Akos,
Send me the code (email is the best). I'll check that it does not
break anything. As you can understand, It's a very complex module.
I'll update the module to the next version with proper credit.
Thanks for being so vigilant.
-Malay
On Wed, Apr 11, 2012 at 12:57 PM, Horvath, Akos
<[email protected]> wrote:
> 1. adding some comments :-)
>
> 2. this library is for calculating the lengths of ttf strings. It works okay,
> but is slow, because it reads and reads parts of the ttf file in every call.
> This needs optimiziation (effectively, a cache in a bottleneck), which I
> already did, only want to upload.
>
> Thanks,
>
> Akos
>
> -----Ursprüngliche Nachricht-----
> Von: Matt S Trout [mailto:[email protected]]
> Gesendet: Mittwoch, 11. April 2012 18:48
> An: Malay Basu
> Cc: Horvath, Akos; [email protected]; [email protected]
> Betreff: Re: warning: false alarm, possible bug in Font::TTFMetrics
>
> On Wed, Apr 11, 2012 at 12:43:20PM -0400, Malay Basu wrote:
>> Thanks Matt,
>>
>> I don't know what Akos is talking about. There is no unchecked eval in
>> the code. The only eval is to check that the input file is readable.
>> If the read call fails then the modules exits gracefully. There is
>> *no* problem with this eval.
>
> Oh. I see Akos forgot to show us the next line where it actually checks
> the exception. Ooops :)
>
> Even so, he clearly does care. Perhaps you should get Akos to add comments
> to make the code more clear so nobody gets confused like this again?
>
> Akos, would that be something you might enjoy doing?
>
> --
> Matt S Trout - Shadowcat Systems - Perl consulting with a commit bit and a
> clue
>
> http://shadowcat.co.uk/blog/matt-s-trout/ http://twitter.com/shadowcat_mst/
>
> Email me now on mst (at) shadowcat.co.uk and let's chat about how our Catalyst
> commercial support, training and consultancy packages could help your team.