ArcDraw File Format

Version Number: 1.07

Introduction

The ArcDraw file format provides an object-oriented description of a graphic image. It represents an object in its editable form, unlike a page-description language such as PostScript which simply describes an image. This document describes the file format, and the rules that should be used in order to render the object on a display device.

Parties wishing to define their own object types should use the same approach as for the allocation of SWI numbers [Reference: Arthur/RISC OS Programmer's Reference Manual].

Coordinates

All coordinates within an ArcDraw file are signed 32-bit integers that give absolute positions on a large image plane. The units are 1/(180*256) inches, or 1/640 of a printer's point. When plotting on an Archimedes screen, an assumption is made that one OS-unit on the screen is 1/180 of an inch. This gives an image reaching over half a mile in each direction from the origin. The actual image size (e.g. the page format) is not defined by the file, though the maximum extent of the objects defined is quite easy to calculate. Positive-x is to the right, Positive-y is up. The printed page conventionally has the origin at its bottom left hand corner. When rendering the image on a raster device, the origin is at the bottom left hand corner of a device pixel.

Colours

Colours are specified in ArcDraw files as absolute RGB values in a 32-bit word. The format is:
byte 0: reserved (must be zero)
byte 1: unsigned red value
byte 2: unsigned green value
byte 3: unsigned blue value

For colour values, 0 means none of that colour and 255 means fully saturated in that colour.

(Aside: the phrase "reserved and must be zero" means: when creating such an object, set to zero when reading such an object, do NOT assume that these fields are zero This allows the fields to be used for future expansion. End aside.)

The bytes in a word of an ArcDraw file are in little-endian order, e.g. the lest significant byte appears first in the file.

The special value &FFFFFFFF is used in the filling of areas and outlines to mean "transparent".

The File Header

The file consists of a header, followed by a sequence of objects.

The file header is of the following form. 1-byte ASCII 'D'
1-byte ASCII 'r'
1-byte ASCII 'a'
1-byte ASCII 'w'
1-word major format version stamp - currently 201 (decimal) 1-word minor format version stamp - currently 0 12-byte identity of the program that produced this file. typically 8 ASCII chars, padded with spaces. 4-word bounding box: low x, low y, high x, high y

When rendering an ArcDraw file, check the major version number. If this is greater than the latest version you recognise then refuse to render the file (e.g. generate an error message for the user), as an incompatible change in the format has occured.

The entire file is rendred by rendering the objects one by one, as they appear in the file.

The bounding box indicates the intended image size for this drawing.

A Draw file containing a file header but no objects is legal; however, the bounding box is undefined. In particular the 'x0' value may be greater than the 'x1' value (and similarly for the y values).

The Object Header

Each object consists of an object header, followed by a variable amount of data depending on the object type. The object header is of the following form:
1-word object type field
1-word object size: number of bytes in the object, always a multiple of 4
4-word object bounding box: low x, low y, high x, high y

The bounding box describes the maximum extent of the rendition of the object: the object cannot affect the appearance of the display outside this
rectangle. The upper coordinates are an outer bound, in that the device pixel at (x-low, y-low) may be affected by the object, but the one at (x-high, y-high) may not be. The rendition procedure may use clipping on these rectangles to abandon obviously invisible objects.

Objects with no direct effect on the rendition of the file have no bounding box: these will be identified explicitly in the object descriptions that follow.

If an unidientified object type field is encountered when rendering a file, ignore the object and contine.

The object size field includes the object header.

The rest of the data for and object depends on the object type field.

The Font Table object

This object is somewhat special in that only one of it ever appears in an ArcDraw file. It has no direct effect on the appearance of the image, but maps font numbers (used in text objects) to textual names of fonts. It must precede all Text objects.

A Font Table object has no bounding box in its object header.

object type number: 0
object data:
sequence of font number definitions up to 3 zero characters, to pad to word boundary

a font number definition consists of: 1 character font number (non-zero)
textual name of corresponding font (characters within 32..126) zero character

Comparison of font names is case-insensitive.

Text objects

object type number: 1
object data:
1-word text colour
1-word text background colour hint
1-word text style
1-word x unsigned nominal size of the font 1-word y unsigned nominal size of the font 2-word x,y coordinates of the start of the text base line characters in the string
zero character
up to 3 zero characters, to pad to word boundary

The character string consists of printing ANSI characters with codes within 32..126 or 128..255. This need not be checked during rendering, but other codes may produce undefined or system-dependent results.

The style word consists of the following: bits 0..7: one byte font number
bits 8..31: reserved (must be zero)

Italic, bold etc. variants are assumed to be distinct fonts.

The font number is related to the textual name of a font by a preceding Font Table object within the file (see below). The exception to this is font number 0, which is a system font that is sure to be present. When rendering a draw file, if a font is not recognised, the system font should be used instead. The system font is monospaced, with the gap between letters equal to the x nominal size of the font.

The background colour hint can be used by font rendition code when performing anti-aliasing. It is referred to as a hint because it has no effect on the rendition of the object on a "perfect" printer, nevertheless for screen rendition it can improve the appearance of text on coloured backgrounds. The font redition code can assume that the text appears on a background that matches the background colour hint.

Path objects

object type number: 2
object data:
1-word fill colour (-1 means do not fill) 1-word outline colour (-1 means no outline) 1-word outline width (unsigned)
1-word path style description
optional dash pattern definition
sequence of path components

An outline width of 0 means draw the thinnest possible outline that the device can represent.

A path component consists of:
1-word tag identifier
sequence of 2-word (x,y) coordinate pairs

Each tag identifier word consists of:
bits 0..7: tag identifier byte
bits 8..31: reserved, must be zero

Possible tag identifier byte values:
0: end of path: no arguments
2: move to absolute position: followed by x,y pair 5: close current sub-path
8: draw to absolute position: followed by x,y pair 6: bezier curve through two control points, to absolute position:

     followed by three x,y pairs

(Aside: the tag values match the arguments required by the Draw module. This block of memory can be passed directly to the Draw module for rendition, see the relevant documentation for precise rules concerning the appearance of paths. See also manuals on PostScript [Reference: PostScript Language Reference Manual, Addison-Wesley]).

The possible set of legal path components in a path object is described as follows. A path consists of a sequence of (at least one) subpaths, followed by an "end of path" path component. A subpath consists of a "move to" path component, followed by a sequence of (at least one) "draw to" and "bezier to" path componenets, followed (optionally) by a "close sub-path" path component.

The path style description word is as follows:

bits 0..1: join style:

            0 = mitred joins
            1 = round joins
            2 = bevelled joins
bits 2..3: end cap style:
            0 = butt caps
            1 = round caps
            2 = projecting square caps
            3 = triangular caps
bits 4..5: start cap style (same possible values) bit 6: winding rule:
            0 = non-zero
            1 = even-odd
bit 7: dash pattern:
            0 = dash pattern missing
            1 = dash pattern present
bits 8..15: reserved and must be zero bits 16..23: triangle cap width:
            a value within 0..255,
            measured in sixteenths of the line width.
bits 24..31: triangle cap length:
            a value within 0..255,
            measured in sixteenths of the line width.

The mitre cut-off value is the PostScript default (e.g. 10).

If the dash pattern is present then it is in the following format: 1-word offset distance into the dash pattern to start 1-word number of elements in the dash pattern for each element of the dash pattern,

      1-word  length of the dash pattern element
The dash pattern is reused cyclically along the length of the path, with the first element being filled, the next a gap, and so on.

Sprite Objects

object type number: 5
object data:
a sprite
       [Reference: Arthur/RISC OS Programmer's Reference Manual].

This contains a pixelmap image. The image is scaled to entirely fill the bounding box.

If the sprite has a palette then this gives absolute values for the various possible pixels. If the sprite has no palette then colours are defined locally. Within RISC OS the available "wimp colours" are used.

Group Objects

object type number: 6
object data:
12-byte group object name, padded with spaces a sequence of other objects

The objects contained within the group will have rectangles contained entirely within the rectangle of the group. Nested grouped objects are allowed.

The object name has no effect on the rendition of the object. It should consist entirely of printing characters. It may have meaning to specific editors or programs. It should be preserved when copying objects. If no name is intended, twelve space characters should be used.

Tagged object

object type number: 7
object data:
1-word tag identifier
object
additional data (multiple of 4 in size)

To render a Tagged object, simply render the enclosed object. The identifier and additional data have no effect on the rendition of the object. This allows specific programs to attatch meaning to certain objects, while keeping the image renderable.

Parties wishing to define their own object tags should use the same approach as for the allocation of SWI numbers.

Text area objects

object type number: 9
object data:
1 or more text column objects
1-word zero, to mark the end of the text columns 1-word reserved, which must be zero 1-word reserved, which must be zero 1-word initial text foreground colour 1-word initial text background colour hint the body of the text column: ASCII characters, terminated by a
      null character
0..3 null characters to align to a word boundary

A text area contains a number of text columns. The text area has a body of text associated with it, which is partioned between the columns. If there is just one text column object then its bounding box must be exactly coincident with that of the text area.

The body of the text is paginated in the columns. Effects such as font settings and colour changes are controlled by escape sequences within the body of the text. All escape sequences start with a backslash character (\); the escape code is case sensitive, though any arguments is has are not.

  1. \! <version><newline or /> Must appear at the start of the text, and only there. <version> must be 1.
  2. \A<code><optional />
    Set alignment. <code> is one of L (left = default), R (right), C (centre), D (double). A change in alignment forces a line break.
  3. \B<R><spaces><G><spaces><B><newline or /> Set text background colour hint to the given RGB intensity (or the best available approximation). Each value is limited to 0..255.
  4. \C<R><spaces><G><spaces><B><newline or /> Set text foreground colour to the given RGB intensity (or the best available approximation). Each value is limited to 0..255.
  5. \D<number><newline or /> Indicates that the text area is to contain <number> columns. Must appear before any printing text.
  6. \F<digit*><name><spaces><size>[<spaces><width>]<newline or /> Defines a font reference number. <name> is the name of the font, and <size> its height. <width> may be omitted, in which case the font width and height are the same. Font reference numbers may be reassigned. <digit*> is one or two digits. <size> and <width> are in points.
  7. \<digit*><optional />
    Selects a font.
  8. \L<leading><newline or /> Define the leading in points from the end of the (output) line in which the \L appears. Default 10 points.
  9. \M<leftmargin><spaces><rightmargin><newline or /> Defines margins that will be left on either size of the text, from the start of the output line in which the sequence appears. The margins are given in points, and are limited to values > 0. If the sum of the margins is greater than the width of the column, the effects are undefined. Both values default to 1 point.
  10. \P<leading><newline or /> Define the paragraph leading in points. Default 10 points.
  11. \U<position><spaces><thickness><newline or /> Switch on underlining, at <position> units relative to the character base, and of <thickness> units, where a unit is 1/256 of the current font size. <position> is limited to -128..+127, and <thickness> to 0..255. To turn the underlining off, either give a thickness of 0, or use the command \U. (\U followed by a dot).
  12. \V[-]<digit><optional /> Vertical move by the specified number of points.
  13. \-
    Soft hyphen: if a line cannot be split at a space, a hyphen may be inserted at this point instead; otherwise, it has no printing effect.
  14. \<newline>
    Force line break.
  15. \\ appears as \ on the screen
    16 . \;<text><newline>
    Comment: ignored. Other escape sequences are flagged as errors during verification.

    Lines within a paragraph are split either at a space, or at a soft hyphen, or (if a single word is longer than a line) at any character.

    A few other characters have a special interpretation:

    1. Control characters are ignored, except for tab, which is replaced by a space.
    2. Newlines (that are not part of an escape sequence) are interpreted as follows:
      a. occuring before any printing text. A paragraph leading is inserted for each newline.
      b. in the body of the text. A single newline is replaced by a space, except when it is already followed or preceded by a space or tab. A sequence of n newlines inserts a space of (n-1) time the paragraph leading, except that paragraph leading at the top of a new text column is ignored. Lines which protrude beyond the limits of the box vertically, e.g. because the leading is too small are not displayed; however, any font changes, colour changes, etc. in the text are applied. Characters should not protrude horizontally beyond the limits of the text column, e.g. due to italic overhang for this font being greater than the margin setting. Restrictions:
      if a chunk of text contains more than 16 colour change sequences, only the last 16 will be rendered correctly. This is a consequence of the size of the colour cache used within the font manager. A chunk in this case means a block of text up to anything that forces a line break, e.g. the end of a paragraph or a change on the alignment.

      Text column objects


      object type number: 10
      object data: none
      A text column object may only occur within a text area object. Its use is described in the section on text area objects.