<sect1 id="zend.pdf.drawing">
    <title>Рисование<!-- Drawing. --></title>

    <sect2 id="zend.pdf.drawing.geometry">
        <title>Геометрия<!-- Geometry.--></title>
        <para>
        PDF использует ту же самую геометрию, что и PostScript. Она начинается с
        нижнего левого угла страницы и по умолчанию измеряется в пойнтах (1/72 дюйма).
<!--
        PDF uses the same geometry as PostScript. It starts from bottom-left corner of page
        and by default is measured in points (1/72 of an inch).
-->
        </para>
        <para>
        Размер страницы может быть получен из объекта страницы:
<!--
        Page size can be retrieved from a page object:
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
$width  = $pdfPage->getWidth();
$height = $pdfPage->getHeight();]]>
        </programlisting>
    </sect2>

    <sect2 id="zend.pdf.drawing.color">
        <title>Цвета<!-- Colors. --></title>
        <para>
        PDF имеет мощные возможности для представления цветов. Модуль Zend_Pdf
        поддерживает шкалу серого цвета, цветовые пространства RGB и CMYK.
        Они могут использоваться в любом месте, где требуется объект
        <code>Zend_Pdf_Color</code>. Классы <code>Zend_Pdf_Color_GrayScale</code>,
        <code>Zend_Pdf_Color_RGB</code> и <code>Zend_Pdf_Color_CMYK</code>
        предоставляют этот функционал:
<!--
        PDF has a powerful capabilities for colors representation. Zend_Pdf module supports Gray Scale,
        RGB and CMYK color spaces. Any of them can be used in any place, where <code>Zend_Pdf_Color</code>
        object is required. <code>Zend_Pdf_Color_GrayScale</code>, <code>Zend_Pdf_Color_RGB</code> and
        <code>Zend_Pdf_Color_CMYK</code> classes provide this functionality:
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
// $grayLevel (число с плавающей точкой)
// 0.0 (черный) - 1.0 (белый)
$color1 = new Zend_Pdf_Color_GrayScale($grayLevel);

// $r, $g, $b (числа с плавающей точкой)
// 0.0 (минимальная интенсивность) - 1.0 (максимальная интенсивность)
$color2 = new Zend_Pdf_Color_RGB($r, $g, $b);

// $c, $m, $y, $k (числа с плавающей точкой)
// 0.0 (минимальная интенсивность) - 1.0 (максимальная интенсивность)
$color3 = new Zend_Pdf_Color_CMYK($c, $m, $y, $k);]]>
        </programlisting>
    </sect2>


    <sect2 id="zend.pdf.drawing.shape-drawing">
        <title>Рисование фигур<!-- Shape Drawing. --></title>
        <para>
        Все операции прорисовки могут быть выполнены в контексте страницы PDF.
<!--
        All drawing operations can be done in a context of PDF page.
-->
        </para>
        <para>
        Класс <code>Zend_Pdf_Page</code> предоставляет набор примитивов для рисования:
<!--
        <code>Zend_Pdf_Page</code> class provides a set of drawing primitives:
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
/**
 * Рисует линию от x1,y1 до x2,y2.
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 */
public function drawLine($x1, $y1, $x2, $y2);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Рисует прямоугольник.
 *
 * Fill types:
 * Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE - заполнить прямоугольник и заштриховать (значение по умолчанию)
 * Zend_Pdf_Const::SHAPEDRAW_STROKE      - заштриховать прямоугольник
 * Zend_Pdf_Const::SHAPEDRAW_FILL        - заполнить прямоугольник
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @param integer $fillType
 */
public function drawRectangle($x1, $y1, $x2, $y2, $fillType = Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Риcует многоугольник.
 *
 * Если $fillType (тип заполнения) равен Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE
 * или Zend_Pdf_Const::SHAPEDRAW_FILL, то многоугольник будет автоматически замкнут.
 * См. более подробное описание этих методов в документации PDF
 * (section 4.4.2 Path painting Operators, Filling)
 *
 * @param array $x  - массив чисел с плавающей точкой (X-координаты вершин)
 * @param array $y  - массив чисел с плавающей точкой (Y-координаты вершин)
 * @param integer $fillType
 * @param integer $fillMethod
 */
public function drawPolygon($x, $y,
                            $fillType = Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE,
                            $fillMethod = Zend_Pdf_Const::FILLMETHOD_NONZEROWINDING);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Рисует окружность, центр которой находится в точке с координатами x и y,
 * с радиусом radius.
 *
 * Углы задаются в радианах.
 *
 * Сигнатуры метода:
 * drawCircle($x, $y, $radius);
 * drawCircle($x, $y, $radius, $fillType);
 * drawCircle($x, $y, $radius, $startAngle, $endAngle);
 * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
 *
 *
 * Это не настоящая окружность, так как PDF поддерживает только кубические кривые Безье.
 * Но в очень хорошем приближении.
 * Она отличается от реальной окружности максимум на 0.00026 доли радиуса
 * (на углах PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8, 13*PI/8 и 15*PI/8).
 * На углах 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 и 7*PI/4 это точная касательная к окружности.
 *
 * @param float $x
 * @param float $y
 * @param float $radius
 * @param mixed $param4
 * @param mixed $param5
 * @param mixed $param6
 */
public function  drawCircle($x, $y, $radius, $param4 = null, $param5 = null, $param6 = null);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Рисует эллипс внутри заданного прямоугольника.
 *
 * Сигнатуры метода:
 * drawEllipse($x1, $y1, $x2, $y2);
 * drawEllipse($x1, $y1, $x2, $y2, $fillType);
 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
 *
 * Углы задаются в радианах.
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @param mixed $param5
 * @param mixed $param6
 * @param mixed $param7
 */
public function drawEllipse($x1, $y1, $x2, $y2, $param5 = null, $param6 = null, $param7 = null);]]>
        </programlisting>
    </sect2>

    <sect2 id="zend.pdf.drawing.text-drawing">
        <title>Написание текста<!-- Text Drawing.--></title>
        <para>
        Операции по написанию текста также существуют в контексте страницы PDF.
<!--
        Text drawing operations are also exist in a context of PDF page:
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
/**
 * Выводит строку текста в заданной позиции.
 *
 * @param string $text
 * @param float $x
 * @param float $y
 * @throws Zend_Pdf_Exception
 */
public function drawText($text, $x, $y );]]>
        </programlisting>
        <para>
        Для написания текста используются текущий шрифт и его текущий размер. См.
        подробное описание ниже.
<!--
        Current font and current font size are used for text drawing operations. See detailed description below.
-->
        </para>
    </sect2>

    <sect2 id="zend.pdf.drawing.using-fonts">
        <title>Применение шрифтов<!-- Using fonts. --></title>
        <para>
        Метод <code>Zend_Pdf_Page::drawText()</code> использует текущий шрифт,
        который может быть установлен методом <code>Zend_Pdf_Page::setFont()</code>:
<!--
        <code>Zend_Pdf_Page::drawText()</code> method uses current font, which can be assigned
        by <code>Zend_Pdf_Page::setFont()</code> method:
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
/**
 * Устанавливает текущий шрифт.
 *
 * @param Zend_Pdf_Font $font
 * @param float $fontSize
 */
public function setFont(Zend_Pdf_Font $font, $fontSize);]]>
        </programlisting>
        <para>
        PDF поддерживает Type1, TrueType, Type3 и составные шрифты. Он предоставляет еще
        14 стандартных шрифтов Type1. На данный момент модуль <code>Zend_Pdf</code>
        предусматривает только эти стандартные шрифты. Они могут быть получены
        с помощью класса <code>Zend_Pdf_Font_Standard</code>. Конкретный шрифт
        указывается в качестве аргумента конструктора.
<!--
        PDF supports Type1, TrueType, Type3 and composite fonts. There are also 14 standard Type1 fonts
        provided by PDF. Zend_Pdf module provides only these standard fonts now. They can be obtained by using
        <code>Zend_Pdf_Font_Standard</code> class. Concrete font is specified as a constructor argument:
-->
        </para>
        <example>
            <title>Создание стандартного шрифта<!-- Create standard font.--></title>
            <programlisting language="php"><![CDATA[<?php
...
// Создание нового шрифта
$font = new Zend_Pdf_Font_Standard(Zend_Pdf_Const::FONT_HELVETICA);

// Применение шрифта
$pdfPage->setFont($font, 36);
...
?>]]>
            </programlisting>
        </example>
        <para>
        Константы для 14 стандартных шрифтов определены с помощью
        класса <code>Zend_Pdf_Const</code>:
<!--
        Font constants for 14 standard fonts are defined within <code>Zend_Pdf_Const</code> class:
-->
        <itemizedlist>
            <listitem>
                <para>Zend_Pdf_Const::FONT_TIMES_ROMAN</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_TIMES_BOLD</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_TIMES_ITALIC</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_TIMES_BOLDITALIC</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_HELVETICA</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_HELVETICA_BOLD</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_HELVETICA_ITALIC</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_HELVETICA_BOLDITALIC</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_COURIER</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_COURIER_BOLD</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_COURIER_ITALIC</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_COURIER_BOLDITALIC</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_SYMBOL</para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FONT_ZAPFDINGBATS</para>
            </listitem>
        </itemizedlist>
        </para>
    </sect2>

    <sect2 id="zend.pdf.drawing.image-drawing">
        <title>Рисование изображений<!-- Image Drawing. --></title>
        <para>
        Класс предоставляет метод <code>drawImage()</code> для рисования изображений.
<!--
        <code>Zend_Pdf_Page</code> class provides drawImage() method to draw image:
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
/**
 * Рисует изображение в заданной позиции на странице.
 *
 * @param Zend_Pdf_Resource_Image $image
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 */
public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);]]>
        </programlisting>
        <para>
            Объекты изображений должны создаваться через метод
            <code>Zend_Pdf_Image::imageWithPath($filePath)</code>
            (сейчас поддерживаются изображения JPG, PNG и TIFF):
<!--
        Image objects should be created with <code>Zend_Pdf_Image::imageWithPath($filePath)</code> method
        (JPG, PNG and TIFF images are supported now):
-->
        </para>
        <example>
            <title>Рисование изображения<!-- Image drawing.--></title>
            <programlisting language="php"><![CDATA[<?php
...
// Загрузка изображения
$image = Zend_Pdf_Image::imageWithPath('my_image.jpg');

$pdfPage->drawImage($image, 100, 100, 400, 300);
...
?>]]>
            </programlisting>
        </example>

        <para>
            <emphasis>Важно! Для поддержки JPEG необходимо сконфигурировать
            расширение GD.</emphasis>
            <emphasis>Важно! Для поддержки PNG необходимо сконфигурировать
            расширение ZLIB для работы с изображениями с Альфа-каналом.</emphasis>
<!--
            <emphasis>Important! JPEG support requires PHP GD extension to be configured.</emphasis>
            <emphasis>Important! PNG support requires ZLIB extension to be configured to work with Alpha channel images.</emphasis>
-->
        </para>
        <para>
            См. документацию PHP за более подробной информацией
            (<ulink url="http://www.php.net/manual/en/ref.image.php">http://www.php.net/manual/en/ref.image.php</ulink>).
            (<ulink url="http://www.php.net/manual/en/ref.zlib.php">http://www.php.net/manual/en/ref.zlib.php</ulink>).
<!--
            Refer to the PHP documentation for detailed information
            (<ulink url="http://www.php.net/manual/en/ref.image.php">http://www.php.net/manual/en/ref.image.php</ulink>).
            (<ulink url="http://www.php.net/manual/en/ref.zlib.php">http://www.php.net/manual/en/ref.zlib.php</ulink>).
-->
        </para>
    </sect2>

    <sect2 id="zend.pdf.drawing.line-drawing-style">
        <title>Стили рисования линий<!-- Line drawing style.--></title>
        <para>
        Стили рисования линий определяются толщиной линии, цветом линии и шаблоном
        пунктира. Все эти параметры могут быть определены методами класса
        <code>Zend_Pdf_Page</code>.
<!--
        Line drawing style is defined by line width, line color and line dashing pattern.
        All of this parameters can be assigned by <code>Zend_Pdf_Page</code>
        class methods:
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
/** Установка цвета линии. */
public function setLineColor(Zend_Pdf_Color $color);

/** Установка толщины линии. */
public function setLineWidth(float $width);

/**
 * Установка шаблона пунктира.
 *
 * $pattern (шаблон) является массивом чисел с плавающей точкой:
 * array(on_length, off_length, on_length, off_length, ...)
 * $phase (фаза) является сдвигом от начала линии.
 *
 * @param array $pattern
 * @param array $phase
 */
public function setLineDashingPattern($pattern, $phase = 0);]]>
        </programlisting>
    </sect2>

    <sect2 id="zend.pdf.drawing.fill-style">
        <title>Стиль заполнения<!-- Fill style.--></title>
        <para>
        Методы <code>Zend_Pdf_Page::drawRectangle()</code>, <code>Zend_Pdf_Page::drawPoligon()</code>,
        <code>Zend_Pdf_Page::drawCircle()</code> и <code>Zend_Pdf_Page::drawEllipse()</code>
        принимают аргумент <varname>$fillType</varname> как необязательный параметр.
        Это может быть:
<!--
        <code>Zend_Pdf_Page::drawRectangle()</code>, <code>Zend_Pdf_Page::drawPoligon()</code>,
        <code>Zend_Pdf_Page::drawCircle()</code> and <code>Zend_Pdf_Page::drawEllipse()</code> methods take
        <varname>$fillType</varname> argument as an optional parameter. It can be:
-->
        </para>

        <itemizedlist>
            <listitem>
                <para>
                Zend_Pdf_Const::SHAPEDRAW_STROKE - штрихует фигуру <!-- stroke shape -->
                </para>
            </listitem>
            <listitem>
                <para>
                Zend_Pdf_Const::SHAPEDRAW_FILL - заполняет фигуру <!-- only fill shape-->
                </para>
            </listitem>
            <listitem>
                <para>
                Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE - заполняет и штрихует (поведение по умолчанию)
                <!-- fill and stroke (default behavior)-->
                </para>
            </listitem>
        </itemizedlist>

        <para>
        Метод <code>Zend_Pdf_Page::drawPoligon()</code> принимает дополнительный
        параметр <varname>$fillMethod</varname>:
<!--
        <code>Zend_Pdf_Page::drawPoligon()</code> methods also takes an additional parameter
        <varname>$fillMethod</varname>:
-->
        </para>
        <itemizedlist>
            <listitem>
                <para>
                Zend_Pdf_Const::FILLMETHOD_NONZEROWINDING (поведение по умолчанию)
                <!-- (default behavior)-->
                </para>
                <para>
                <citetitle>Справка по PDF</citetitle> описывает это правило
                следующим образом:
                <blockquote>
                    <para>
                        Правило ненулевого количества витков определяет, находится ли
                        данная точка внутри траектории путем мысленного
                        проведения луча из этой точки в бесконечность в любом направлении
                        и последующего определения мест, где участок траектории пересекает луч.
                        Начиная отсчет с нуля, правило добавляет 1 каждый раз, когда
                        участок траектории пересекает луч слева направо и отнимает 1
                        каждый раз, когда участок траектории пересекает участок справа налево.
                        Если после подсчета всех пересечений результатом будет 0, то точка
                        находится вне траектории, иначе — внутри траектории.

                        Примечание: Метод не указывает, что делать, если участок траектории
                        совпадает или является касательной к выбранному лучу. Поскольку
                        направление луча является произвольным, правило просто выбирает
                        луч, который не создает таких пересечений. Для простых выпуклых
                        траекторий правило ненулевого количества витков определяет
                        внутреннюю и внешнюю части так, как это интуитивно предполагается.
                        Более интересными случаями являются те, которые включают в себя
                        сложные или самопересекающиеся траектории, как, например,
                        на Рис. 4.10 (в справке по PDF).

                        Для траектории, представляющую собой пятиконечную звезду,
                        состоящую из пяти соединенных отрезков, правило считает внутренней
                        частью всю площадь, окруженную звездой, включая пятиугольник в
                        центре. Для траектории, состоящей из двух концентрических
                        окружностей, площадь, окруженная обеими окружностями,
                        считается внутренней в том случае, если обе окружности нарисованы
                        в одном и том же направлении. Если окружности нарисованы в противоположных
                        направлениях, то, согласно правилу, только фигура в виде
                        баранки между ними будет внутренней частью, "дырка"
                        будет внешней частью.
                    </para>
                </blockquote>
<!--
                <citetitle>PDF reference</citetitle> describes this rule as follows:
                <blockquote>
The nonzero winding number rule determines whether a given point is inside a
path by conceptually drawing a ray from that point to infinity in any direction
and then examining the places where a segment of the path crosses the ray. Starting
with a count of 0, the rule adds 1 each time a path segment crosses the ray
from left to right and subtracts 1 each time a segment crosses from right to left.
After counting all the crossings, if the result is 0 then the point is outside the path;
otherwise it is inside.

Note: The method just described does not specify what to do if a path segment coincides
with or is tangent to the chosen ray. Since the direction of the ray is arbitrary,
the rule simply chooses a ray that does not encounter such problem intersections.
For simple convex paths, the nonzero winding number rule defines the inside
and outside as one would intuitively expect. The more interesting cases are those
involving complex or self-intersecting paths like the ones shown in Figure 4.10
(in a PDF Reference).

For a path consisting of a five-pointed star, drawn with five connected straight
line segments intersecting each other, the rule considers the inside to be the entire
area enclosed by the star, including the pentagon in the center. For a path composed
of two concentric circles, the areas enclosed by both circles are considered
to be inside, provided that both are drawn in the same direction. If the circles are
drawn in opposite directions, only the "doughnut" shape between them is inside,
according to the rule; the "doughnut hole" is outside.
            </blockquote>
-->
            </para>
            </listitem>
            <listitem>
                <para>Zend_Pdf_Const::FILLMETHOD_EVENODD</para>
                <para>
                <citetitle>Справка по PDF</citetitle> описывает это правило
                следующим образом:
                <blockquote>
                    <para>
                        Альтернативой правилу ненулевого количества витков является правило
                        чета-нечета. Это правило определяет нахождение точки
                        проведением луча из этой точки в любом направлении и простым подсчетом
                        количества пересечений частей траектории с этим лучом, независимо от
                        направления пересечения. Если число нечетное, то точка находится
                        во внутренней части; если четное, то точка находится снаружи. Это
                        правило дает такой же результат, как и правило ненулевого
                        количества витков для траекторий с простыми фигурами, но дает
                        разные результаты в случае более сложных фигур.

                        Рис. 4.11 (в справке по PDF) показывает результаты применения
                        правила чета-нечета к сложным фигурам. В случае пятиконечной
                        звезды правило считает точки треугольников находящимися
                        внутри траектории, но не пятиугольник в центре. Для двух
                        концентрических окружностей только фигура в виде баранки будет
                        считаться внутренней частью, независимо от направлений, в которых
                        нарисованы окружности.
                    </para>
                </blockquote>
<!--
                <citetitle>PDF reference</citetitle> describes this rule as follows:
                <blockquote>
An alternative to the nonzero winding number rule is the even-odd rule. This rule
determines the "insideness" of a point by drawing a ray from that point in any
direction and simply counting the number of path segments that cross the ray,
regardless of direction. If this number is odd, the point is inside; if even, the point
is outside. This yields the same results as the nonzero winding number rule for
paths with simple shapes, but produces different results for more complex
shapes.

Figure 4.11 (in a PDF Reference) shows the effects of applying the even-odd rule
to complex paths. For the five-pointed star, the rule considers the triangular
points to be inside the path, but not the pentagon in the center. For the two
concentric circles, only the "doughnut" shape between the two circles is considered inside,
regardless of the directions in which the circles are drawn.
                </blockquote>
-->
            </para>
            </listitem>
        </itemizedlist>
    </sect2>

    <sect2 id="zend.pdf.drawing.rotations">
        <title>Поворот<!-- Rotations. --></title>
        <para>
        Страница PDF может быть повернута перед применением любых операций рисования.
        Это может быть сделано методом <code>Zend_Pdf_Page::rotate()</code>:
<!--
        PDF page can be rotated before applying any draw operation.
        It can be done by <code>Zend_Pdf_Page::rotate()</code> method:
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
/**
 * Поворачивает страницу вокруг точки ($x, $y) на заданный угол (в радианах).
 *
 * @param float $angle
 */
public function rotate($x, $y, $angle);]]>
        </programlisting>
    </sect2>

    <sect2 id="zend.pdf.drawing.save-restore">
        <title>Сохранение/восстановление графического состояния<!-- Save/restore graphics state.--></title>
        <para>
        В любое время графическое состояние страницы (текущий шрифт, размер шрифта,
        цвет линии, цвет заполнения, стиль линии, поворот страницы, область ограничения) может
        быть сохранено и после восстановлено. Операция сохранения сохраняет данные
        в стек графического состояния, операция восстановления извлекает данные из стека.
<!--
        At any time page graphics state (current font, font size, line color, fill color,
        line style, page rotation, clip area) can be saved and then restored. Save operation puts
        data to a graphics state stack, restore operation retrieves it from there.
-->
        </para>
        <para>
        Методы в классе <code>Zend_Pdf_Page</code> для этих операций:
<!--
        There are to methods in <code>Zend_Pdf_Page</code> class for these operations:
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
/**
 * Сохраняет графическое состояние данной страницы.
 * Выполняет снимок используемых на данный момент стилей, положений, ... и всех
 * поворотов/преобразований/масштабирований которые были применены.
 * This takes a snapshot of the currently applied style, position, clipping area and
 * any rotation/translation/scaling that has been applied.
 */
public function saveGS();

/**
 * Восстанавливает графическое состояние, которое было сохранено последним
 * вызовом saveGS().
 */
public function restoreGS();]]>
        </programlisting>
    </sect2>

    <sect2 id="zend.pdf.drawing.clipping">
        <title>Ограничение области рисования<!-- Clipping draw area. --></title>
        <para>
        PDF и модуль Zend_Pdf поддерживают ограничение области рисования.
        Ограничение определяет область страницы, затрагиваемой
        операциями рисования. Вначале эта область представляет собой всю
        страницу.
<!--
        PDF and Zend_Pdf module support clipping of draw area.
        Current clip area limits the regions of the page affected by painting operators. It's a whole page initially.
-->
        </para>
        <para>
        Класс <code>Zend_Pdf_Page</code> предоставляет набор методов для операций ограничения.
<!--
        <code>Zend_Pdf_Page</code> class provides a set of methods for clipping operations.
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
/**
 * Делит текущую площадь ограничения с помощью прямоугольника.
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 */
public function clipRectangle($x1, $y1, $x2, $y2);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Делит текущую площадь ограничения с помощью многоугольника.
 *
 * @param array $x  - массив чисел с плавающей точкой (X-координаты верхушек)
 * @param array $y  - массив чисел с плавающей точкой (Y-координаты верхушек)
 * @param integer $fillMethod
 */
public function clipPolygon($x, $y, $fillMethod = Zend_Pdf_Const::FILLMETHOD_NONZEROWINDING);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Делит текущую площадь ограничения с помощью окружности.
 *
 * @param float $x
 * @param float $y
 * @param float $radius
 * @param float $startAngle
 * @param float $endAngle
 */
public function clipCircle($x, $y, $radius, $startAngle = null, $endAngle = null);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Делит текущую площадь ограничения с помощью эллипса.
 *
 * Сигнатуры метода:
 * drawEllipse($x1, $y1, $x2, $y2);
 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
 *
 * @todo обрабатывать случаи, когда $x2-$x1 == 0 или $y2-$y1 == 0
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @param float $startAngle
 * @param float $endAngle
 */
public function clipEllipse($x1, $y1, $x2, $y2, $startAngle = null, $endAngle = null);]]>
        </programlisting>
    </sect2>

    <sect2 id="zend.pdf.drawing.styles">
        <title>Стили<!-- Styles. --></title>
        <para>
        Класс <code>Zend_Pdf_Style</code> предоставляет набор функциональных
        возможностей для работы со стилями.
<!--
        <code>Zend_Pdf_Style</code> class provides styles functionality.
-->
        </para>
        <para>
        Стили могут использоваться для сохранения набора параметров графического
        состояния и применять их к странице PDF одной операцией:
<!--
        Styles can be used to store a set of graphic state parameters and apply it to a PDF page by one operation:
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
/**
 * Установить стиль для будущих операций рисования на данной странице
 *
 * @param Zend_Pdf_Style $style
 */
public function setStyle(Zend_Pdf_Style $style);

/**
 * Возвращает стили, используемые на странице
 *
 * @return Zend_Pdf_Style|null
 */
public function getStyle();]]>
        </programlisting>

        <para>
        Класс <code>Zend_Pdf_Style</code> предоставляет набор методов для установки
        или получения различных параметров графического состояния:
<!--
        <code>Zend_Pdf_Style</code> class provides a set of methods to set or get different graphics state parameters:
-->
        </para>
        <programlisting language="php"><![CDATA[<?php
/**
 * Устанавливает цвет линии.
 *
 * @param Zend_Pdf_Color $color
 */
public function setLineColor(Zend_Pdf_Color $color);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Возвращает цвет линии.
 *
 * @return Zend_Pdf_Color|null
 */
public function getLineColor();]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Устанавливает толщину линии.
 *
 * @param float $width
 */
public function setLineWidth($width);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Возвращает толщину линии.
 *
 * @return float
 */
public function getLineWidth();]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Устанавливает шаблон пунктира.
 *
 * @param array $pattern
 * @param float $phase
 */
public function setLineDashingPattern($pattern, $phase = 0);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Возвращает шаблон пунктира.
 *
 * @return array
 */
public function getLineDashingPattern();]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Возвращает фазу пунктира.
 *
 * @return float
 */
public function getLineDashingPhase();]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Устанавливает цвет заполнения.
 *
 * @param Zend_Pdf_Color $color
 */
public function setFillColor(Zend_Pdf_Color $color);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Возвращает цвет заполнения.
 *
 * @return Zend_Pdf_Color|null
 */
public function getFillColor();]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Устанавливает текущий шрифт.
 *
 * @param Zend_Pdf_Font $font
 * @param float $fontSize
 */
public function setFont(Zend_Pdf_Font $font, $fontSize);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Изменяет текущий размер шрифта
 *
 * @param float $fontSize
 */
public function setFontSize($fontSize);]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Возвращает текущий шрифт.
 *
 * @return Zend_Pdf_Font $font
 */
public function getFont();]]>
        </programlisting>
        <programlisting language="php"><![CDATA[<?php
/**
 * Возвращает текущий размер шрифта.
 *
 * @return float $fontSize
 */
public function getFontSize();]]>
        </programlisting>
    </sect2>

</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
