Index
SXG is an XML-based file format. LibCXX Widget Toolkit uses SXG to draw scalable icons and other widgets. LibCXX Widget Toolkit uses its own custom icon file format for the following reasons:
No dependencies on other libraries. External libraries to render SVG files have a large number of dependencies that pull in a large number of auxiliary libraries from other toolkits.
The SXG format maps directly into X protocol and RENDER extension commands that draw graphics. LibCXX Widget Toolkit does not do any rendering itself, but simply translates the instructions in the SXG file into X protocol commands. The following documentation assumes working knowledge of the X protocol and RENDER extension commands and data structures.
SXG provides scaling hints specifying scaling increments to avoid display artifacts from rounding due to scaling to arbitrary sizes.
SXG images can reference colors and fonts from the current display theme.
<sxg> <width>16</width> <height>16</height> <widthmm>10</widthmm> <heightmm>10</widthmm> <!-- <depth>1</depth> --> <!-- optional --> <widthfactor>2</widthfactor> <heightfactor>2</heightfactor> <!-- font declaration --> <!-- pixmap and picture declaration --> <!-- gc and render instructions --> </sxg>
The top level sxg
element defines:
Dimensions of the virtual cartesian coordinate space of the SXG file. The drawing instructions in the rest of the file get specified using these dimensions.
The above example specifies that this SXG file gives drawing instructions on a canvas that's 16 virtual pixels across, and 16 virtual pixels tall. The X and Y coordinates, therefore, range from 0 to 15. Coordinate (0, 0) is the top left corner.
LibCXX Widget Toolkit computes the SXG's image actual size, in pixels, then scales the coordinates in the SXG file to the displayed image's actual size. For example, if LibCXX Widget Toolkit needs to scale the above image to a 32x32 icon, all coordinates in the SXG file get effectively doubled.
The coordinates in the SXG file can be fractional (i.e., fill
a rectangle
8.5 pixels wide, and this
dimension gets scaled appropriately). However, it's better to use
the smallest
virtual coordinate space that's large enough to represent all points
as whole numbers,
The individual drawing instructions' coordinates may be fractional,
but the width
and
height
elements must specify integer
values.
The widthmm
and
heightmm
elements give the default,
or nominal, size of the image in the SXG file.
The dimensions are in millimeters. The values may be fractional,
but they compute an integer pixel value according to the
screen display's resolution.
For example, with the default SXG size given as ten millimeters wide and tall, a screen display with the resolution of 2.5 pixels per millimeter produces the nominal SXG size of 25x25 pixels, and the all coordinates in the SXG file get scaled accordingly.
Optional elements widthfactor
and
heightfactor
default to 1.
The nominal width and height gets rounded off to an even multiple
of pixels specified by this value.
For example, setting both to 2 ensures that the default image width
and height is always an even number of pixels.
Some special-purpose SXG icons have a
depth
element with a value of
1
. This creates a one-bit deep image that's
typically used to create a masking image of some kind.
This is used to create a masking picture, such as the mask for dithering disabled widgets.
The font
elements specify the
fonts used by text pictures.
The pixmap
and
picture
elements create pixmaps
and picture objects used in drawing the SXG image.
These elements directly correspond to X protocol's pixmap and
RENDER extension's picture objects.
A unique label identifies each picture and pixmap. A picture labeled “main” gets created by default, this is the final drawn image. After executing the drawing instructions in the SXG file, the “main” picture's contents become the drawn image. All other pictures and pixmaps get discarded. The “main” picture's actual size determines the scaling factors for all scaled drawing instructions. The LibCXX Widget Toolkit creates a picture object, perhaps after consulting SXG file's nominal width and height, and the drawing instructions in the SXG file get scaled accordingly.
All picture and pixmap labels are unique. The same label cannot be
used for both a picture and a pixmap.
To make things slightly confusing, pixmaps may be specified as
picture parameters in some drawing instructions, using their
label. This is because a
picture
gets created for each
pixmap
.
And to confuse things even
further, each regular
picture
object, of course, represents a
pixmap
, and
a pixmap
gets created for each regular
picture
(except for solid color pictures,
as explained later).
The reason for separate
pixmap
and
picture
declarations has to do with
the pictformat of the resulting pixmap/picture duo.
There are two main groups of drawing instructions in the SXG
file. One group uses X protocol's graphic contexts that are only
used with pixmaps. The second group uses RENDER
extension instructions; which can only use pictures.
The size of regular picture
and
pixmap
objects either get scaled
based on “main”'s picture, or they are fixed
dimensions, as specified
by their size
widget.
The rest of the SXG file consists of
gc
and
render
elements.
Each pixmap has a collection of one or more
gc
s, that
are directly equivalent to X protocol's graphic contexts, which
draw on their pixmap. Graphic contexts also have unique
label identifiers. The same graphic context label cannot
be used by another pixmap's graphic context.
The gc
element specifies a list of
commands to execute for a graphic context object with the specified
label identifier.
The render
element specifies a list of
commands to execute for a picture object with the specified
label identifier.
All coordinates in
gc
and
render
elements may be fractional, and they
get scaled according to the referenced pixmap or picture's
size
.
Example: a picture or a pixmap defines its size as
ten by ten "millimeters". The display's resolution is
3.5 pixels per millimeter. The actual object's size is
35 by 35 pixels. All coordinates specified in the
gc
or
render
elements are still
values between and up to, but not including 10. Fractional
coordinates are allowed, and they
get scaled to the 0-34 range.