ROWS innovations

While ROWS was originally designed as a way for me to learn how to program X, I also intended to put in many of my favorite features from RISC OS. Well, since ROWS became part of Impulse, the number of extra features have multiplied quite considerably. Here is a list of the more interesting features that are found in ROWS and are not present (or at least not common) in other X widget sets:

Device-independant colour model

ROWS stores colours internally in CIE XYZ format. This is a colour model based on the wavelengths and intensity of the light that makes up a colour rather than depending on how a particular piece of hardware should choose to render it. In addition to this, it supports various alternative forms of specifying colour in a device-independant and device-specific way (device-independant methods include CIELUV, CIELAB and the polar forms of same, device-dependant methods include RGB, CMYK, HSV and HLS)

What's more, you can specify that a colour is in the gamut of one system and render it on another (where it is available). You can specify the gamuts themselves using an ICC profile. And, if your device is determined to be weird, you can specify your own conversion routines.

Device-independant graphics system

One of the targets of Impulse was to make it portable, and in a widget set the least portable part is the graphics system. To help alleviate the problem, ROWS has an abstract graphics device. This not only means you can port ROWS to alternative windowing systems, but also means that you can also drive printers and other more esoteric graphics devices through the same subsystem. The graphics command set is much richer than that of other systems, for example, over X (and most widget sets that have their roots there), it supports bezier curves and discontinuous polygons (that is, shapes can be drawn as sequences of lines and moves). In the future, it will probably support transparency and gradient fills.

The graphics system also features a couple of things not seen in other systems, most notably the clipping stack. This allows you to alter the clipping region and preserve the clipping region that was set before.

Device-independant bitmaps

ROWS stores bitmaps internally in a very simple format, which is easy to manipulate directly, and which will eventually sport a driver for the ROWS abstract graphics device. In essence, this means you can manipulate an image in 24-bit colour and plot it in 8-bit without ever having to worry about the conversions required for the device you are plotting on. It also means that you finally get decent bitmap manipulation functions for X!

Bitmaps with colours specified by CIE values are not provided yet, but they may well soon be appearing (though I wouldn't want to use one for animated graphics...)

Abstract interfaces

ROWS makes few assumptions about the system it is to be running on. It requires a minimal amount of POSIX.1 compliance in order to compile the bulk of the system. You can easily port the threading system, the event passing system or the graphics systems to radically different architechtures simply by writing new versions of the appropriate files.

Support for lightweight windowing systems

The widget hierarchy model used in ROWS does not require that the windowing system is able to create subwindows of any sort. This means that ROWS can be ported to windowing systems that only support top-level windows.

Unicode support

Well, not really that much of an innovation, but ROWS contains a complete Unicode library, including conversion to/from UTF-7, 8 & 16, the character database, normalisation (both composition and decomposition) and conversion to/from 8-bit character sets such as Latin-1. In ROWS, Unicode is all-pervasive, so you never need worry about which character set you're using today...