Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid

Simple Graphics::Primitive example?

by djzort (Sexton)
on Feb 25, 2014 at 05:04 UTC ( #1076086=perlquestion: print w/replies, xml ) Need Help??

djzort has asked for the wisdom of the Perl Monks concerning the following question:

Hi there

I have been trying (and failing) to use Graphics::Primitive to create a png file for me.

Specifically i have been attempting to get Graphics::Primitive::TextBox to simply create a png with some text in it.

Alas, there are no examples in the Graphics::Primitive tar ball. Following the pod doesnt give me a working example.

Would someone be kind enough to show me how its done?

Replies are listed 'Best First'.
Re: Simple Graphics::Primitive example?
by stefbv (Curate) on Feb 25, 2014 at 07:46 UTC
Re: Simple Graphics::Primitive example?
by hdb (Monsignor) on Feb 25, 2014 at 07:40 UTC

    Based on the example in Graphics::Primitive, I came up with this:

    use strict; use warnings; use Graphics::Primitive; use Graphics::Color::RGB; use Graphics::Primitive::Border; use Graphics::Primitive::Component; use Graphics::Primitive::Driver::Cairo; my $c = Graphics::Primitive::Component->new( background_color => Graphics::Color::RGB->new( red => 1, green => 0, blue => 0 ), width => 500, height => 350, border => new Graphics::Primitive::Border->new( width => 5 ) ); my $driver = Graphics::Primitive::Driver::Cairo->new(format => 'SVG'); $driver->prepare($c); $driver->finalize($c); $driver->draw($c); $driver->write('test.png');

    and then went on to install the missing modules using cpan, specifically Graphics::Primitive and Graphics::Primitive::Driver::Cairo.

    As a prerequisite, one has to install the cairo graphics library which I cannot do on my machine. Have you gone through this process?

      I realise the "Graphics::Primitive::Component->new(...)" code you posted is a verbatim copy from the Graphics::Primitive POD; however,

      border => new Graphics::Primitive::Border->new( width => 5 )

      looks like one "new" too many. From the Graphics::Primitive::Border documentation, that should probably be:

      border => Graphics::Primitive::Border->new( width => 5 )

      -- Ken

        Thanks for pointing this out. As I got stuck on installing the prerequisites I never quite got to that point.

      I am just using the debian provided version of driver::cairo (0.46)

      here is the code i am using

      #!/usr/bin/perl use strict;use warnings; use Graphics::Primitive::Container; use Graphics::Color::RGB; use Graphics::Primitive::Font; use Graphics::Primitive::TextBox; use Graphics::Primitive::Driver::Cairo; use Layout::Manager::Compass; my $black = Graphics::Color::RGB->new(red => 0, green => 0, blue => 0) +; my $container = Graphics::Primitive::Container->new( width => 100, hei +ght => 100); $container->border->width(1); $container->border->color($black); $container->padding( Graphics::Primitive::Insets->new(top => 5, bottom => 5, left => 5, + right => 5) ); my $comp = Graphics::Primitive::Component->new; $comp->background_color($black); $container->add_component($comp, 'c'); my $lm = Layout::Manager::Compass->new; $lm->do_layout($container); my $driver = Graphics::Primitive::Driver::Cairo->new; $driver->draw($container); $driver->write('/tmp/foo.png'); __END__

      for which i always see this error

      dean@laserbeak:/tmp$ perl Use of uninitialized value in subroutine entry at /usr/share/perl5/Gra +phics/Primitive/Driver/ line 85. Use of uninitialized value in subroutine entry at /usr/share/perl5/Gra +phics/Primitive/Driver/ line 85.

      Chart::Clicker works fine, so i know that its possible for Graphics::Primitive::Driver::Cairo to output something

        Looking at the source of the driver module:
        81 my $width = $self->width; 82 my $height = $self->height; 83 84 if(uc($self->format) eq 'PNG') { 85 $surface = Cairo::ImageSurface->create( 86 'argb32', $width, $height 87 );
        So it seems that both $width and $height are not defined. I note that the example on the Graphics::Primitive page has:
        my $c = Graphics::Primitive::Component->new( width => 500, height => 350, );
        Whereas the example on the Graphics::Primitive::Driver::Cairo page has:
        my $c = Graphics::Primitive::Container->new( width => 500, height => 350, );
        I suggest you try adding the width and height parameters when creating the new Component object (or try just using Component instead of Container) and see if that makes a difference.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1076086]
Approved by davido
Front-paged by toolic
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (4)
As of 2021-12-06 21:00 GMT
Find Nodes?
    Voting Booth?
    R or B?

    Results (33 votes). Check out past polls.