home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Acorn User 10
/
AU_CD10.iso
/
Updates
/
Perl
/
Non-RPC
/
!Perl
/
riscos
/
RISCOS
/
DrawFile
/
FontTable.pm
< prev
next >
Wrap
Text File
|
1999-01-20
|
4KB
|
153 lines
package RISCOS::DrawFile::FontTable;
use Carp;
use strict;
use vars qw ($VERSION @ISA);
require RISCOS::DrawFile::Object;
@ISA = 'RISCOS::DrawFile::Object';
$VERSION = 0.02;
# 0.02 adds Translate
### use SelfLoader;
sub RISCOS::DrawFile::FontTable::new ($$);
sub RISCOS::DrawFile::FontTable::BBox ;
sub RISCOS::DrawFile::FontTable::Translate ;
sub RISCOS::DrawFile::FontTable::Pack ;
sub RISCOS::DrawFile::FontTable::Size ;
sub RISCOS::DrawFile::FontTable::Write ;
sub RISCOS::DrawFile::FontTable::Type ;
sub RISCOS::DrawFile::FontTable::FontByNumber ;
sub RISCOS::DrawFile::FontTable::NameToNumber ;
1;
### __DATA__
sub new ($$) {
my $proto = shift;
my $class = ref($proto) || $proto;
my ($self, $type) = $class->SUPER::new;
return $self if ref ($self) eq 'ARRAY';
carp "Cannot make a Font Table of type $type" if defined $type and $type;
my $old = {};
my $new = {};
# my $table = [];
if (ref ($_[0]) eq 'ARRAY') {
my $index = @{$_[0]};
while ($index--) {
$old->{$index} = ${$_[0]}->[$index] if defined ${$_[0]}->[$index];
}
} elsif (ref ($_[0]) eq 'HASH') {
$new->{''} = 0; # System font is stored as '' and font number 0
delete $_[0]->{''};
my $index = 0;
foreach (keys %{$_[0]}) {
# If more than zero are using it, assign it a table entry
$new->{$_} = ++$index if $_[0]->{$_};
# $table[$index] = $_;
}
carp "Aaaargh - can't make a fonttable with $index entries (design limit of DrawFiles is 255)" if $index > 255;
} else {
$_ = substr $_[0], 8;
while (s/^(.)([^\0]+)\0//s)
{
$old->{ord $1} = $2;
}
carp "Spurious text '$_' at end of Font Table" unless /^\0{0,4}$/;
}
$self->{'__OLD'} = $old;
$self->{'__NEW'} = $new;
# $self->{'__TABLE'} = $table;
wantarray ? ([], 0, $self) : $self; # We are a FontTable!
}
sub BBox {
undef;
}
\&BBox_Calc = \&BBox;
sub Translate {
}
sub Pack {
carp 'um';
my $self = shift;
# my $zeroth = shift @$self;
# my $result = $self->PackType() . $self->Size() . join ("\0", @$self, '');
# unshift @$self, $zeroth;
# $result . "\0" x ((length $result + 3) & ~3);
}
sub Size {
my $self = shift;
my $new = $self->{'__NEW'};
my $size = 8;
foreach (keys %$new) {
next unless $_;
$size += 2 + length $_;
}
($size + 3) & ~3;
}
sub Write {
my $self = shift;
my $new = $self->{'__NEW'};
my $size = $self->Size;
return unless $size > 8; # Don't do a blank fonttable
print {$_[0]} pack 'I2', 0, $size;
$size -= 8;
foreach (keys %$new) {
next unless $_;
print {$_[0]} pack 'Ca*x', $new->{$_}, $_;
$size -= 2 + length $_;
}
print {$_[0]} "\0" x $size;
}
sub Type {
0;
}
sub FontByNumber {
my $self = shift;
my $old = $self->{'__OLD'};
return $old->{$_[0]} unless wantarray;
map { $old->{$_} } @_;
}
sub NameToNumber {
my $self = shift;
my $what = $self->{'__NEW'}->{$_[0]};
carp "Font name lookup failed for '$_[0]'" unless $what;
# use Data::Dumper;
# print STDERR Dumper \$self unless $what;
$what;
}
1;
__END__
=head1 NAME
RISCOS::DrawFile::FontTable
=head1 SYNOPSIS
Class to handle font tables in DrawFiles
=head1 DESCRIPTION
C<RISCOS::DrawFile::FontTable> packs and unpacks fonttables for
C<RISCOS::DrawFile>. As C<RISCOS::DrawFile::Text> objects hold their font
information internally you should never need to know about Font tables.
=head1 BUGS
Not tested enough.
=head1 AUTHOR
Nicholas Clark <F<nick@unfortu.net>>