Overview:

WonderBrush is an editor for bitmap graphics. The main window holds any number of documents, which are called Canvas. A canvas has an associated name and pixel resolution as well as some other properties. It also references up to two files, which represent it on disk, one is a flat (translator) bitmap, the other a full-featured project file.
Each canvas can have any number of Layers, currently arranged as a list. Each layer represents an individual bitmap in the size of the canvas. Depending on each layers blending mode, they are composed on top of each other to form the final canvas bitmap.
Each layer can contain any number of Objects, which are created by WonderBrushs tools. Each object has a set of properties which define the unique appearance of the object on the layer.
At any time, it is possible to reorder the layers, or the objects they contain. This could be called non-linear editing. It is also possible to change most of an objects properties later on. This could be called non-destructive editing, because adding another object (like a filter) does not actually destroy any pixel data.


The Interface:

WonderBrush features a "single window" design. Additional windows are only in the form of popup panels, which are usually not supposed to float above the workspace. Along the left side of the main window, is the structured contents of the document, first the overview, then the list of layers, then the list of objects on the active layer, then the list of properties of the active object. Along the top of the window are the tools. The top part will display the configuration fields of the active tool. At the right top is an area reserved for color swatches.


Usage:

A layer is completely transparent by default. The contents of a layer are only produced by objects, for example strokes of the Brush tool. Each layer has it's own list of objects attached to it, which is basically the layer's construction history. However, this history is non-linear, since the objects can be rearranged by drag sorting and each of their properties can be adjusted later. The relevant part of that layer's bitmap will then be rerendered by rendering every object again, that touches this area. Dependencies in the history will be taken into account. For example, if a part of the layer was cloned with the Clone tool, and that part is changed, the area containing the Clone tool strokes will also be rerendered.
Additionally to supporting the system clipboard for pixel data, WonderBrush maintains a private clipboard each for objects and properties of objects. These clipboards a persistent until the next system reboot and are accessed via the menu of the respective lists. Using the clipboards, objects can be transfered from one layer to another (even across canvas) and properties of one object can be copied to multiple other objects at once.
Layers and objects can also be duplicated by holding down <Shift> when drag-sorting with the mouse. 

The "non-linear" design has some adventages as well as handicaps. Some adventages are, that the object stack uses only little memory - and that it is non-linear, of course. It is also saved in the project file. Calculations are more precise, resizing the canvas simply renders all layers with scaled objects. One disadventage is the sometimes low undo/redo speed, because sometimes many objects need to be rerendered.

Some operations known from other graphics applications are achieved differently in WonderBrush. For example, locking the alpha channel can be done by duplicating a layer, and setting the new layers blending mode to "Alpha". Additional painting on the original layer will then be masked away by the duplicate. Unfortunately, the mask will apply to every other layer as well. In the future however, WonderBrush will have a compositing tree rather than a list of layers, so that the effect of one layer can be restricted to layers of that branch only.

WonderBrush features the concept of interchangable properties. This means that a set of properties from one object can be transfered to any number of other objects, even if their type is different. The set of properties that an object can have, depends on its type. But some properties are common to two or more types of objects. For example, many types feature "Opacity", some feature "Radius". The ability to transfer any number of properties to any number of objects at once is a pretty powerful concept. The implementation is quite simple though. There is a Property list that will display the set of properties with their specific values for the selected object in the Object list. If multiple objects are selected, the list will be empty. Most properties can be edited directly in the Property list, with different types of properties having different ways of being edited. Multiple properties can be selected at once and can be copied to a custom (and persistent until reboot) Property clipboard. Using the same Property menu, the properties from the clipboard can be pasted back to the selection of objects. The objects will be changed according to what properties they understand.


Current Pros:

One important feature of WonderBrush, is that blending is calculated in gamma converted RGB space. This gets rid of incorrect intermediate colors and is a unique feature among BeOS graphics programs.

The brush system, though not feature complete at all, is offering some unique options. Since the brush shapes are calculated on the fly, pen pressure can be set to control various aspects of the shape. The brush is also rendered with subpixel precision. I think this is not available on any other BeOS painting program.

The way in which objects and properties can be duplicated and copied arround makes for some interesting possibilities and saves a lot of time when changing many objects at once.

Some editing modes in WonderBrush use their own temporary undo stack, which can be quite convenient. It means, that you can for example undo single modifications *while* doing a transformation of objects, and *after* you're done and "apply" the thing, you can undo it all at once.

WonderBrush is fully font sensitive and the interface language can be switched on the fly. The language files can even be modified while the application is running, changes will take effect immediately.

This is a fully native BeOS application. It launches quite fast and makes use of hardware accelerated drawing, though this is something I will have to review when I want to avoid flickering of some of the controls on the canvas in the future.

I haven't tested this on anything else than my machines, but I can honestly say, there are no crashing bugs *known* to me. Please contact me if your opinion differs. There are some less annoying bugs left in this release, though they should not hinder workflow. See the file BUGS if you're interested.

Also see the file TODO, if you're curious what's planned. The LOG might also offer some interesting insights into the WonderBrush development.


Current Cons:

WonderBrush is unable to export project files in Photoshop or even TIFF format, this however is one of the most desirable features for professional use. Unfortunately, WonderBrush is developping options, which are hard to represent in these alien file formates. As soon as WonderBrush uses a compositing tree rather than a list, things will start to look even more complicated.

There is currently no tiled memory architecture, therefor, only smaller bitmaps can be created (up to 3000x3000 pixels is Ok, after that... good luck!).

I have not yet optained a license to include the compression code I want to include (LZO). So compression is disabled in this release. RAM usage would be greatly reduced if it was enabled. I contacted the LZO developer more than once, but have not heard back. Project files use zlib compression as of version 1.5.0.

There is no easy way to create circles, rectangles and such basic shapes. These will be implemented based on the current Shape tool in the very near future.

Selection of pixel data is currently implemented in a very simple way. Like in some of the BeOS image viewers, a rectangular area can be defined and copied to the system clipboard. From there, it can be pasted as a Bitmap object. This also provides the means for interoperability between other image editors, like for example ArtPaint.


Keyboard Shortcuts:

<space>		toggles canvas panning mode (scrolling as soon as mouse is pressed)

+			when a modifier is held down -> zooms to next zoom in level

			without modifier, it depends on the active tool:
				stroke based tools (Brush, Clone, Blur ...):
					when <shift> is held down, adds 1.0 to brush radius
					without any modifier, scales brush radius by 1.1
				Text:
					when <shift> is held down, adds 1.0 to text size
					without any modifier, scales text size by 1.1
					

-			opposite of +

cursor		nudging of selected objects in Transform tool, nudging text
keys		in Text tool, nudging selected path control points or entire
			path in Shape tool

cursor keys	nudge the selected objects in the given direction if the Transform tool is active.

z, y		undo

Z, Y		redo

b			switch to Brush tool

c			switch to Clone tool

p			switch to Pen tool

s			switch to Shape tool

e			switch to Erasor tool

d			switch to Dropper (color picker) tool

r			switch to Blur tool

x			switch to Crop tool

f			switch to Fill tool

t			switch to Text tool

v			switch to Transform tool

Additional keyboard control for Shape tool:

When a Shape path is being edited, the <Command> (<Ctrl>/<Alt>) and
<Option> (<Alt>/<Ctrl>) key switch the editing option when clicking a
control point.

<Command> will break the connection between the small in/out curve
control points, or - when dragging after the initial click -
reestablish it. Holding down <Option> while clicking a control point
removes the point. The smaller in/out curve controls can individually
be removed to get a sharp edge in only one direction of the main control
point. To get the in/out curve control points back onto the main
control point, simply use the <Command> click again and drag them out.

Dragging a smaller in/out curve control point will drag the other
curve control point too, so that they always line up and give a smooth
curve. The connection can also be broken by pressing <Command> while
clicking, it then drags only the one curve control point. Clicking the
main control point with <Command> held down will remove both in/out
points to give a sharp edge at the main point. (Just in case this was
unclear yet.) Dragging with the mouse button still down will drag
out both the in/out curve control points again.


Layer Blending Modes:

Normal				Composes the color of the pixel on top of the bottom pixel.

Multiply			Multiplies color components, but depending on bottom pixel
					alpha, top color is unchanged. This means, white will
					show if bottom is transparent, but will be invisible if
					bottom is fully opaque!

Inverse Multiply	Same as above, but multiplies with inverted color channels.

Luminance			Replaces the luminance of the bottom pixel with the top 						pixel luminance.
					This is done in Lab colorspace and can be used as a
					light/shadow map. (Very slow though!)

Alpha				The bottom pixels alpha is multiplied with the top pixels
					alpha. The layer acts as a mask.

Invers Alpha		The bottom pixels alpha is multiplied with the inverse
					of top pixels alpha. The layer acts as an inverse mask.


Keyfiles, Unlocking WonderBrush:

Contained in this release is a somewhat crippled "demo version" of WonderBrush: The application can not save project files. To license WonderBrush to use it commercially and to unlock this demo version, you can pay using the Kagi online store at <http://order.kagi.com/?8JD>. A single licence is USD 21.50. Keyfile(s) unlocking the project saving feature will then be sent to you. Thank you very much for considering buying a keyfile.

If you have previously bought a keyfile, it will continue to work.


Translating WonderBrush:

The folder "Languages - incomplete" contains some translations of WonderBrush to other languages which have strings missing. You can make your own Translation by starting from the "_English_" reference translation in the "Languages -  incomplete" folder. The file format is "easy". Languages are compiled as addons from within WonderBrush. So everything you can do in C/C++, you can do in the language file. As a side effect, you need to have the developer tools installed or get a compiled addon from someone else.

I am very grateful to the orginal translators of the incomplete translations. I have stated their names in the respective language file. Some of them continue to provide me with updated translations, thanks a lot. Also many thanks to everyone having send translations in the meantime.


Anti-Grain Geometry:

WonderBrush's rendering engine is now based in large part on Anti-Grain Geometry by Maxim Shemanarev. This enabled me to include the new feature of Affine Transformations in a decent way without much time to program. The Shape tool uses AGG for rendering vector shapes. The anti-aliasing is of very high quality, as it calculates anti-aliasing based on exact geometry coverage values giving 256 shades in all cases. Many professional tools, as for example Photoshop, give only as much as 16 shades of gray in many common cases (sub-sampling).


FreeType:

The initial implementation of the Text tool was based on FreeType. Now it is based on Anti-Grain Geometry, which in turn is based on FreeType. FreeType is an excellent font renderer, also calculating the anti-aliasing from exact geometry coverage. This is good for the general case, though in some situations, the text readability could be improved by hinting, which I have turned off because hinting only makes sense for non-transformed text.


ArtPaint:

Many filters in WonderBrush are based on ArtPaint filters. The ArtPaint code was donated to BeUnited by Heikki Suhonen and is maintained there. The internal designs in WonderBrush and ArtPaint are highly different, and thus only the very algorithms were ported. They have also been adopted to better handle transparency in colors. Sometimes a speed up of the algorithm could be achieved. If there is interest in backporting some of my improvements, please let me know.


Special Thanks:

I am very grateful to Marcin Konicki (ahwayakchih) for his numerous comprehensive bug reports and generally for being a great guy. Without him, the recent releases would certainly be of lower quality. Also many thanks to DarkWyrm for providing detailed feedback on possible UI improvements. Pierre Arnaud has helped me more than once by providing bits of useful code for the Shape tool implementation.


History:

November 8 2004
	- Subpixel precision can now be turned off for the Shape tool
		(path control points can then only be located at integer pixel
		coordinates)
	- Navigator (Canvas overview) and Layer icons are never scaled up,
		when editing small bitmaps, like icons, this looks much better
		and even gives a good preview of the bitmap at 100%
	- maximum zoom level is now 3200% for all ya icon artists
	- tab navigatation between properties and additional keyboard control in
		some of the editing fields is now available in the Property list view
	- nudging control points when editing a path (translating with the cursor
		keys), either all selected points or entire path if no selection
	- reimplemented Fill algorithm with more than two times speed up
	- bug fixes:
		- tracked down that nasty Fill tool crashing bug that could
			sometimes happen, the fix could potentially have fixed more
			crashing bugs, though I don't know if it was triggered elsewhere
		- fixed a couple of undo actions to not update the Object list view,
			if it is showing a different layer than the changed object(s)
			live(s) on
		- changed a couple of things in the shutdown sequence, hopefully fixes a
			rare crash in the Filepanel destructor when quitting WonderBrush,
			the crash is hard to reproduce, so I don't know if I really fixed it
		- tweaked the approximation scale of the Shape objects in outline mode,
			gives much smoother results
		- a bug with the stroke generator in AGG was fixed, which fixes a
			problem in WonderBrush when generating the outline of a path
			when it had very sharp edges


October 25 2004
	- fixed a critical crashing bug in the Text tool when spaces where
		in front of some text. When switching to the Transform tool, the
		whole system could freeze up.
	- fixed the CPU hogging problem in drawing a straight line with Brush tool

October 24 2004
	- improved brush spacing code, so that when scaling up Brush objects,
		they look perfectly smooth now (instead of the spacing becoming
		visible)
	- bug fixes:
		- crashing bug in localization add-on building on Zeta
		- crashing bug in Multi Paste Property when at least one of
			the objects was not caused to change (stupid last minute change...)
		- work around for app_server bug in Zeta, which apparently filters
			mouse moved messages, so that when these events are generated by
			a tablet, they would not always contain all fields (pressure,
			tilt, etc.)
		- work around for Zeta app_server bug (the one concerning drawing
			segments of a circle)
		- fixed picking pivot of transform box when zoomed in or out
		- fixed a bug in Shape and Text tool which caused the config GUI to
			incorrectly reflect the Shape/Text object having been double
			clicked to be edited
		- "whole system locking up" bug when spaces were in front of text
			for Text object and then chosing Transform tool
		- drawing straight line by holding down shift in Brush tool was
			unbearably slow in 1.5.0 and 1.5.1

October 15 2004
	- Affine Transformations of objects (Translate, Rotate, Scale
		(and indirectly Skew))
	- Resizing and Rotating (-90°, 90°, 180°) of the canvas
	- reimplementation of many object types rendering using AGG
		- Bitmap, Fill, Text, Brush and Eraser
	- Text tool uses AGG font caching
	- Filters (many ported from ArtPaint):
		- Brightness,
		- Contrast,
		- Saturation,
		- Invert,
		- Gaussian Blur,
		- Motion Blur,
		- Dispersion,
		- Drop Shadow,
		- Halftone,
		- Noise
	- interchangable Object Properties with custom clipboard
	- Text tool is now multiline
	- Text tool has spacing property for adjusting the spacing between letters
	- new behaviour for closing a path when the Shape is in outline mode
		(to be able to move the first point of an open path)
	- more convenience menu items in Object menu, Freeze and Remove can no
		longer be mistaken for ignoring the selection
	- WonderBrush now goes to the current workspace when a document is loaded
	- Shape and Text tools automatically apply when the selection changes
	- Object listview is now much less restrictive when currently editing
		a Text or Shape object
	- made cute little Undo/Redo icons

	- bug fixes:
		- big memory leak in Crop tool
		- many Fill tool bugfixes
		- Canvas is now correctly rerendered when one of the merged layers
			was invisible
		- fixed "Blur tool doesn't blur edge pixels" bug
		- fixed "transform box shows wrong cursors when flipped" bug
		- fixed "transform box leaves dirty pixels when zoomed out far
			enough" bug
		- fixed input of invalid chars in text inputs for numerical values
		- fixed Select tools text input (Top coordinate was used where
			Left coordinate should have been used)
		- fixed picking a color from the actual Color Picker panel was
			not undoable in Text and Shape tools
		- the tool help message can now contain '\n' so that it line breaks in
			the bubble help
		- fixed a bug with dragsorting objects, in certain situations,
			the dragged objects could just disappear
		- canvas name is now updated in canvas list when saving under a new name

September 1 2004
	- in Shape tool:
		- much improved selection of control points when editing paths
		- transformation of selected control points with complete undo/redo
	- image data is now removed at pixels with alpha = 0 when saving, so that
		the file can be compressed more efficiently
	- bugfixes in Text tool when no settings file was present, better default
		font selection
	- bugfix when pasting from clipboard while editing Text or Shape
		(history got confused)
	- all icons are truely transparent now, so when rendered in Zeta on
		non gray-216 panel background, they look good.

August 11 2004
	- new Copy tool, which copies a rectangular area to the
		system clipboard
	- small bugfixes in Crop tool
	- "Paste" menu item is now actually translated
	- more up to date Japanese and Polish language files included

August 5 2004
	- Confirm/Cancel Crop and Transform Tools
	- Shape tool has outline mode with variable width
	- bounding box for selected objects in Transform tool
	- new global "Program Settings" panel, startup action can be picked
	- numerous bug fixes in Shape, Text, Move, Crop and Fill tools
	- numerous usability fixes
	- new loading mechanism in separate thread
	- native documents can now be inserted into existing documents
		(drop document into main window (or better layer list) while
		pressing <shift>)
	- bug fix for layer alpha mask blending
	- better generation of Bitmap objects when chosing Object->Freeze
		(excluding empty parts is now smarter)
	- all strings translatable again
	- renamed History list -> Object list
	- pressure control for Brush radius & opacity is off by default
		(Zeta app_server bug is not triggered in default config)
	- other small fixes

June 12 2004
	- New tool: Shape
		missing:	transforming selections of control points,
					multiple paths for definging holes etc.
	- Confirm/Cancel Text and Shape tools
	- editing of Text and Shape modifiers at any time,
		just double click the objects in the History list

Mai 19 2004	- public development release
	- New tools: Crop, Transform, Fill and Text
	- changes in the GUI layout
	- many bug fixes
	- work in progress...

August 25 2003 - initial public release




