package PDF::Writer::pdflib;

use strict;
use warnings;

our $VERSION = '0.02';

use pdflib_pl;

=head1 NAME

PDF::Writer::pdflib - pdflib_pl backend

=head1 SYNOPSIS

(internal use only)

=head1 DESCRIPTION

No user-serviceable parts inside.

=cut

my %dispatch = (
    close           => 'close',
    info            => 'set_info',
    parameter       => 'set_parameter',
    font            => 'setfont',
    find_font       => 'findfont',
    begin_page      => 'begin_page',
    end_page        => 'end_page',
    save_state      => 'save',
    restore_state   => 'restore',
    linewidth       => 'setlinewidth',
    move            => 'moveto',
    line            => 'lineto',
    rect            => 'rect',
    fill            => 'fill',
    stroke          => 'stroke',
    fill_stroke     => 'fill_stroke',
    show_boxed      => 'show_boxed',
    show_xy         => 'show_xy',
    open_image      => 'open_image_file',
    close_image     => 'close_image',
    place_image     => 'place_image',
    circle          => 'circle',
    add_weblink     => 'add_weblink',
    add_bookmark    => 'add_bookmark',
);

sub new {
    my $class = shift;
    return bless({ pdf => pdflib_pl::PDF_new() }, $class);
}

sub open {
    my ($self, $f) = @_; my $p = $self->{pdf};
    $f = '' unless defined $f;
    return (pdflib_pl::PDF_open_file($p, $f) != -1);
}

sub stringify {
    my $self = shift; my $p = $self->{pdf};
    $self->close;
    return pdflib_pl::PDF_get_buffer($p);
}

sub save {
    goto &{$_[0]->can('close')};
}

sub color {
    my $self = shift; my $p = $self->{pdf};
    my ($mode, $palette, @colors) = @_;

    if (pdflib_pl->VERSION >= 4) {
        pdflib_pl::PDF_setcolor($p, $mode, $palette, @colors, 0);
    }
    elsif ($palette ne 'rgb') {
        die 'Palette other than "rgb" is not supported';
    }
    elsif ($mode eq 'fill') {
        pdflib_pl::PDF_setrgbcolor_fill($p, @colors);
    }
    elsif ($mode eq 'stroke') {
        pdflib_pl::PDF_setrgbcolor_stroke($p, @colors);
    }
    else { # both
        pdflib_pl::PDF_setrgbcolor($p, @colors);
    }
}

sub font_size {
    my $self = shift; my $p = $self->{pdf};
    return pdflib_pl::PDF_get_value($p, 'fontsize', 0);
}

sub image_width {
    my $self = shift; my $p = $self->{pdf};
    my ($image) = @_;
    return pdflib_pl::PDF_get_value($p, 'imagewidth', $image);
}

sub image_height {
    my $self = shift; my $p = $self->{pdf};
    my ($image) = @_;
    return pdflib_pl::PDF_get_value($p, 'imageheight', $image);
}

while (my ($k, $v) = each %dispatch) {
    no strict 'refs';
    my $method = "pdflib_pl::PDF_$v";
    *$k = sub {
        my $self = shift;
        my $rv = &$method($self->{pdf}, @_);

        if ($v ne 'show_boxed' && defined $rv) {
            $rv = '0 but true' if $rv eq '0';
            $rv = undef if $rv eq '-1';
        }

        return $rv;
    };
}

1;

=head1 AUTHORS

Autrijus Tang E<lt>autrijus@autrijus.orgE<gt>

=head1 COPYRIGHT

Copyright 2004, 2005 by Autrijus Tang E<lt>autrijus@autrijus.orgE<gt>.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

See L<http://www.perl.com/perl/misc/Artistic.html>

=cut