---
name: "Graphics::Primitive"
section: "3pm"
platform: "linux"
package: "libgraphics-primitive-perl"
version: "0.67-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Graphics::Primitive"
---

# Graphics::Primitive(3pm)

Device and library agnostic graphic primitives

## NAME

Graphics::Primitive - Device and library agnostic graphic primitives

## SYNOPSIS

Graphics::Primitive is a device and library agnostic system for creating and manipulating various graphical elements such as Borders, Fonts, Paths and the like.

```
    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($filename)
```

## DESCRIPTION

Graphics::Primitive is library agnostic system for drawing things.

The idea is to allow you to create and manipulate graphical components and then pass them off to a Driver for actual drawing.

## CONCEPTS

The root object for Graphics::Primitive is the Component.  Components contain all the common elements that you'd expect: margins, padding, background color etc.

The next most important is the Container. Containers are Components that can hold other Components.  Containers have all the attributes and methods of a Component with the addition of the *layout\_manager* attribute for us with Layout::Manager.

Another important Component is the Canvas. The Canvas differs from other components by being a container for various Geometry::Primitive objects.  This allows drawing of arbitrary shapes that do not fit existing components.

## DRAWING LIFECYCLE

After creating all your components, there is a lifecycle that allows them to do their internal housekeeping to prepare for eventual drawing.  The lifecycle is: **prepare**, **layout** and **pack**.  Detailed explanation of these methods can be found in Component.

## PREPARATION

Graphics::Primitive::Component has a `"prepared"` flag.  This flag is set as part of the `"prepare"` method (shocking, I know).  If this flag is set, then subsequent calls to `"prepare"` are ignored.  Containers also have a prepare flag, but this flag is **not** set when calling `"prepare"`.  A Container's flag should be set by the layout manager.  More information may be found with Layout::Manager.

## INSPIRATION

Most of the concepts that you'll find in Graphics::Primitive are inspired by Cairo \<http://cairographics.org\>'s API and CSS \<http://www.w3.org/Style/CSS/\>'s box model.

## AUTHOR

Cory Watson, `"<gphat@cpan.org>"`

## CONTRIBUTORS

Florian Ragwitz

## ACKNOWLEDGEMENTS

Many of the ideas here come from my experience using the Cairo library.

## COPYRIGHT & LICENSE

Copyright 2008-2010 by Cory G Watson.

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