#!/usr/bin/perl
# $Id: starter_path.pl,v 1.1.2.2 2010/12/08 13:54:18 rp Exp $
#
# Starter sample for pathobjects:
# Create some basic examples of pathobject construction and use
#
# required software: PDFlib/PDFlib+PDI/PPS 8
# required data: none
#

use pdflib_pl 8.0;
use strict;

my $outfilename = "starter_path.pdf";
my $text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " .
    "sed do eiusmod tempor incididunt ut labore et dolore magna " .
    "aliqua. Ut enim ad minim veniam, quis nostrud exercitation " .
    "ullamco laboris nisi ut aliquip ex ea commodo consequat. " .
    "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum " .
    "dolore eu fugiat nulla pariatur. Excepteur sint occaecat " .
    "cupidatat non proident, sunt in culpa qui officia deserunt mollit anim " .
    "id est laborum. ";


my $p = PDF_new();
eval {

    # This means we must check return values of load_font() etc.
    PDF_set_parameter($p, "errorpolicy", "return");

    if (PDF_begin_document($p, $outfilename, "") == -1) {
	die("Error: " . PDF_get_errmsg($p));
    }

    PDF_set_info($p, "Creator", "PDFlib starter sample");
    PDF_set_info($p, "Title", "starter_path");
    # Start an A4 page 
    PDF_begin_page_ext($p, 0, 0, "width=a4.width height=a4.height");

    # Construct a pathobject for an arrow shape 

    my $path= -1;

    # The tip of the arrow gets rounded corners 
    $path= PDF_add_path_point($p, $path, 200.0,  25.0, "move", "round=10");
    $path= PDF_add_path_point($p, $path, 200.0,  75.0, "line", "");
    # assign a name to the arrow's tip 
    $path= PDF_add_path_point($p, $path, 300.0,   0.0, "line", "name=tip");
    $path= PDF_add_path_point($p, $path, 200.0, -75.0, "line", "");
    $path= PDF_add_path_point($p, $path, 200.0, -25.0, "line", "");

    # Start a new sub$pathfor the straight base of the arrow 
    $path= PDF_add_path_point($p, $path, 200.0, -25.0, "move", "");
    $path= PDF_add_path_point($p, $path,   0.0, -25.0, "line", "");

    # The center of the base can serve as a named attachment point 
    $path= PDF_add_path_point($p, $path,   0.0,   0.0, "line", "name=base");
    $path= PDF_add_path_point($p, $path,   0.0,  25.0, "line", "");
    $path= PDF_add_path_point($p, $path, 200.0,  25.0, "line", "");

    my $x = 100.0;
    my $y = 850.0;


    # ----------------------------------------
    # Place arrow in its original direction
    # ----------------------------------------
     
    $y -= 100.0;
    PDF_draw_path($p, $path, $x, $y,
	"stroke linewidth=3 fill fillcolor=Turquoise " .
	"linecap=projecting attachmentpoint=base ");


    # ----------------------------------------
    # Scale down arrow and align it to north east
    # ----------------------------------------
     
    $y -= 200.0;
    PDF_draw_path($p, $path, $x, $y,
	"stroke linewidth=3 fill fillcolor=Turquoise " .
	"linecap=projecting attachmentpoint=base scale=0.5 align={1 1}");


    # ----------------------------------------
    # Scale to 50%, use the arrow tip as attachment point,
    # and align the arrow to the left
    # ----------------------------------------
     
    $y -= 100.0;
    PDF_draw_path($p, $path, $x, $y,
	"stroke linewidth=3 fill fillcolor=Turquoise " .
	"linecap=projecting attachmentpoint=tip scale=0.5 align={-1 0}");


    # ----------------------------------------
    # Place text on the $path; round all corners to
    # allow smoother text at the corners
    # ----------------------------------------
     
    $y -= 100.0;
    my $optlist = sprintf("textpath={path=%d round=10} position={center bottom} " . 
	"fontname=Helvetica encoding=winansi fontsize=8",
	$path);
    PDF_fit_textline($p, $text, $x, $y, $optlist);

    # ----------------------------------------
    # Use the $pathas clipping $pathfor a Textflow
    # ----------------------------------------
    
    $y -= 300.0;

    # Feed the text to the Textflow object 
    my $tf = PDF_add_textflow($p, -1, $text, 
	"fontname=Helvetica fontsize=10 encoding=winansi " . 
	"alignment=justify");
    # Use text twice to fill the arrow 
    $tf = PDF_add_textflow($p, $tf, $text, 
	"fontname=Helvetica fontsize=10 encoding=winansi " .
	"alignment=justify");
    if ($tf == -1) {
	die("Error: %s\n", PDF_get_errmsg($p));
    }

    # Attach the $path's reference point to the middle left (0%, 50%)
    # of the fitbox, and wrap the text inside the $path(inversefill)
     
    $optlist = sprintf( "wrap={inversefill " . 
	    "paths={{path=%d refpoint={0%% 50%%} scale=1.5 }}}",
	$path);
    my $result = PDF_fit_textflow($p, $tf, $x, $y, $x+450, $y+225, $optlist);

    if ($result eq  "_stop")
    {
	# In this example we don't care about overflow text 
    }
    PDF_delete_textflow($p, $tf);


    # ----------------------------------------
    # Query information about the pathobject
    # ----------------------------------------
    
    my $n = PDF_info_path($p, $path, "numpoints", "");

    PDF_delete_path($p, $path);
    PDF_end_page_ext($p, "");
    PDF_end_document($p, "");

};

if ($@) {
    printf("$0: PDFlib Exception occurred:\n");
    printf(" $@\n");
    exit(1);
}
