/usr/local/CPAN/PPresenter/PPresenter/Fontset.pm


# Copyright (C) 2000-2002, Free Software Foundation FSF.

package PPresenter::Fontset;

use strict;
use PPresenter::StyleElem;
use base 'PPresenter::StyleElem';

use constant ObjDefaults =>
{ type          => 'fontset'
, -fontLabels   => [ qw/pico  micro tiny small   normal
                      large big   huge massive giant/]

, -rawFontSizes => [ '1280x1024'
      , 10,  30,  40,  50,  60
      , 75, 100, 150, 200, 300 ]

, -fontSizes    => undef
, -fixedFont    => undef
, -proportionalFont => undef
};

sub InitObject()
{   my $fontset = shift;

    return $fontset
        unless defined $fontset->{-fontSizes};

    my $labels = @{$fontset->{-fontLabels}};
    die "A list of absolute fontsizes must be $labels long.\n"
        if $labels != @{$fontset->{-fontSizes}};

    $fontset;
}

sub fontSizes($$)
{   my ($fontset, $viewport) = @_;
    return $fontset->{-fontSizes} if defined $fontset->{-fontSizes};

    my ($width,$height) = $viewport->screenMessures;
    my $label    = "fontSizes_${width}x${height}";

    @{$fontset->{$label}}
        = $fontset->calcRealFontSizes($viewport, $fontset->{-rawFontSizes})
            unless defined $fontset->{$label};

    $fontset->{$label};
}

sub sizeToPixels($$)
{   my ($fontset, $viewport, $size) = @_;
    return $1 if $size =~ /^\s*(\d+)p$/;
    $fontset->fontSizes($viewport)->[$size];
}

# A fontset will overrule this when there are only specific values allowed.
sub calcRealFontSizes($$$)
{   my ($fontset, $viewport, $raw) = @_;
    @_ = @$raw;
    my $scaling = $viewport->geometryScaling(shift);
    map {int($_*$scaling)} @_;
}

sub findFontSize($$$)
{   my ($fontset, $viewport, $base, $size) = @_;

    return $size if $size =~ /^\s*\d+\s*$/;        # is a number
    return $size if $size =~ /\s*\d+p$/;           # size in pixels

    my $relative_size;
    if($size =~ /^\s*(\+|\-)\d+\s*$/ )
    {   # is a relative number
        $relative_size = $base + $size;
    }
    else
    {   # Is a fontsize-name
        foreach (@{$fontset->{-fontLabels}})
        {   last if $_ eq $size;
            $relative_size++;
        }
    }

    if($relative_size > @{$fontset->{-fontLabels}})
    {   warn "Cannot find font-size $size.  Back to normal.\n";
        $fontset->translateFontSize($viewport, undef, 'normal');
    }

    $relative_size  = $relative_size < 0 ? 0
            : $relative_size < @{$fontset->{-fontLabels}} ? $relative_size
            : $#{$fontset->{-fontLabels}};

    return $relative_size;
}

sub fontHeight($)
{   my ($fontset, $font) = @_;
    return $font->fontMetrics('-ascent')
           + $font->fontMetrics('-descent');
}

1;