<sxg> <!-- width and height declarations --> <pixmap id="pixmap1"> <size>scaled</size> <width>16</width> <height>16</height> <gc id="pixmap1_gc1" /> </pixmap> <gc id="pixmap1_gc"> <!-- Graphic context commands --> </gc> </sxg>
After declaring one or more
gcs
inside their
pixmaps,
the
gc elements
execute commands for the graphic context specified by their
id attribute.
A gc element is a list of
commands described below.
Each list gets executed in the given order, and the
SXG file itself has a list of
gc and
render elements, which are processed
in the order of their appearance.
It's possible to have more than one appearance of a
gc element referencing the same
graphic context
id:
<sxg> <!-- ... --> <gc id="pixmap1_gc"> <!-- ... --> </gc> <render id="cell"> <!-- ... --> </render> <gc id="pixmap2_gc"> <!-- ... --> </gc> <gc id="pixmap1_gc"> <!-- ... --> </gc> <render id="main"> <!-- ... --> </render> </sxg>
This executes some graphic context commands for the graphic context “pixmap1_gc”, followed by RENDER commands for the picture “cell”, then graphic context commands for the graphic context “pixmap2_gc”, then “pixmap1_gc”, and finally some RENDER commands for the “main” picture.
The graphic context state is persistent. If, for example,
the first set of
“pixmap1_gc” commands included setting the graphic
context's
function, the second set of
“pixmap1_gc” commands starts with the graphic context
still having that
function set.
function<gc id="pixmap1_gc"> <!-- --> <function>set</function> <!-- --> </gc>
This sets the current “function” component value for the graphic context. The value must be one of the following: “clear”, “and”, “and_reverse”, “copy”, “and_inverted”, “noop”, “xor”, “or”, “nor”, “equiv”, “invert”, “or_reverse”, “copy_inverted”, “or_inverted”, “nand”, or “set”.
foreground<gc id="pixmap1_gc"> <!-- --> <foreground>.5</foreground> <!-- --> </gc>
This sets the “foreground” component value for the
graphic context.
The X protocol defines this
component value as an integer, ranging from 0 and up to the value
based on the pixmap's depth.
The value specified in
foreground ranges from 0 to 1, and gets
scaled to the appropriate range of permissible foreground values.
As described previously, the
pixmap serves as an alpha channel filter. A value of 0 is a completely
transparent pixel value, a value of 1 is a fully opaque pixel value.
A pixmap declared with a
mask element can only have a value of a 0
or a 1, since it's a 1 bit deep pixmap. A non-mask pixmap is 8 bits
deep, and a value between 0 and 1 gets scaled across the entire
8-bit deep pixmap.
background<gc id="pixmap1_gc"> <!-- --> <background>.5</background> <!-- --> </gc>
This sets the “background” component value for the
graphic context.
The X protocol defines this
component value as an integer, ranging from 0 and up to the value
based on the pixmap's depth.
The value specified in
background ranges from 0 to 1, and gets
scaled to the appropriate range of permissible background values.
As described previously, the
pixmap serves as an alpha channel filter. A value of 0 is a completely
transparent pixel value, a value of 1 is a fully opaque pixel value.
A pixmap declared with a
mask element can only have a value of a 0
or a 1.
line_width<gc id="pixmap1_gc"> <!-- --> <line_width>1</line_width> <!-- --> </gc>
This sets the “line-width” component value of the
graphic context.
Specifying the value 0 set line-width to 0.
Specifying a non-0 value scales it according to the pixmap's
size;
and if the result gets rounded off to 0, it gets increased to 1
before setting the line-width.
<line_width slim="1">1</line_width> </gc>
An optional
slim
attribute adds an additional scaling step:
line-width gets set 0 if the scaled line width
got rounded off to 1. The
line-width remains unchanged if the scaled line
width got rounded off to 2, or higher.
line_style<gc id="pixmap1_gc"> <!-- --> <line_style>on_off_dash</line_style> <!-- --> </gc>
This sets the “line-style” component value of the
graphic context. The value is one of:
“solid”,
“on_off_dash”, or
“double_dash”.
join_style<gc id="pixmap1_gc"> <!-- --> <join_style>bevel</join_style> <!-- --> </gc>
This sets the “join-style” component value of the
graphic context. The value is one of:
“miter” (default value),
“round”, or
“bevel”.
cap_style<gc id="pixmap1_gc"> <!-- --> <cap_style>round</cap_style> <!-- --> </gc>
This sets the “cap-style” component value of the
graphic context. The value is one of:
“not_last”,
“butt” (default value)
“round”, or
“projecting”.
fill_style<gc id="pixmap1_gc"> <!-- --> <fill_style /> <fill_style> <tiled>non_mask_pixmap</tiled> <x>0</x> <y>0</y> </fill_style> <fill_style> <stippled>mask_pixmap</stippled> <x>0</x> <y>0</y> </fill_style> <fill_style> <opaque_stippled>mask_pixmap</opaque_stippled> <x>0</x> <y>0</y> </fill_style> <!-- --> </gc>
This sets the “fill-style”,
“tile-stipple-x-origin”, and
“tile-stipple-y-origin”
component values of the
graphic context.
An empty fill_style element
sets the “fill-style” component to
Solid.
Otherwise, the “fill-style” component gets set
to Tiled,
Stippled, or
OpaqueStippled, with
either the “tile” or the “stipple”
component value set to specified pixmap.
The stipple pixmap must be declared with the
mask element. The tile pixmap cannot
be declared with
mask element.
The optional x and
y elements set the
“tile-stipple-x-origin”, and
“tile-stipple-y-origin” component values.
The coordinates get scaled according to the pixmap's
size.
If not specified, they default to actual (0, 0) coordinates.
clip<gc id="pixmap1_gc"> <!-- --> <clip> <pixmap>pixmap2</pixmap> <x>0</x> <y>0</y> <clipped> <line> <!-- --> </line> </clipped> </clip> <clip> <rectangle> <x>0</x> <y>0</y> <width>10</width> <height><10</height> </rectangle> <rectangle> <x>10</x> <y>10</y> <width>10</width> <height><10</height> </rectangle> <clipped> <line> <!-- --> </line> </clipped> </clip> <!-- --> </gc>
This sets the “clip-mask” component value of the graphic context, in one of two ways:
Using the id label of a
pixmap that serves as a clipping mask.
This pixmap must be declared with a
mask element.
This option sets the graphic context's
clip-mask attribute directly.
Using a list of rectangles.
Each rectangle's coordinates get scaled according to the
underlying pixmap's
size.
When a pixmap is specified,
the optional x and
y elements set the
“clip-x-origin”, and
“clip-y-origin” component values.
The coordinates get scaled according to the pixmap's
size.
If not specified, they default to actual (0, 0) coordinates.
The pixmap specified by
“pixmap” must be declared with a
mask element.
The clip
must have exactly one
clipped inner widget, which
contains a list of any widget that can appear in a
gc, except for another
clip.
The elements in clipped get executed
with the clip mask in effect, after which point the clip mask
is removed.
dashes<gc id="pixmap1_gc"> <!-- --> <dashes> <dash>1</dash> <dash>2</dash> </dashes> <!-- --> </gc>
This executes
the SetDashes X protocol command using
the
dash values.
The offset
widget defaults to 0, if not given, and
sets the “dash-offset”.
All of these values get scaled according to the pixmap's
size.
line<gc id="pixmap1_gc"> <!-- --> <line> <point> <x>0</x> <y>0</y> </point> <point> <x>5</x> <y>5</y> </point> <point> <x>0</x> <y>10</y> </point> </line> <!-- --> </gc>
This executes
the PolyLine X protocol command using
the
point coordinates.
All of these coordinates get scaled according to the pixmap's
size.
<gc id="pixmap1_gc"> <!-- --> <line> <fill>convex</fill> <point> <x>0</x> <y>0</y> </point> <point> <x>5</x> <y>5</y> </point> <point> <x>0</x> <y>10</y> </point> </line> <!-- --> </gc>
An optional
fill executes the
the FillPoly X protocol instead of
PolyLine.
The
fill specifies either
“complex”
“nonconvex” or
“convex”. This sets the
shape command parameter.
fill and clear<gc id="pixmap1_gc"> <!-- --> <fill> <x>0</x> <y>0</y> <width>10</width> <height>10</height> </fill> <!-- --> <clear /> </gc>
fill
executes
the PolyFillRectangle X protocol command for
one rectangle specified by the coordinates.
All of these coordinates
get scaled according to the pixmap's
size.
clear is a shorthand for a
fill that covers the entire pixmap.
This is helpful in clearing
scaled pixmaps.
Since clear is really a
fill, the
function must be set to
“clear” to actually clear the pixmap.
fill_arc_mode<gc id="pixmap1_gc"> <!-- --> <fill_arc_mode>pie_slice</fill_arc_mode> <!-- --> </gc>
This sets the “arc-mode” component value of the
graphic context. The value is either
“chord” or
“pie_slice”.
arcs<gc id="pixmap1_gc"> <!-- --> <arcs> <fill /> <!-- optional --> <arc> <x>0</x> <y>0</y> <width>9</width> <height>9</height> <angle1>45</angle1> <angle2>90</angle2> </arc> <arc> <x>5</x> <y>5</y> <width>9</width> <height>9</height> <angle1>45</angle1> <angle2>90</angle2> </arc> </arcs> <!-- --> </gc>
This executes either
the PolyArc or the
PolyFillArc protocol command,
depending on whether the
<fill/> element exists.
Each arc's coordinates get scaled according to the pixmap's
size.
The angles are specified in degrees, and SXG takes care of scaling it by 64, as defined by the X protocol.
Without the <fill/> option LibCXX Widget Toolkit
calculates coordinates based on the
center of virtually-scaled pixels.
The <fill/> option interprets the coordinates
as a bounding box.
<sxg> <width>10</width> <height>10</height> <!-- --> <arcs> <arc> <x>0</x> <y>0</y> <width>9</width> <height>9</height> <angle1>0</angle1> <angle2>360</angle2> </arc> </arcs>
This defines a virtual cartesian coordinate space of 10x10 pixels,
and draws a full circle within the coordinates defined by
(x, y) and
(x+width,w
y+height);
or (0, 0) through (9, 9), the entire size of the virtual
10x10 cartesian coordinate space.
The arc's coordinates are based on the center of the
virtual (0, 0) and (9, 9) pixel, and the default
line_width
of 1 means that, for example, the sides of the arc extend half a
pixel from the center of the virtual coordinate, and fully
touch the bounding box. With a 3:1 scale the
drawn line becomes three pixels thick; and with the circle boundary is
anchored at the centerpoint of the scaled pixel, the drawn circle
once again touches the sides of the image.
Filling this arc requires specifying the coordinates as a bounding box:
<arcs> <fill /> <arc> <x>0</x> <y>0</y> <width>10</width> <height>10</height> <angle1>0</angle1> <angle2>360</angle2> </arc> </arcs>
This draws the arc within the boundaries of the 10x10 virtual rectangle, anchored at the top-left corner of pixel (0, 0).
LibCXX Widget Toolkit also makes an additional, final adjustment to the size of the
drawn arc.
The underlying X Protocol's
PolyArc and
PolyFillArc commands' arcs specify
the bounding rectangle of pixels (x,y) through (x+width,x+height)
inclusively. So, a circle 50 pixels across and tall gets specified
by an actual width and height of 49 (indicating fifty pixels starting
with x and ending with pixel x+49, across, same for height).
The SXG image only needs to specify the coordinates based on the centerpoints of virtual pixels, and the scaled adjusted width and height gets calculated accordingly.