NAME
Prima::Drawable - 2-D graphic interface
SYNOPSIS
if ( $object-> isa('Prima::Drawable')) {
$object-> begin_paint;
$object-> color( cl::Black);
$object-> line( 100, 100, 200, 200);
$object-> ellipse( 100, 100, 200, 200);
$object-> end_paint;
}
DESCRIPTION
Prima::Drawable is a descendant of Prima::Component. It provides access to the system graphic context and canvas through its methods and properties. The Prima::Drawable descendants Prima::Widget, Prima::Image, Prima::DeviceBitmap and Prima::Printer are backed by system-dependent routines that allow drawing and painting on the system objects.
USAGE
Prima::Drawable, as well as its ancestors Prima::Component and Prima::Object, is never used directly, because Prima::Drawable class by itself provides only the interface. It provides a three-state object access - when drawing and painting is enabled, when these are disabled, and the information acquisition state. By default, the object is created in paint-disabled state. To switch to the enabled state, begin_paint() method is used. Once in the enabled state, the object drawing and painting methods apply to the system canvas. To return to the disabled state, end_paint() method is called. The information state can be managed by using begin_paint_info() and end_paint_info() methods pair. An object cannot be triggered from the information state to the enabled state ( and vice versa ) directly. These work differently with the graphic context and the canvas.
Graphic context and canvas
The graphic context is the set of variables, that control how exactly graphic primitives are rendered. The variable examples are color, font, line width, etc. Another term used here is canvas - the graphic area of a certain extent, connected to the Prima object, where the drawing and painting methods are used on.
In all three states a graphic context is allowed to be modified, but in different ways. In the disabled state a graphic context value is saved as a template; when an object enters the information or the enabled state, all values are preserved, but when the object is back to the disabled state, the graphic context is restored to the values last assigned before entering the enabled state. The code example below illustrates the idea:
$d = Prima::Drawable-> create;
$d-> lineWidth( 5);
$d-> begin_paint_info;
# lineWidth is 5 here
$d-> lineWidth( 1);
# lineWidth is 1
$d-> end_paint_info;
# lineWidth is 5 again
( Note: ::region
, ::clipRect
and ::translate
properties are exceptions. They cannot be used in the disabled state; their values are neither recorded nor used as a template).
That is, in the disabled state any Drawable maintains only the graphic context values. To draw on a canvas, the object must enter the enabled state by calling begin_paint(). This function can be unsuccessful, because the object binds with system resources during this stage, and allocation of those may fail. Only after the enabled state is entered, the canvas is accessible:
$d = Prima::Image-> create( width => 100, height => 100);
if ( $d-> begin_paint) {
$d-> color( cl::Black);
$d-> bar( 0, 0, $d-> size);
$d-> color( cl::White);
$d-> fill_ellipse( $d-> width / 2, $d-> height / 2, 30, 30);
$d-> end_paint;
} else {
die "can't draw on image:$@";
}
Different objects are mapped to different types of canvases - Prima::Image
canvas pertains its content after end_paint(), Prima::Widget
maps it to some screen area, which content is of more transitory nature, etc.
The information state is as same as the enabled state, but the changes to the canvas are not visible. Its sole purpose is to read, not to write information. Because begin_paint() requires some amount of system resources, there is a chance that a resource request can fail, for any reason. The begin_paint_info() requires some resources as well, but usually much less, and therefore if only information is desired, it is usually faster and cheaper to obtain it inside the information state. A notable example is get_text_width() method, that returns the length of a text string in pixels. It works in both enabled and information states, but code
$d = Prima::Image-> create( width => 10000, height => 10000);
$d-> begin_paint;
$x = $d-> get_text_width('A');
$d-> end_paint;
is much more 'expensive' than
$d = Prima::Image-> create( width => 10000, height => 10000);
$d-> begin_paint_info;
$x = $d-> get_text_width('A');
$d-> end_paint_info;
for the obvious reasons.
It must be noted that some information methods like get_text_width() work even under the disabled state; the object is switched to the information state implicitly if it is necessary.
See also: "graphic_context".
Color space
Graphic context and canvas operations rely completely on a system implementation. The internal canvas color representation is therefore system-specific, and usually could not be described in Prima definitions. Often the only information available about color space is its color depth.
Therefore all color manipulations, including dithering and antialiasing are subject to system implementation, and can not be controlled from perl code. When a property is set on the object in the disabled state, it is recorded verbatim; color properties are no exception. After the object switched to the enabled state, a color value is translated to the system color representation, which might be different from Prima's. For example, if the display color depth is 15 bits, 5 bits for every component, then the white color value 0xffffff is mapped to
11111000 11111000 11111000
--R----- --G----- --B-----
that equals to 0xf8f8f8, not 0xffffff ( See Prima::gp-problems for inevident graphic issues discussion ).
The Prima::Drawable color format is RRGGBB, with each component resolution of 8 bit, thus allowing 2^24 color combinations. If the device color space depth is different, the color is truncated or expanded automatically. In case the device color depth is insufficient, dithering algorithms may apply.
Note: not only color properties, but all graphic context properties allow all possible values in the disabled state, which are translated into system-allowed values when entering the enabled and the information states. This feature can be used to test if a graphic device is capable of performing certain operations ( for example, if it supports raster operations - the printers usually do not ). Example:
$d-> begin_paint;
$d-> rop( rop::Or);
if ( $d-> rop != rop::Or) { # this assertion is always false without
... # begin_paint/end_paint brackets
}
$d-> end_paint;
There are ( at least ) two color properties on each drawable - ::color
and ::backColor
. The values they operate are unsigned integers in the discussed above RRGGBB format, however, the toolkit defines some mnemonic color constants as well:
cl::Black
cl::Blue
cl::Green
cl::Cyan
cl::Red
cl::Magenta
cl::Brown
cl::LightGray
cl::DarkGray
cl::LightBlue
cl::LightGreen
cl::LightCyan
cl::LightRed
cl::LightMagenta
cl::Yellow
cl::White
cl::Gray
As stated before, it is not unlikely that if a device color depth is insufficient, where the primitives could be drawn with dithered or incorrect colors. This usually happens on paletted displays, with 256 or less colors.
There exists two methods that facilitate the correct color representation. The first way is to get as much information as possible about the device. The methods get_nearest_color() and get_physical_palette() provide possibility to avoid mixed colors drawing by obtaining indirect information about solid colors, supported by a device. Another method is to use ::palette
property. It works by inserting the colors into the system palette, so if an application knows the colors it needs beforehand, it can employ this method - however this might result in system palette flash when a window focus toggles.
Both of these methods are applicable both with drawing routines and image output. An application that desires to display an image with least distortion is advised to export its palette to an output device, because images usually are not subject to automatic dithering algorithms. Prima::ImageViewer module employs this scheme.
Antialiasing and alpha
If the system has capability for antialiased drawing and alpha rendering, Prima can use it. The render mode can be turned on by calling
$drawable->antialias(1)
which turns on the following effects:
All primitives except images,
pixel
, andbar_alpha
are plotted with antialiased edges (text is always antialiased when possible). Arcs, lines, paths, all of them manifest adjacent pixels being rendered with half-tones.Graphic coordinates are then used as floating point numbers, not integers. That means that f ex a call
$drawable->rectangle(5.3, 5.3, 10, 10)
that had its coordinates automatically rounded to (5,5,10,10), now will render the primitive with subpixel precision, where its two edges will be divided between pixels 5 and 6, by using half-tones.
Another note on the rounding off coordinates: historically almost all Prima pixel coordinates were integers, and implicit rounding of the passed numbers were done using the
int
function, i e int(0.7)=0 and int(-0.7)=0. This was later changed, breaking some backward compatibility, and now the rounding function is a more robustR = floor(x + 0.5)
, whereR(0.7) = 1
andR(-0.7) = -1
.
For the cases where system does not support antialiasing, Prima provides Prima::Drawable::Antialias emulation class, available through the new_aa_surface
call. Internal image painting routines uses this facility as well.
To see if alpha and antialiasing is supported on the system, check sv::Antialias
value. To see if a particular drawable supports alpha layering, check can_draw_alpha
method.
Note that in the render mode, all painting operations treat alpha channel differently, which can have a dramatic difference on layered surfaces. In the normal mode, the alpha channel is completely ignored, and using normal mode paints on a layered widget always produces a translucent window, because the alpha value will always be 0 and color bits are assumed to be already premultiplied. In the render mode, alpha channel is addressed by alpha
property when drawing primitives, or in mask
property when drawing icons (again, drawing images and non-layered bitmaps assumes alpha = 0). The same is valid for fill pattern images and fill pattern icons.
Monochrome bitmaps
Prima has special rules when drawing a monochrome Prima::DeviceBitmap. Such objects don't possess an inherent color palette, and by definition are bitmaps with only two pixel values present, 0s and 1s. When a monochrome bitmap is drawn, 0s are painted using the color value of the target canvas color
property, and 1s using the backColor
value.
That means that the following code
$bitmap-> color(0);
$bitmap-> line(0,0,100,100);
$target-> color(cl::Green);
$target-> put_image(0,0,$bitmap);
produces a green line on $target
.
When using monochrome bitmaps for logical operations, note that the target colors should not be explicit 0 and 0xffffff, nor cl::Black
and cl::White
, but cl::Clear
and cl::Set
instead. The reason is that on paletted displays, system palette may not necessarily contain the white color under palette index (2^ScreenDepth-1). cl::Set
thus signals that the value should be "all ones", no matter what color it represents, because it will be used for logical operations.
Fonts
Prima maintains its own font naming convention, that usually does not conform to the system's. Since Prima's goal is interoperability, it might be so that some system fonts would not be accessible from within the toolkit.
Prima::Drawable provides property ::font
, that accepts/returns a hash, that represents the state of a font in the system graphic context. The font hash keys that are acceptable on set-call are:
- name
-
The font name string. If there is no such font, a default font name is used. To select default font, a 'Default' string can be passed with the same result ( unless the system has a font named 'Default', of course).
- height
-
An integer value from 1 to MAX_INT. Specifies the desired extent of a font glyph between descent and ascent lines in pixels.
- size
-
An integer value from 1 to MAX_INT. Specifies the desired extent of a font glyph between descent and internal leading lines in points. The relation between
size
andheight
isheight - internal_leading size = --------------------------- * 72.27 resolution
That differs from some other system representations: Win32, for example, rounds 72.27 constant to 72.
- width
-
A integer value from 0 to MAX_INT. If greater than 0, specifies the desired extent of a font glyph width in pixels. If 0, sets the default ( designed ) width corresponding to the font size or height.
- style
-
A combination of
fs::
( font style ) constants. The constantsfs::Normal fs::Bold fs::Thin fs::Italic fs::Underlined fs::StruckOut fs::Outline
can be OR-ed together to express the font style. fs::Normal equals to 0 and usually never used. If some styles are not supported by a system-dependent font subsystem, they are ignored.
- pitch
-
One of three constants:
fp::Default fp::Fixed fp::Variable
fp::Default
specifies no interest about font pitch selection.fp::Fixed
is set when a monospaced (all glyphs are of same width) font is desired.fp::Variable
pitch specifies a font with different glyph widths. This key is of the highest priority; all other keys may be altered for the consistency of the pitch key. - vector
-
One of three constants:
fv::Default fv::Bitmap fv::Outline
fv::Default
specifies no interest about font type selection,fv::Bitmap
sets priority for the bitmap fonts,fv::Outline
for the vector fonts.Additionally, font entries returned from
fonts
method may setvector
tofv::ScalableBitmap
, to distinguish a bitmap font face that comes with predefined bitmap sets from a scalable font. - direction
-
A counter-clockwise rotation angle - 0 is default, 90 is pi/2, 180 is pi, etc. If a font could not be rotated, it is usually substituted with the one that can.
- encoding
-
A string value, one of the strings returned by
Prima::Application::font_encodings
. Selects desired font encoding; if empty, picks the first matched encoding, preferably the locale set up by the user.The encodings provided by different systems are different; in addition, the only encodings are recognizable by the system, that are represented by at least one font in the system.
Unix systems and the toolkit PostScript interface usually provide the following encodings:
iso8859-1 iso8859-2 ... other iso8859 ... fontspecific
Win32 returns the literal strings like
Western Baltic Cyrillic Hebrew Symbol
A hash that ::font
returns, is a tied hash, whose keys are also available as separate properties. For example,
$x = $d-> font-> {style};
is equivalent to
$x = $d-> font-> style;
While the latter gives nothing but the arguable coding convenience, its usage in set-call is much more usable:
$d-> font-> style( fs::Bold);
instead of
my %temp = %{$d-> font};
$temp{ style} = fs::Bold;
$d-> font( \%temp);
The properties of a font tied hash are also accessible through set() call, like in Prima::Object:
$d-> font-> style( fs::Bold);
$d-> font-> width( 10);
is an equivalent to
$d-> font-> set(
style => fs::Bold,
width => 10,
);
When get-called, ::font
property returns a hash where more entries than the described above can be found. These keys are read-only, their values are ignored if passed to ::font
in a set-call.
In order to query the full list of fonts available to a graphic device, the ::fonts
method is used. This method is not present in Prima::Drawable namespace; it can be found in two built-in class instances, Prima::Application
and Prima::Printer
.
Prima::Application::fonts
returns metrics for the fonts available to the screen device, while Prima::Printer::fonts
( or its substitute Prima::PS::Printer ) returns fonts for the printing device. The result of this method is an array of font metrics, fully analogous to these returned by Prima::Drawable::font
method.
- family
-
A string with font family name. The family is a secondary string key, used for distinguishing between fonts with same name but of different vendors ( for example, Adobe Courier and Microsoft Courier).
- ascent
-
Number of pixels between a glyph baseline and descent line.
- descent
-
Number of pixels between a glyph baseline and descent line.
- internalLeading
-
Number of pixels between ascent and internal leading lines. Negative if the ascent line is below the internal leading line.
- externalLeading
-
Number of pixels between ascent and external leading lines. Negative if the ascent line is above the external leading line.
Horizontal font measurements
- weight
-
Font designed weight. Can be one of
fw::UltraLight fw::ExtraLight fw::Light fw::SemiLight fw::Medium fw::SemiBold fw::Bold fw::ExtraBold fw::UltraBold
constants.
- maximalWidth
-
Maximal extent of a glyph in pixels. Equals to width in monospaced fonts.
- xDeviceRes
-
Designed horizontal font resolution in dpi.
- yDeviceRes
-
Designed vertical font resolution in dpi.
- firstChar
-
Index of the first glyph present in a font.
- lastChar
-
Index of the last glyph present in a font.
- breakChar
-
Index of the default character used to divide words. In a typical western language font it is 32, ASCII space character.
- defaultChar
-
Index of a glyph that is drawn instead of nonexistent glyph if its index is passed to the text drawing routines.
Font ABC metrics
Besides these characteristics, every font glyph has an ABC-metric, the three integer values that describe horizontal extents of a glyph's black part relative to the glyph extent:
A and C are negative, if a glyphs 'hangs' over it neighbors, as shown in picture on the left. A and C values are positive, if a glyph contains empty space in front or behind the neighbor glyphs, like in picture on the right. As can be seen, B is the width of a glyph's black part.
ABC metrics returned by the get_font_abc() method.
The corresponding vertical metrics, called in Prima DEF
metrics, are returned by the get_font_def() method.
Raster operations
A drawable has two raster operation properties: ::rop
and ::rop2
. These define how the graphic primitives are plotted. ::rop
deals with the foreground color drawing, and ::rop2
with the background.
Universal ROPs
The toolkit defines the following operations:
Usually, however, graphic devices support only a small part of the above set, limiting ::rop
to the most important operations: Copy, And, Or, Xor, NoOp. ::rop2
is usually even more restricted, supports only Copy and NoOp.
The raster operations apply to all graphic primitives except SetPixel.
Note for layering: using layered images and device bitmaps with put_image
and stretch_image
can only use rop::SrcCopy
and rop::Blend
raster operations on OS-provided surfaces. See more on rop::Blend
below.
Also, rop::AlphaCopy
operation is available for accessing alpha bits only. When used, the source image is treated as alpha mask, and therefore it has to be grayscale. It can be used to apply the alpha bits independently, without need to construct an Icon object.
rop::Blend
rop::Blend
is same as rop::SrcOver
except the source pixels are assumed to be already premultiplied with the source alpha. This is the default ROP when drawing with 8-bit icon masks or on layered surfaces, and it reflects the expectation of the OS that images come premultiplied.
This is the only blending operator supported on the widgets and bitmaps, and it is advised to premultiply image pixels prior to drawing images using it with calls to Image.premultiply_alpha
. Image drawing supports this operator in case these premultiplied images are to be used not only on native surfaces but also on Prima images.
Additional ROPs
Prima implements extra features for compositing on images outside the begin_paint/end_paint brackets. It supports the following 12+1 Porter-Duff operators and some selected Photoshop blend operators:
- Transparency control
-
There is defined a set of constants to apply a constant source and destination alpha to when there is no alpha channel available:
rop::SrcAlpha rop::SrcAlphaShift rop::DstAlpha rop::DstAlphaShift
Combine the rop constant using this formula:
$rop = rop::XXX | rop::SrcAlpha | ( $src_alpha << rop::SrcAlphaShift ) | rop::DstAlpha | ( $dst_alpha << rop::DstAlphaShift )
or by calling
rop::alpha($rop, [ $src_alpha, [ $dst_alpha ]])
that does the same.Also, the function
rop::blend($alpha)
creates a rop constant for simple blending of two images by the following formula:$dst = ( $src * $alpha + $dst * ( 255 - $alpha ) ) / 255
rop::alpha
also can be used for drawing on images outside begin_paint/end_paint with all Porter-Duff and Photoshop raster operators:$image->rop( rop::alpha( rop::SrcOver, 128 )); $image->ellipse( 5, 5, 5, 5 );
Note that when the raster operation is set to
rop::SrcOver
, the fully identical effect can be achieved by$image->alpha(128); $image->ellipse( 5, 5, 5, 5 );
as well.
When used with icons, their source and/or destination alpha channels are additionally multiplied with these values.
- rop::ConstantColor
-
This bit is used when the alpha is defined but the main bits aren't. In this case, the main bits are filled from the destination's image color, and the source image treated as the source alpha channel. The following code applies a solid green shade with a mask loaded from file.
$src->load('8-bit gray mask.png'); $dst->color(cl::LightGreen); $dst->put_image( 0,0,$src,rop::SrcOver | rop::ConstantColor);
Coordinates
The Prima toolkit employs the XY grid, where X ascends rightwards and Y ascends upwards. There, the (0,0) location is the bottom-left pixel of a canvas.
All graphic primitives use inclusive-inclusive boundaries. For example,
$d-> bar( 0, 0, 1, 1);
plots a bar that covers 4 pixels: (0,0), (0,1), (1,0) and (1,1).
The coordinate origin can be shifted using ::matrix
property, that translates the (0,0) point to the given offset. Calls to ::matrix
, ::clipRect
and ::region
always use the 'physical' (0,0) point, whereas the plotting methods use the transformation result, the 'logical' (0,0) point.
As noted before, these three properties cannot be used in when an object is in the disabled state.
Matrix
At the very bottom Prima::Drawable
accepts matrix scalars in form of 6-item arrays, that constitute the following 2-D transformation matrix
A B DX
C D DY
0 0 1
where the coordinate transformation follows this formula:
x' = A x + B x + DX
y' = C y + D y + DY
. There are two accessors, get_matrix
and set_matrix
that return a copy, or copy a new matrix, correspondintly, from and to the drawable object.
The 6-item array that get_matrix
returns is also a blessed object or type Prima::matrix
( see "Prima::matrix" in Prima::types ) that is a separate copy of the object matrix. Prima::matrix
objects feature a set of oprations such as rotate
and translate
that transform the matrix further. In order to apply this matrix, one calls $drawable->set_matrix($matrix)
or $matrix->apply($drawable)
.
There is also a property matrix
, that is not really orthogonal to the get_matrix
/ set_matrix
method pair, as matrix
returns a Prima::Matrix
object, that, contrary to a Prima::matrix
object returned by get_matrix
, is a direct accessor to the drawable's matrix:
my $m = $self->get_matrix;
$m->translate(1,2);
$self->set_matrix($m); # or $self->matrix($m);
is the same as
$self->matrix->translate(1,2);
and does not need an explicit call to set_matrix
or apply
.
This class has all the methods the Prima::matrix
has. See more in "Prima::Matrix" in Prima::types.
Custom line end styles
Prima uses its own plotting mechanism in Prima::Drawable::Path to produce all primitive shapes, including lines. The way lines are plotted is governed by properties lineEnd
, lineJoin
, linePattern
, and miterLimit
. All of these properties are described below, however lineEnd
provides rich capabilities to generate custom line ends, and this is what described in this section.
- le:: namespace
-
There are 3 predefined
le::
integer constantsthat are hardcoded in Prima, that are accepted by the
lineEnd
property. These constants are somewhat limited in the way one can operate them, for the sake of efficiency.It is also possible to supply an array descriptor that defines a set of primitives that plots a line cap, automatically transformed with respect to the current line tangent and width. Details of the descriptor syntax itself are given in the next section, while here the set of non-hardcoded line end functions is listed, that is also suitable for use in the
lineEnd
property.le::Arrow le::Cusp le::InvCusp le::Knob le::Rect le::RoundRect le::Spearhead le::Tail
These descriptors could be arbitrarily transformed (f ex scaled):
# all three lines produce the same effect $x->lineEnd( le::scale( Arrow => 1.5 ) ); $x->lineEnd( le::transform( le::Arrow, [1.5,0,0,1.5,0,0] ) ); $x->lineEnd( le::transform( le::Arrow, Prima::matrix->new->scale(1.5) ) );
Line ends with x 1.5 scaling
- lineEnd accessors
-
The
lineEnd
property can accept up to 4 line end definitions, depending on syntax. When Prima plots lines, depending on the location of a line end, one of these 4 definitions is selected. Each definition also has its own property - see "lineHead", "lineTail", "arrowHead", and "arrowTail", or a index-based accessorlineEndIndex
: - Line end syntax
-
The syntax for custom line end style is:
syntax ::= array of pairs pair ::= command, array of points command ::= line or conic or cubic points ::= set of x,y coordinate pairs (vertices)
where individual commands accept arbitrary number of vertices, but no less than 1 for
line
, 2 forconic
, and 3 forcubic
.The commands are executed sequentially on a coordinate grid where line width is assumed to be 1, the plotting starts from point at (1,0), and ends at (-1,0).
For example, this is the definition of
le::Arrow
:[ conic => [1,0,2.5,0,2.5,-0.5], line => [0,2.5], conic => [-2.5,-0.5,-2.5,0,-1,0] ]
API
Graphic context properties
- alpha INTEGER
-
Sets alpha component of the brush, where 0 is fully transparent and 255 is fully opaque.
Note that premultiplication of
color
andbackColor
is not necessary as it is done internally.Default: 255
- antialias BOOLEAN
-
Turns on and off antialiased drawing on all primitives, excluding image,
pixel
, andbar_alpha
calls.It will not be possible to turn the property on if the system does not support it. Also, monochrome images won't support it as well.
- arrowHead
-
Defines the style to paint line heads on starting or ending points used to define a line or polygon. Is never used on closed shapes. If
undef
, the heads are painted with the same style aslineHead
Default value:
le::Round
. Cannot beundef
. - arrowTail
-
Defines the style to paint line tails on starting or ending points used to define a line or polygon. Is never used on closed shapes. If
undef
, the heads are painted with the same style aslineTail
; if it is alsoundef
, then the style oflineHead
is used.Default value:
undef
- backColor COLOR
-
Sets background color to the graphic context. All drawing routines that use non-solid or transparent fill or line patterns use this property value.
- color COLOR
-
Sets foreground color to the graphic context. All drawing routines use this property value.
- clipRect X1, Y1, X2, Y2
-
Selects the clipping rectangle corresponding to the physical canvas origin. On get-call, returns the extent of the clipping area, if it is not rectangular, or the clipping rectangle otherwise. The code
$d-> clipRect( 1, 1, 2, 2); $d-> bar( 0, 0, 1, 1);
thus affects only one pixel at (1,1).
Set-call discards the previous
::region
value.Note:
::clipRect
can not be used while the object is in the paint-disabled state, its context is neither recorded nor used as a template ( see "Graphic context and canvas") -- except on images. - fillMode INTEGER
-
Affects filling style of complex polygonal shapes filled by
fillpoly
. Iffm::Winding
, the filled shape contains no holes; iffm::Alternate
, holes are present where the shape edges cross.fm::Overlay
flag can be combined with these to counter an intrinsic defect of filled shaped both in Win32 and X11 that don't exactly follow polygon vertices. When supplied, it overlays a polygon over the filled shape, so that the latter falls exactly in the boundaries defined by vertices. This is desirable when one wants the shape to be defined exactly by polygon vertices, but is not desirable when a shape has holes in it and is connected in a way that the polygon overlay may leave visible connection edges over them.Default value:
fm::Winding|fm::Overlay
- fillPattern ( [ @PATTERN ] ) or ( fp::XXX ) or IMAGE
-
Selects 8x8 fill pattern that affects primitives that plot filled shapes: bar(), fill_chord(), fill_ellipse(), fillpoly(), fill_sector(), floodfill().
Accepts either a
fp::
constant or a reference to an array of 8 integers, or an image reference. In all cases, except where the image is colored, treats 0s in the pattern as the currently selectedbackColor
, and 1s ascolor
. Whenrop2
is set torop::NoOper
, treats 0s as fully transparent pixels. Additionally, in the render mode respects thealpha
property.Note: Drawing over monochome bitmap or image will not respect its
rop
on Win32.Depending on the parameters, treats the input as follows:
- fp:: constant
-
There are some predefined patterns, that can be referred via
fp::
constants:( the actual patterns are hardcoded in api/api.c ) The default pattern is fp::Solid.
On a get-call, does not return the
fp::
value but the corresponding array (see below). If a constant value is needed to be recovered, usefp::builtin
function that would return the constant from the array. There is also two shortcut functions,fp::is_solid
andfp::is_empty
that check if the fill pattern is all-ones or all-zeros, correspondingly. - Array
-
Wants an 8-item array where each item is a byte value, representing 8 bits of each line in a pattern. The first integer is the topmost pattern line, and the bit 0x80 is the leftmost pixel in the line.
An example below shows encoding of fp::Parquet pattern:
# 76543210 84218421 Hex 0 $ $ $ 51 1 $ $ 22 2 $ $ $ 15 3 $ $ 88 4 $ $ $ 45 5 $ $ 22 6 $ $ $ 54 7 $ $ 88 $d-> fillPattern([ 0x51, 0x22, 0x15, 0x88, 0x45, 0x22, 0x54, 0x88 ]);
- Monochrome image
-
Like the array above, wants an image consisting of 0s and 1s where these would represent canvas'
backColor
andcolor
, correspondinly, when rendered. In the same fashion, whenrop2
is set torop::NoOper
, zeros will be treated as transparent pixels. - Color image
-
Ignores color, and backColor, and rop2. Just uses the tiles and the current
alpha
value. - Icon
-
Ignores color, backColor, and rop2. Uses the alpha pixel values from the icon's mask and the current
alpha
value.
- fillPatternOffset X, Y
-
Origin coordinates for the
fillPattern
. Image patterns origin (0,0) is system-dependent. - font \%FONT
-
Manages font context. FONT hash acceptable values are
name
,height
,size
,width
,style
andpitch
.Synopsis:
$d-> font-> size( 10); $d-> font-> name( 'Courier'); $d-> font-> set( style => $x-> font-> style | fs::Bold, width => 22 );
See "Fonts" for the detailed descriptions.
Applies to text_out(), get_text_width(), get_text_box(), get_font_abc(), get_font_def(), render_glyph().
- font_mapper
-
Returns a font mapper object that provides interface to fonts collection used for substitution in polyfont shaping (see "text_shape"). The fonts can be accessed there either by their font hash (name and style only, currently), or the font's corresponding index.
There are two font lists used in the substitution mechanism, passive and active. The passive font list is initiated during the toolkit start and is never changed. Each font there is addressed by an index. When the actual search for a glyph is initiated, these fonts are queried in the loop and are checked if they contain the required glyphs. These queries are also cached, so that next time lookups run much quicker. That way, an
active
font list is built, and next substitutions use it before trying to look into the passive list. Since the ordering of fonts is system based, and is rather random, some fonts may not be a good or aesthetic substitution. Therefore the mapper can assist in adding or removing particular fonts to the active list, potentially allowing an application to store and load user-driven selection of substitution fonts.The following methods are available on the font mapper object:
- activate %FONT
-
Adds the FONT into the active substitution list if the font is not disabled
- get INDEX
-
Returns the font hash registered under INDEX
- count
-
Returns number of all fonts in the collection
- index
-
Returns what index is assigned to the currently used font, if any
- passivate %FONT
-
Remove the font from the active substitution list
- is_active %FONT
-
Returns whether the font is in the active substitution list or not
- enable %FONT
-
Enables the font entry, the font will be considered for the polyfont lookup
- disable %FONT
-
Disables the font entry, the font will not be considered for the polyfont lookup
- is_enabled %FONT
-
Returns whether the font is enabled or not
- lineHead
-
Defines the style to paint line heads in patterned lines only, on line segments that do not lie on line starting or ending points used to define a line or polygon.
Default value:
undef
- lineEnd VALUE
-
Selects a line ending cap for plotting primitives. VALUE can be one of
constants,
undef
, a custom line end description, or an array of four where each entry is one of the values above.The
undef
value is only accepted in the array syntax, and not for the index 0 ("lineHead"). The other indexes behave differently if are set toundef
- see more in "lineTail", "arrowHead", "arrowTail", "lineEndIndex".le::Round
is the default value.See also: "Custom line end styles".
- lineEndIndex INDEX, VALUE
-
Same as
lineEnd
except only addresses a single line ending style.Allows VALUE to be
undef
for indexes greater than 0; depending on the index, the line style will be different ( see more in "lineTail", "arrowHead", "arrowTail" ).Allows special INDEX values or'ed with
le::Only
, that behave differently if the line end style isundef
: while normal INDEX queries may returnundef
, or possibly affect neighbor indexing (if these are, in turn,undef
s), the calls with thele::Only
bit set never returnundef
on get-calls, and never affect neighbor styles on set-calls.The following lookup rules are used if a line end style is undef:
lei::LineTail - can never be undef lei::LineHead - if undef, same as lei::LineTail lei::ArrowTail - if undef, same as lei::LineTail lei::ArrowHead - if undef, same as lei::LineHead, and if it also is undef, then same as lei::LineTail
- lineJoin VALUE
-
Selects a line joining style for polygons. VALUE can be one of
constants. lj::Round is the default value.
- linePattern PATTERN
-
Selects a line pattern for plotting primitives. PATTERN is either a predefined
lp::
constant, or a string where each even byte is a length of a dash, and each odd byte is a length of a gap.The predefined constants are:
Not all systems are capable of accepting user-defined line patterns, and in such situation the
lp::
constants are mapped to the system-defined patterns. In Win9x, for example, lp::DashDotDot is much different from its string definition. This however is only actual for lines with width=0, as wider lines are rendered by the Prima internal code.Default value is lp::Solid.
- lineTail
-
Defines the style to paint line tails in patterned lines only, on line segments that do not lie on line starting or ending points used to define a line or polygon. If
undef
, line tails are painted with the same style aslineHead
.Default value:
undef
- lineWidth WIDTH
-
Selects a line width for plotting primitives. If a VALUE is 0, then a cosmetic pen is used - the thinnest possible line that a device can plot. If a VALUE is greater than 0, then a geometric pen is used - the line width is set in device units. There is a subtle difference between VALUE 0 and 1 in a way the lines are joined.
Default value is 0.
- matrix [A,B,C,D,X,Y] | Prima::Matrix
-
Sets current matrix transformation that is used in all plotting operations except
clipRect
andregion
. Returns a "Matrix" in Prima object.Default value is (1,0,0,1,0,0) or
Prima::matrix::identity
.See also: "Prima::matrix" in Prima::types and
Prima::types/Prima::Matrix
. - miterLimit VALUE
-
When path segments connect at a sharp angle, a miter join results in a spike that extends well beyond the connection point. The purpose of the miter limit is to cut off such spikes when they become objectionably long. At any given corner, the miter length is the distance from the point at which the inner edges of the stroke intersect to the point at which the outside edges of the strokes intersect-in other words, the diagonal length of the miter. This distance increases as the angle between the segments decreases. If the ratio of the miter length to the line width exceeds the miter limit parameter, stroke treats the corner with a bevel join instead of a miter join. The ratio of miter length to line width is directly related to the angle j between the segments by the formula:
r = 1/sin(j/2)
Default value is 10.0.
Assuming line join is
lj::Miter
and line angle is 30 degrees: - palette [ @PALETTE ]
-
Selects solid colors in a system palette, as many as possible. PALETTE is an array of integer triplets, where each is R, G and B component. The call
$d-> palette([128, 240, 240]);
selects a gray-cyan color, for example.
The return value from get-call is the content of the previous set-call, not the actual colors that were copied to the system palette.
- region OBJECT
-
Selects a clipping region applied to all drawing and painting routines. On setting, the OBJECT is either undef, then the clip region is erased ( no clip ), or a Prima::Image object with a bit depth of 1. The bit mask of OBJECT is applied to the system clipping region. Or, it is a Prima::Region object. If the OBJECT is smaller than the drawable, its exterior is assigned to clipped area as well. Discards the previous
::clipRect
value; successive get-calls to::clipRect
return the boundaries of the region.On getting, OBJECT is either undef or Prima::Region object.
Note:
::region
can not be used while the object is in the paint-disabled state, its context is neither recorded nor used as a template ( see "Graphic context and canvas"). - resolution X, Y
-
A read-only property. Returns horizontal and vertical device resolution in dpi.
- rop OPERATION
-
Selects raster operation that applies to foreground color plotting routines.
See also:
::rop2
, "Raster operations". - rop2 OPERATION
-
Selects raster operation that applies to background color plotting routines.
See also:
::rop
, "Raster operations". - textOpaque FLAG
-
If FLAG is 1, then text_out() fills the text background area with
::backColor
property value before drawing the text. Default value is 0, when text_out() plots text only.See get_text_box().
- textOutBaseline FLAG
-
If FLAG is 1, then text_out() plots text on a given Y coordinate correspondent to font baseline. If FLAG is 0, a Y coordinate is mapped to font descent line. Default is 0.
- translate X_OFFSET, Y_OFFSET
-
Translates the origin point by X_OFFSET and Y_OFFSET. Does not affect
::clipRect
and::region
. Not cumulative, so the call sequence$d-> translate( 5, 5); $d-> translate( 15, 15);
is equivalent to
$d-> translate( 15, 15);
Note:
::translate
can not be used while the object is in the paint-disabled state, its context is neither recorded nor used as a template ( see "Graphic context and canvas").
Other properties
- height HEIGHT
-
Selects the height of a canvas.
- size WIDTH, HEIGHT
-
Selects the extent of a canvas.
- width WIDTH
-
Selects the width of a canvas.
Graphic primitives methods
- arc X, Y, DIAMETER_X, DIAMETER_Y, START_ANGLE, END_ANGLE
-
Plots an arc with center in X, Y and DIAMETER_X and DIAMETER_Y axes from START_ANGLE to END_ANGLE.
Context used: color, backColor, lineEnd, linePattern, lineWidth, miterLimit, rop, rop2
- bar X1, Y1, X2, Y2
-
Draws a filled rectangle within (X1,Y1) - (X2,Y2) extents.
Context used: color, backColor, fillPattern, fillPatternOffset, rop, rop2
- bar_alpha ALPHA <X1, Y1, X2, Y2>
-
Fills rectangle in the alpha channel, filled with ALPHA value (0-255) within (X1,Y1) - (X2,Y2) extents. Can be called without parameters, in this case fills all canvas area.
Has only effect on layered surfaces.
- bars @RECTS
-
Draws a set of filled rectangles. RECTS is an array of integer quartets in format (X1,Y1,X2,Y2).
Context used: color, backColor, fillPattern, fillPatternOffset, rop, rop2
- chord X, Y, DIAMETER_X, DIAMETER_Y, START_ANGLE, END_ANGLE
-
Plots an arc with center in X, Y and DIAMETER_X and DIAMETER_Y axes from START_ANGLE to END_ANGLE and connects its ends with the straight line.
Context used: color, backColor, lineEnd, linePattern, lineWidth, miterLimit, rop, rop2
- clear <X1, Y1, X2, Y2>
-
Draws rectangle filled with pure background color within (X1,Y1) - (X2,Y2) extents. Can be called without parameters, in this case fills all canvas area.
Context used: backColor, rop2
- draw_text CANVAS, TEXT, X1, Y1, X2, Y2, [ FLAGS = dt::Default, TAB_INDENT = 1 ]
-
Draws several lines of text one under another with respect to align and break rules, specified in FLAGS and TAB_INDENT tab character expansion.
draw_text
is a convenience wrapper aroundtext_wrap
for drawing the wrapped text, and also provides the tilde ( ~ )- character underlining support.The FLAGS is a combination of the following constants:
dt::Left - text is aligned to the left boundary dt::Right - text is aligned to the right boundary dt::Center - text is aligned horizontally in center dt::Top - text is aligned to the upper boundary dt::Bottom - text is aligned to the lower boundary dt::VCenter - text is aligned vertically in center dt::DrawMnemonic - tilde-escapement and underlining is used dt::DrawSingleChar - sets tw::BreakSingle option to Prima::Drawable::text_wrap call dt::NewLineBreak - sets tw::NewLineBreak option to Prima::Drawable::text_wrap call dt::SpaceBreak - sets tw::SpaceBreak option to Prima::Drawable::text_wrap call dt::WordBreak - sets tw::WordBreak option to Prima::Drawable::text_wrap call dt::ExpandTabs - performs tab character ( \t ) expansion dt::DrawPartial - draws the last line, if it is visible partially dt::UseExternalLeading - text lines positioned vertically with respect to the font external leading dt::UseClip - assign ::clipRect property to the boundary rectangle dt::QueryLinesDrawn - calculates and returns number of lines drawn ( contrary to dt::QueryHeight ) dt::QueryHeight - if set, calculates and returns vertical extension of the lines drawn dt::NoWordWrap - performs no word wrapping by the width of the boundaries dt::WordWrap - performs word wrapping by the width of the boundaries dt::Default - dt::NewLineBreak|dt::WordBreak|dt::ExpandTabs| dt::UseExternalLeading
Context used: color, backColor, font, rop, textOpaque, textOutBaseline
- ellipse X, Y, DIAMETER_X, DIAMETER_Y
-
Plots an ellipse with center in X, Y and DIAMETER_X and DIAMETER_Y axes.
Context used: color, backColor, linePattern, lineWidth, rop, rop2
- fill_chord X, Y, DIAMETER_X, DIAMETER_Y, START_ANGLE, END_ANGLE
-
Fills a chord outline with center in X, Y and DIAMETER_X and DIAMETER_Y axes from START_ANGLE to END_ANGLE (see chord()).
Context used: color, backColor, fillPattern, fillPatternOffset, rop, rop2
- fill_ellipse X, Y, DIAMETER_X, DIAMETER_Y
-
Fills an elliptical outline with center in X, Y and DIAMETER_X and DIAMETER_Y axes.
Context used: color, backColor, fillPattern, fillPatternOffset, rop, rop2
- fillpoly \@POLYGON
-
Fills a polygonal area defined by POLYGON set of points. POLYGON must present an array of integer pair in (X,Y) format. Example:
$d-> fillpoly([ 0, 0, 15, 20, 30, 0]); # triangle
Context used: color, backColor, fillPattern, fillPatternOffset, rop, rop2, fillMode
Returns success flag; if failed,
$@
contains the error.See also: polyline().
- fill_sector X, Y, DIAMETER_X, DIAMETER_Y, START_ANGLE, END_ANGLE
-
Fills a sector outline with center in X, Y and DIAMETER_X and DIAMETER_Y axes from START_ANGLE to END_ANGLE (see sector()).
Context used: color, backColor, fillPattern, fillPatternOffset, rop, rop2
- fill_spline \@VERTICES, %OPTIONS
-
Fills a polygonal area defined by the curve, projected by applying B-spline curve based on set of VERTICES. VERTICES must present an array of integer pair in (X,Y) format. Example:
$d-> fill_spline([ 0, 0, 15, 20, 30, 0]);
Context used: color, backColor, fillPattern, fillPatternOffset, rop, rop2
Returns success flag; if failed,
$@
contains the error.See also: spline, render_spline
- flood_fill X, Y, COLOR, SINGLEBORDER = 1
-
Fills an area of the canvas using the current fill context. The area is assumed to be bounded as specified by the SINGLEBORDER parameter. SINGLEBORDER can be 0 or 1.
SINGLEBORDER = 0: The fill area is bounded by the color specified by the COLOR parameter.
SINGLEBORDER = 1: The fill area is defined by the color that is specified by COLOR. Filling continues outward in all directions as long as the color is encountered. This style is useful for filling areas with multicolored boundaries.
Context used: color, backColor, fillPattern, fillPatternOffset, rop, rop2
- line X1, Y1, X2, Y2
-
Plots the straight line from (X1,Y1) to (X2,Y2).
Context used: color, backColor, linePattern, lineWidth, rop, rop2
- lines \@LINES
-
LINES is an array of integer quartets in format (X1,Y1,X2,Y2). lines() plots the straight line per quartet.
Context used: color, backColor, linePattern, lineWidth, rop, rop2
Returns success flag; if failed,
$@
contains the error. - new_aa_surface
-
Returns a new antialiasing surface object for AA emulation. See Prima::Drawable::Antialias for usage and details.
- new_gradient
-
Returns a new gradient object. See Prima::Drawable::Gradient for usage and details.
- new_path
-
Returns a new path object. See Prima::Drawable::Path for usage and details.
- pixel X, Y, <COLOR>
-
::pixel is a property - on set-call it changes the pixel value at (X,Y) to COLOR, on get-call ( without COLOR ) it does return a pixel value at (X,Y).
No context is used. May return
cl::Invalid
to signal an error or the out-of-boundaries condition. - polyline \@POLYGON
-
Draws a polygonal area defined by the POLYGON set of points. POLYGON must contain an array of integer pairs in (X,Y) format.
Context used: color, backColor, linePattern, lineWidth, lineJoin, lineEnd, miterLimit, rop, rop2
Returns success flag; if failed,
$@
contains the error.See also: fillpoly().
- put_image X, Y, OBJECT, [ ROP ]
-
Draws an OBJECT at coordinates (X,Y). OBJECT must be Prima::Image, Prima::Icon or Prima::DeviceBitmap. If ROP raster operation is specified, it is used. Otherwise, value of
::rop
property is used.Returns success flag; if failed,
$@
contains the error.Context used: rop; color and backColor for a monochrome DeviceBitmap
- put_image_indirect OBJECT, X, Y, X_FROM, Y_FROM, DEST_WIDTH, DEST_HEIGHT, SRC_WIDTH, SRC_HEIGHT, ROP
-
Draws the OBJECT's source rectangle into the destination rectangle, stretching or compressing the source bits to fit the dimensions of the destination rectangle, if necessary. The source rectangle starts at (X_FROM,Y_FROM), and is SRC_WIDTH pixels wide and SRC_HEIGHT pixels tall. The destination rectangle starts at (X,Y), and is abs(DEST_WIDTH) pixels wide and abs(DEST_HEIGHT) pixels tall. If DEST_WIDTH or DEST_HEIGHT are negative, a mirroring by respective axis is performed.
OBJECT must be Prima::Image, Prima::Icon or Prima::DeviceBitmap.
No context is used, except color and backColor for a monochrome DeviceBitmap
Returns success flag; if failed,
$@
contains the error. - rect3d X1, Y1, X2, Y2, WIDTH, LIGHT_COLOR, DARK_COLOR, [ BACK_COLOR ]
-
Draws 3d-shaded rectangle in boundaries X1,Y1 - X2,Y2 with WIDTH line width and LIGHT_COLOR and DARK_COLOR colors. If BACK_COLOR is specified, paints an inferior rectangle with it, otherwise the inferior rectangle is not touched.
Context used: rop; color and backColor for a monochrome DeviceBitmap
- rect_fill X1, Y1, X2, Y2, BORDER_WIDTH, FOREGROUND, BACKGROUND
-
Draws a rectangle with outline color FOREGROUND and BORDER_WIDTH pixels, and fills it with color BACKGROUND. If FOREGROUND and/or BACKGROUND are undefined, currect colors are used. BORDER_WIDTH is 1 pixel if omitted.
Contrary to a call to
rectangle()
with line width greater than 1, never paints pixels outside the given rectange; border is painted inwards.Context used: rop, fillPattern
- rect_focus X1, Y1, X2, Y2, [ WIDTH = 1 ]
-
Draws a marquee rectangle in boundaries X1,Y1 - X2,Y2 with WIDTH line width.
No context is used.
- rect_solid X1, Y1, X2, Y2, BORDER_WIDTH, FOREGROUND
-
Draws a rectangle with outline color FOREGROUND and BORDER_WIDTH pixels. If FOREGROUND is undefined, currect color is used. BORDER_WIDTH is 1 pixel if omitted.
Contrary to a call to
rectangle()
with line width greater than 1, never paints pixels outside the given rectange; border is painted inwards.Context used: rop
- rectangle X1, Y1, X2, Y2
-
Plots a rectangle with (X1,Y1) - (X2,Y2) extents.
Context used: color, backColor, linePattern, lineWidth, rop, rop2
- sector X, Y, DIAMETER_X, DIAMETER_Y, START_ANGLE, END_ANGLE
-
Plots an arc with center in X, Y and DIAMETER_X and DIAMETER_Y axis from START_ANGLE to END_ANGLE and connects its ends and (X,Y) with two straight lines.
Context used: color, backColor, lineEnd, linePattern, lineWidth, miterLimit, rop, rop2
- spline \@VERTICES, %OPTIONS
-
Draws a B-spline curve defined by set of VERTICES control points. VERTICES must present an array of integer pair in (X,Y) format.
The following options are supported:
- closed BOOL = undef
-
When not set, checks if the first and the last vertices point to the same point, and if yes, assumes a closed shape. Note - a closed shape rendering is implemented by adding degree minus two points to the set; this is important if
weight
orknots
are specified. - degree INTEGER = 2
-
The B-spline degree. Default is 2 (quadratic). Number of points supplied must be at least degree plus one.
- knots \@INTEGERS
-
Array of integers, number of points plus degree plus one, which makes the result a Bezier curve. By default, if the shape is opened (i.e. first and last points are different), is set to represent a clamped array, so that the first and last points of the final curve match the first and the last control points. If the shape is closed, set to represent an unclamped array, so that no control points lie directly on the curve.
- precision INTEGER = 24
-
Defines number of steps to split the curve into. The value is multiplied to the number of points and the result is used as number of steps.
- weight \@INTEGERS = [ 1, 1, 1, ... ]
-
Array of integers, one for each point supplied. Assigning these can be used to convert B-spline into a NURBS. By default set of ones.
Context used: color, backColor, linePattern, lineWidth, lineEnd, miterLimit, rop, rop2
See also: fill_spline, render_spline.
- stretch_image X, Y, DEST_WIDTH, DEST_HEIGHT, OBJECT, [ ROP ]
-
Draws the OBJECT on the destination rectangle, stretching or compressing the source bits to fit the dimensions of the destination rectangle, if necessary. If DEST_WIDTH or DEST_HEIGHT are negative, a mirroring is performed. The destination rectangle starts at (X,Y) and is DEST_WIDTH pixels wide and DEST_HEIGHT pixels tall.
If ROP raster operation is specified, it is used. Otherwise, value of
::rop
property is used.OBJECT must be Prima::Image, Prima::Icon or Prima::DeviceBitmap.
Returns success flag; if failed,
$@
contains the error.Context used: rop
- text_out TEXT, X, Y
-
Draws TEXT string at (X,Y). TEXT is either character string, or a
Prima::Drawable::Glyphs
object returned fromtext_shape
, orPrima::Drawable::Glyphs->glyphs
strings of glyphs.Returns success flag; if failed,
$@
contains the error.Context used: color, backColor, font, rop, textOpaque, textOutBaseline
- text_shape TEXT, %OPTIONS
-
Converts TEXT into set of glyphs, returns either a
Prima::Drawable::Glyphs
object, or a0
integer when shaping is not necessary, orundef
as an error.When Prima is compiled with
libfribidi
, the method runs unicode bidirectional algorithm on TEXT that properly positions embedded directional text (f.ex. a latin quote inside an arabic text), see Unicode Standard Annex #9 for the details. Without the library only does minimal RTL alignment.Glyphs returned are positioned according to RTL directions given in TEXT using characters from unicode block "General Punctuation U+2000 .. U+206F". Additionally, character ligation may be performed so that one or more characters are represented by one or more glyphs. Such syntactic units, clusters, are adopted in Prima where appropriate, instead of character units, for selection, navigation etc in f.ex.
Prima::InputLine
andPrima::Edit
. Helper routines that translate clusters, glyphs, and characters into each other are found in Prima::Drawable::Glyphs.Options recognized:
- advances BOOLEAN = false
-
Shaping process may or may not fill integer array of advances and positions for each glyphs, depending on the implementation. The advances are needed to represent f.ex. combining graphemes, when TEXT consisting of two characters,
"A"
and combining grave accent U+300 should be drawn as a single À cluster but are represented by two glyphs"A"
and"`"
. The grave glyph has its own advance for standalone usage, but in this case it should be ignored, and that is achieved by filling advance table where the"A"
advance is the normal glyph advance, whereas the advance of the"`"
is zero. Also, the position table additionally shifts glyph position by X and Y coordinates, when that is needed (f.ex. it might be positioned differently by the vertical axis on"a"
and"A"
).Setting this options to
true
will force fill advance and positioning tables. These tables can be manipulated later, and are respected bytext_out
andget_text_width
. - language STRING = undef
-
When set, shaping process can take in the account the language of the text. F.ex. text
"ae"
might be shaped as a single glyph æ for the Latin language, but never for the English. - level INTEGER = ts::Full
-
Selects the shaping (i.e. text to glyph conversion) level, how the system should treat the input text and how deep the shaping should go.
One of the following
ts::XXX
options:- ts::Bytes
-
Treats input text as non-unicode locale-specific codepoints, characters higher than 255 are treated as chr(255). Reordering never happens, font substitution never happens, kerning and ligation never happens; returns glyph indexes in a 1:1 mapping for each codepoint.
- ts::None
-
Performs quick null shaping without mapping to the font glyphs, but only running bidirectional algorithm on the text. On the return,
glyphs
, as well as eventualadvances
andpositions
, are filled with zeros, butindexes
are filled with the proper character offsets, effectively making it a visual-to-logical map since the number of glyphs will always be equal to the number of characters in TEXT, because ligation never happens here (except when TEXT contains unicode directional characters such as isolates etc - those are removed from the output).By default, advances and positions are not filled, but if the
advances
option is set, fills them with zeros. - ts::Glyphs
-
Applies the unicode bidi algorithm and maps the result onto font glyphs. Ligation and kerning doesn't happen here, it's basically same as
ts::None
but with the glyph mapping part.By default, advances and positions are not filled, but if
advances
option is set, fills the advances array with character glyph advances and the positions array with zeros.May fill the
fonts
array if thepolyfont
option is set. - ts::Full
-
Applies the unicode bidi algorithm, and runs the full shaping on the result. Ligation and kerning may occur. Always fills the advances and positions array; the
advances
option is ignored.If the system or the selected font does not support shaping, tries to ligate known arabic shapes using the fribidi library, if available. Also in this case does not return the advances and positions by default, but if
advances
option is set, fills the advances array with character glyph advances and the positions array with zeros.May fill the
fonts
array if thepolyfont
option is set.
- pitch INTEGER
-
When the
polyfont
is set (default) and thus font substitution is desired, filters only fonts that matchpitch
, eitherfp::Variable
orfp::Fixed
. By default will be set tofp::Fixed
if the current for is monospaced, but tofp::Default
matching all fonts, otherwise. - polyfont BOOLEAN = true
-
If set, scans if the currently selected font supports all unicode points, and if not, selects a substitutions from a pre-populated list, taking into account the font pitch (see
pitch
above). In cases where the current font has not enough glyphs to shape all the requested unicode points, font substitution is performed, and the result contains an extra arrayfonts
(see "fonts" in Prima::Drawable::Glyphs). When the current font has all needed glyphs, the fonts array is not created.The font list access is available through "font_mapper".
Valid only with shaping levels
ts::Glyphs
andts::Full
. - reorder BOOLEAN = true
-
When set, unicode bidi algorithm is used to reorder codepoints, and additionally RTL codepoints may be reversed (depending on direction context).
When unset, no such reordering occurs, to emulate as much as possible a behavior that each text grapheme is being mapped to a glyph cluster exactly as it occurs in the input text, from left to right. Note that bidi reordering still may occur internally, since system shapers may reverse placement of RTL characters, so that the Prima reordering is needed to cancel this. In theory the caller shouldn't see the difference as these should cancel each other, but if Prima miscalculates the expected way the system shaper does the bidi processing, it might.
A similar effect can be reached by prepending the text with U+202D (LEFT-TO-RIGHT OVERRIDE).
- replace_tabs INTEGER = -1
-
If set to 0 or more, replaces tabs by spaces width widths multiplied by the option value. Since it needs advances to operate, automatically sets the
advances
option. If the string passed indeed contains tab characters, also turns offskip_if_simple
option.Note: if using the result later in
text_wrap
, set thetabIndent
parameters there to 1 to avoid double multipliciaton of the tab character width. - rtl BOOLEAN
-
If set to 1, default text direction is assumed as RTL, and as LTR if set to 0. If unset, the text direction is taken from "textDirection" in Prima::Application.
- skip_if_simple BOOLEAN = false
-
When set, checks whether the shaping result is identical to the input, in a sense that a call to
text_out(TEXT)
and a call totext_shape_out(TEXT)
produce identical results. Majority of english text will fall into that category, and when that indeed happens, returns integer value0
instead of a glyph object.
See also
text_shape_out
,get_text_shape_width
,text_wrap_shape
. - text_shape_out TEXT, X, Y[, RTL]
-
Runs shaping on TEXT character string with the RTL flag (or
$::application->textDirection
. Draws the resulting glyph string at (X,Y).Returns success flag; if failed,
$@
contains the error.Context used: color, backColor, font, rop, textOpaque, textOutBaseline
Methods
- begin_paint
-
Enters the enabled ( active paint ) state, returns success flag; if failed,
$@
contains the error. Once the object is in enabled state, painting and drawing methods can perform write operations on a canvas.See also:
end_paint
,begin_paint_info
, "Graphic context and canvas" - begin_paint_info
-
Enters the information state, returns success flag; if failed,
$@
contains the error. The object information state is same as enabled state ( seebegin_paint
), except painting and drawing methods do not change the object canvas.See also:
end_paint_info
,begin_paint
, "Graphic context and canvas" - can_draw_alpha
-
Returns whether using alpha bits operation on the drawable will have any effect or not. Note that the drawable may not necessarily have an alpha channel, for example a normal RGB image is capable to be painted on with alpha while not having any alpha on its own. On unix, all non-1 bit drawables return true if Prima was compiled with XRender support and if that extension is present on the X server. On windows, all non-1 bit drawables return true unconditionally.
See also:
has_alpha_layer
- end_paint
-
Exits the enabled state and returns the object to a disabled state.
See also:
begin_paint
, "Graphic context and canvas" - end_paint_info
-
Exits the information state and returns the object to a disabled state.
See also:
begin_paint_info
, "Graphic context and canvas" - font_match \%SOURCE, \%DEST, PICK = 1
-
Performs merging of two font hashes, SOURCE and DEST. Returns the merge result. If PICK is true, matches the result with a system font repository.
Called implicitly by
::font
on set-call, allowing the following example to work:$d-> font-> set( size => 10); $d-> font-> set( style => fs::Bold);
In the example, the hash 'style => fs::Bold' does not overwrite the previous font context ( 'size => 10' ) but gets added to it ( by font_match()), providing the resulting font with both font properties set.
- fonts <FAMILY = "", ENCODING = "">
-
Member of
Prima::Application
andPrima::Printer
, does not present inPrima::Drawable
.Returns an array of font metric hashes for a given font FAMILY and ENCODING. Every hash has full set of elements described in "Fonts".
If called without parameters, returns an array of same hashes where each hash represents a member of font family from every system font set. It this special case, each font hash contains additional
encodings
entry, which points to an array of encodings available for the font.If called with FAMILY parameter set but no ENCODING is set, enumerates all combinations of fonts with all available encodings.
If called with FAMILY set to an empty string, but ENCODING specified, returns only fonts that can be displayed with the encoding.
Example:
print sort map {"$_->{name}\n"} @{$::application-> fonts};
- get_bpp
-
Returns device color depth. 1 is for black-and-white monochrome, 24 for true color, etc.
- get_font_abc FIRST_CHAR = -1, LAST_CHAR = -1, UNICODE = 0
-
Returns ABC font metrics for the given range, starting at FIRST_CHAR and ending with LAST_CHAR. If parameters are -1, the default range ( 0 and 255 ) is assumed. UNICODE boolean flag is responsible of representation of characters in 127-255 range. If 0, the default, encoding-dependent characters are assumed. If 1, the U007F-U00FF glyphs from Latin-1 set are used.
The result is an integer array reference, where every character glyph is referred by three integers, each triplet containing A, B and C values.
For detailed explanation of ABC meaning, see "Font ABC metrics";
Context used: font
- get_font_def FIRST_CHAR = -1, LAST_CHAR = -1, UNICODE = 0
-
Same as
get_font_abc
, but for vertical metrics. Is expensive on bitmap fonts, because to find out the correct values Prima has to render glyphs on bitmaps and scan for black and white pixels.Vector fonts are not subject to this, and the call is as effective as
get_font_abc
. - get_font_languages
-
Returns array of ISO 639 strings that can be displayed using glyphs available in the currently selected font.
- get_font_ranges
-
Returns array of integer pairs denoting unicode indices of glyphs covered by the currently selected font. Each pair is the first and the last index of a contiguous range.
Context used: font
- get_nearest_color COLOR
-
Returns a nearest possible solid color in representation of the graphic device. Always returns same color if the device bit depth is equal or greater than 24.
- get_paint_state
-
Returns paint state value on of ps:: constants -
ps::Disabled
if the object is in the disabled state,ps::Enabled
for the enabled state,ps::Information
for the information state.For brevity, mb::Disabled is equal to 0 so this allows for simple boolean testing whether one can get/set graphical properties on an object.
See "Graphic context and canvas" for more.
- get_physical_palette
-
Returns an array of integers in (R,G,B) format, where each color entry is in the 0 - 255 range.
The physical palette array is non-empty only on paletted graphic devices, the true color devices return an empty array.
The physical palette reflects the solid colors currently available to all programs in the system. The information is volatile if the system palette can change colors, since any other application may request to change the system colors at any moment.
- get_text_shape_width TEXT, [ FLAGS ]
-
Runs shaping on TEXT character string with text direction either taken from
FLAGS & to::RTL
value, or from the or$::application->textDirection
. Returns the shaping result width as if it would be drawn using currently selected font.If
FLAGS & to::AddOverhangs
is set, the first character's absolute A value and the last character's absolute C value are added to the string if they are negative. - get_text_width TEXT, ADD_OVERHANG = 0
-
Returns TEXT string width if it would be drawn using currently selected font. TEXT is either a character string, or a
Prima::Drawable::Glyphs
object returned fromtext_shape
, orPrima::Drawable::Glyphs-> glyphs
glyph string.If ADD_OVERHANG is 1, the first character's absolute A value and the last character's absolute C value are added to the string if they are negative.
See more on ABC values at "Font ABC metrics".
Context used: font
- get_text_box TEXT
-
Returns TEXT string extensions if it would be drawn using currently selected font. TEXT is either a character string, or a
Prima::Drawable::Glyphs
object returned fromtext_shape
, orPrima::Drawable::Glyphs-> glyphs
glyph string.The result is an anonymous array of 5 points ( 5 integer pairs in (X,Y) format). These 5 points are offsets for the following string extents, given the string is plotted at (0,0):
1: start of string at ascent line ( top left )
2: start of string at descent line ( bottom left )
3: end of string at ascent line ( top right )
4: end of string at descent line ( bottom right )
5: concatenation point
The concatenation point coordinates (XC,YC) are coordinated passed to consequent text_out() call so the conjoint string would plot as if it was a part of TEXT. Depending on the value of the
textOutBaseline
property, the concatenation point is located either on the baseline or on the descent line.Context used: font, textOutBaseline
- graphic_context %GC, $CALLBACK
-
A shortcut method that saves the graphic context, applies changes in %GC, calls $CALLBACK, and finally restores the context. F ex:
$self->graphic_context( fillPattern => fp::Solid, sub { $self-> bar(..) } );
- graphic_context_pop
-
Restores the graphic context properties from the stack.
- graphic_context_push
-
Saves the graphic context properties on the stack.
- has_alpha_layer
-
Returns true if the drawable has an alpha channel. If the drawable is treated as a source, it means its alpha content will be respected when drawing on another surface. If the drawable is treated as a destination, it means that its alpha content will be updated if drawing on it uses alpha bits.
See also:
can_draw_alpha
. - render_glyph INDEX, %OPTIONS
-
Returns glyph representation as an outline. The outline is an integer array, formed as a set of plotting commands. Each command is a
ggo::
constant, followed by number of points, followed by the 2D point coordinates in 1/64 pixels.Options recognized:
- glyph BOOL
-
If set, INDEX is treated as the glyph index rather than character index. Default is false.
- hints BOOL
-
Is set, hinting is enabled. Default is true.
- unicode BOOL
-
If set, INDEX is treated as a utf8 character index, otherwise a locale-specific index. Default is false.
The
ggo::
commands are:ggo::Move - move point ggo::Line - plot line ggo::Conic - plot 2-degree spline ggo::Cubic - plot 3-degree spline
- render_pattern IMAGE|ICON|ARRAY|INDEX, %OPTIONS
-
Takes a fill pattern represented by one of
fp::XXX
constant, an array of 8 bytes, or an image (or icon); same syntax as infillPattern
.Uses %OPTIONS to generate a new rectangular pattern that can be used in
fillPattern
property. Since Prima does not provide an individual property that would govern specifically the matrix of a fill pattern, this method can be used to implement this functionality.Also respects
preserveType
property and if it is set, changes the resulting pattern image type back to the original type. In case where fillPattern is given by ARRAY or INDEX, always generates aim::BW
image, so it can be used both inrop2
transparent and opaque modes, like the original pattern.Options:
- color COLOR, alpha 0-255
-
If
margin
is used, pre-fills target image with this color.alpha
is used to pre-fill the target image's mask with this value, if the image is an icon. - margin XY | [ X, Y ]
-
Set margins in X and Y pixels before applying the transformation
- matrix MATRIX
-
2D matrix to transform IMAGE
- render_polyline \@POLYLINE, %OPTIONS
-
Performs calculations on POLYLINE, defined by OPTIONS. The following options are recognized:
- matrix A,B,C,D,U,V
-
If supplied, performs matrix transformation on each polyline vertex:
X' = AX + CY + U Y' = BX + DY + V
and returns the new polyline
- box BOOLEAN
-
If set, instead of polyline vertices, calculates the box extents of the polyline (either original or after the matrix transform, depending on whether
matrix
option was supplied or not), and returns 4 numerics for left,bottom,width,and height of the box enclosure. - integer BOOLEAN
-
By default the result is returned as a set of floating point numerics, however if integer results are needed, the results are transformed to integers using the int = float + ((float < 0) ? -0.5 : 0.5) formula.
- path BOOLEAN
-
If set, treats polyline as a path that will get applied
lineEnd
,lineJoin
,linePattern
,andmiterLimit
properties (either from the object or from %OPTIONS) and returns a set of commands that would represent the final shape. The commands are: arc (6 arguments, same as thearc
primitive), line with 1 argument, a polyline array (respects theinteger
option), and open with no arguments.See "widen" in Prima::Drawable::Path for usage. See also
line_join_hints
below. - line_join_hints ARRAY OF INTEGERS
-
Only when the
path
option is present:Specially formatted array of indexes that hint where inside the polyline there are boundaries between points than need to override
lineJoin
and force it to belj::Miter
.See "widen" in Prima::Drawable::Path for usage.
- render_spline \@VERTICES, %OPTIONS
-
Renders B-spline curve from set of VERTICES to a polyline with given options.
The method is internally used by
spline
andfill_spline
, and is provided for cases when these are insufficient. See description of options in "spline". - text_wrap TEXT, WIDTH, OPTIONS, [TAB_INDENT = 8, FROM = 0, LENGTH = -1, GLYPHS]
-
Breaks TEXT string in chunks that must fit into WIDTH pixels wide box ( for WIDTH >= 0 ). TEXT is either character string, or a
Prima::Drawable::Glyphs
object returned fromtext_shape
, orPrima::Drawable::Glyphs->glyphs
strings of glyphs. In the glyph cases, some wrapping options are not applicable. It is possible to send both text as TEXT and its shaped representation as GLYPHS.The breaking algorithm and its result are governed by the OPTIONS integer value that is a combination of the following
tw::
constants:- tw::CalcMnemonic
-
Use 'hot key' semantics, when a character preceded by ~ has special meaning, f ex it gets underlined when used in menus. If this bit is set, the first tilde character used as an escape is not calculated, and never appears in the result apart from the escaped character.
Not applicable in glyph wrapping.
- tw::CollapseTilde
-
In addition to tw::CalcMnemonic, removes '~' character from the resulting chunks.
Not applicable in glyph wrapping.
- tw::CalcTabs
-
If set, calculates a tab ('\t') character as TAB_INDENT times space characters.
Not applicable in glyph wrapping.
- tw::ExpandTabs
-
If set, expands tab ('\t') character as TAB_INDENT times space characters.
Not applicable in glyph wrapping.
- tw::BreakSingle
-
Defines the method behavior when the text cannot be fit in WIDTH, does not affect anything else otherwise.
If set, the method returns an empty array. If unset, it returns a text broken by minimum number of characters per chunk. In the latter case, the width of the resulting text blocks will exceed WIDTH.
- tw::NewLineBreak
-
Forces creation of a new chunk after a newline character ('\n') is met. If UTF8 text is passed, unicode line break characters
0x2028
and0x2029
produce same effect as the newline character.Not applicable in glyph wrapping.
- tw::SpaceBreak
-
Forces creation of a new chunk after a space character (' ') or a tab character ('\t') are met.
Not applicable in glyph wrapping.
- tw::ReturnChunks
-
Defines the result of the text_wrap() method.
If set, the array consists of integer pairs, where each is a text offset within TEXT and its length.
If unset, the resulting array consists of text chunks.
- tw::ReturnGlyphs
-
If GLYPHS are set (only together with TEXT), this option becomes available to get the resulting chunks as sub-sets of GLYPHS.
- tw::ReturnLines
-
Equals to 0, is a mnemonic to an unset tw::ReturnChunks.
In glyph wrapping means
tw::ReturnGlyphs
. - tw::WordBreak
-
If unset, the TEXT breaks as soon as the chunk width exceeds WIDTH. If set, tries to keep words in TEXT so they do not appear in two chunks, e.g. breaks TEXT by words, not by characters.
If Prima is compiled with the libthai library, and thai text is detected, Prima uses the library to detects the word boundaries, because the Thai language does not use spaces between words. This behavior can be disabled by running Prima with
--no-libthai
.Not applicable in glyph wrapping.
- tw::ReturnFirstLineLength
-
If set,
text_wrap
proceeds until the first line is wrapped, either by width or ( if specified ) by break characters. Returns the length of the resulting line. Used for efficiency as the invertedget_text_width
function.
If OPTIONS has tw::CalcMnemonic or tw::CollapseTilde bits set, then the last scalar of the array is a special hash reference. The hash contains extra information regarding the 'hot key' underline position - it is assumed that '~' - escapement denotes the underlined character. The hash contains the following keys:
- tildeLine
-
Chunk index that contains the escaped character. Set to undef if no ~ - escape was found; the rest of the information in the hash is not relevant in this case.
- tildeStart
-
Horizontal offset of a beginning of the line that underlines the escaped character.
- tildeEnd
-
Horizontal offset of an end of the line that underlines the escaped character.
- tildeChar
-
The escaped character.
Context used: font
- text_wrap_shape TEXT, WIDTH = -1, %OPTIONS
-
Runs
text_shape
over results fromtext_wrap
call, withTEXT
,WIDTH
,$OPTIONS{options}
and$OPTIONS{tabs}
. Other%OPTIONS
are used intext_shape
call. Wheretext_wrap
returns text substrings or positions, return glyphs objects or their positions instead.When called with
tw::CalcMnemonic
options, recalculates the tilde position so it adapts to the glyph positions returned.If
$OPTIONS{kashida}
is set, performs kashida justification on the last wrapped line, using optional$OPTIONS{min_kashida}
value ( see "arabic_justify" in Prima::Drawable::Glyphs ).If
$OPTIONS{letter}
or$OPTIONS{word}
is set, performs interspace justification on all but the last wrapped line.
AUTHOR
Dmitry Karasik, <dmitry@karasik.eu.org>.
SEE ALSO
Prima, Prima::Object, Prima::Image, Prima::Region, Prima::Drawable::Path, Prima::Drawable::Glyphs