The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package CAM::PDF::Renderer::TextFB;

use 5.006;
use warnings;
use strict;
use CAM::PDF;

our $VERSION = '1.52';

=for stopwords framebuffer

=head1 NAME

CAM::PDF::Renderer::TextFB - Framebuffer for CAM::PDF::Renderer::Text

=head1 LICENSE

See CAM::PDF.

=head1 SYNOPSIS

See CAM::PDF::Renderer::Text.

=head1 DESCRIPTION

This class is used solely to assist CAM::PDF::Renderer::Text.

=head1 FUNCTIONS

=over

=item $pkg->new(width, height)

Creates a new framebuffer.

=cut

sub new
{
   my $pkg = shift;
   my $w = shift;
   my $h = shift;

   my $self = bless {
      w => $w,
      h => $h,
      fb =>[],
   }, $pkg;
   for my $r (0 .. $h-1)
   {
      $self->{fb}->[$r] = [(q{})x$w];
   }
   return $self;
}

=item $self->add_string($x, $y, $string)

Renders a string on the framebuffer.

=cut

sub add_string
{
   my $self = shift;
   my $x = shift;
   my $y = shift;
   my $string = shift;
   
   CAM::PDF->asciify(\$string);

   my $fb = $self->{fb};
   if (defined $fb->[$y])
   {
      if (defined $fb->[$y]->[$x])
      {
         $fb->[$y]->[$x] .= $string;
      }
      else
      {
         #print "bad 1\n";
         $fb->[$y]->[$x] = $string;
      }
   }
   else
   {
      #print "bad 2\n";
      $fb->[$y] = [];
      $fb->[$y]->[$x] = $string;
   }
   return;
}

=item $self->toString()

Serializes the framebuffer into a single string that can be easily printed.

=cut

sub toString
{
   my $self = shift;

   my @str;
   my $fb = $self->{fb};
   for my $r (reverse 0 .. $#{$fb})   # PDF is bottom to top, we want top to bottom
   {
      my $row = $fb->[$r];
      if ($row)
      {
         #print "r $r c ".@$row."\n";
         #print '>';
         for my $c (0 .. $#{$row})
         {
            my $str = $row->[$c];
            if (!defined $str || $str eq q{})
            {
               $str = q{ };
            }
            push @str, $str;
         }
      }
      else
      {
         #print "r $r c 0\n";
         #print '>';
      }
      push @str, "\n";
   }
   return join q{}, @str;
}

1;
__END__

=back

=head1 AUTHOR

See L<CAM::PDF>

=cut