---
name: "Graphics::Primitive::Driver"
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::Driver"
---

# Graphics::Primitive::Driver(3pm)

Role for driver implementations

## NAME

Graphics::Primitive::Driver - Role for driver implementations

## DESCRIPTION

What good is a library agnostic intermediary representation of graphical components if you can't feed them to a library specific implementation that turns them into drawings? Psht, none!

To write a driver for Graphics::Primitive implement this role.

## SYNOPSIS

```
  my $c = Graphics::Primitive::Component->new({
    origin => Geometry::Primitive::Point->new({
        x => $x, y => $y
    }),
    width => 500, height => 350
  });
```

## CANVASES

When a path is added to the internal list via *do*, it is stored in the *paths* attribute as a hashref.  The hashref has two keys: **path** and **op**. The path is, well, the path.  The op is the operation provided to *do*.  As canvases are just lists of paths you should consult the next section as well.

## PATHS AND HINTING

Paths are lists of primitives.  Primitives are all descendants of Geometry::Shape and therefore have *point\_start* and *point\_end*.  These two attributes allow the chaining of primitives.  To draw a path you should iterate over the primitives, drawing each.

When you pull each path from the arrayref you should pull it's accompanying hints via *get\_hint* (the indexes match).  The hint may provide you with additional information:

### PRIMITIVE HINTS

- *contiguous*

  True if this primitive is contiguous with the previous one.  Example: Used to determine if a new sub-path is needed for the Cairo driver.

### OPERATION HINTS

- *preserve*

  ## WARNING

Only this class or the driver itself should call methods starting with an underscore, as this interface may change.

## METHODS

- *\_do\_stroke ($strokeop)*

  Perform a stroke.

- *\_do\_fill ($fillop)*

  Perform a fill.

- *\_draw\_arc ($arc)*

  Draw an arc.

- *\_draw\_canvas ($canvas)*

  Draw a canvas.

- *\_draw\_component ($comp)*

  Draw a component.

- *\_draw\_line ($line)*

  Draw a line.

- *\_draw\_rectangle ($rect)*

  Draw a rectangle.

- *\_draw\_textbox*

  Draw a textbox.

- *\_resize ($width, $height)*

  Resize the current working surface to the size specified.

- *\_finish\_page*

  Finish the current 'page' and start a new one.  Some drivers that are not paginated may need to emulate this behaviour.

- *data*

  Retrieve the results of this driver's operations.

- *draw*

  Draws the given Graphics::Primitive::Component.  If the component is a container then all components therein are drawn, recursively.

- *get\_text\_bounding\_box*

  Given a Font and a string, returns a bounding box of the rendered text.

- *finalize*

  Finalize the supplied component and any child components, recursively.

- *prepare*

  Prepare the supplied component and any child components, recursively.

- *write*

  Write out the results of this driver's operations to the specified file.

## AUTHOR

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

## 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.
