Dogwaffle subjects

Buffers
Layer mixing
Natural tools
Paint modes
Fill tools
Filters
Gradients
Custom brushes
Paper textures
Menu items
The brush options panel
The Optipustics panel
Plugins
Programming the plugin interface with Visual Basic
Reference of plugin interface methods
Sample plugin
Frequently asked questions







Buffers

A buffer in dogwaffle is simply the area where drawing operations take place. There is a main buffer and a second hidden buffer called the swap buffer. It may be used for a temporary working area, and it is used by some filters and layer mixing.
The swap buffer is accessed by pressing the j key. The swap buffer then becomes the new main buffer and the main buffer becomes the swap buffer.
You may also copy the contents of the swap buffer to the alpha channel. It is converted to an 8 bit grayscale as it's copied.




Layer mixing

Currently, layer mixing takes place between the main buffer and the swap buffer. Activate layer mixing by clicking on the image icon at the top right of the tool palette. Right clicking on the icon activates a menu of options for layer mixing. Layers are not saved together in a file, so you will have to merge your layers before saving your image.




Natural tools



Dogwaffle contains many presets for natural tools. Right click on the paintbrush tool on the tool palette to activate a menu of available natural painting presets.
Right clicking on the brush icon at the top of the tool palette will activate the brush settings panel.




Paint modes



Paint modes work with the natural painting tools. They are selected from the 'Mode' dropdown tool near the center of the tool palette.
More latter...




Fill tools

Fill tools include the rectangle, ellipse and paintcan tools. The text tool may also be considered a fill tool.
Fill styles are controlled from the gradient/fill panel. You can bring up the panel by right clicking on any of the fill tool icons, or by clicking on the gradient/fill icon.
Fill styles may include gradients, custom brush patterns, or custom brush warping. They may also have a paint mode applied to them which is set from the gradient/fill panel.



There are seven fill styles. Note that the exact effect will also depend on the fill mode, dithering, and attributes from the tool panel such as opacity and paper texture.

Normal Fills with a plain color.

Horizontal gradient Fills horizontally with the colors from the gradient.

Horizontal form-fitting gradient Fills horizontally with the colors from the gradient, so that the colors wrap nicely into the shape being filled.

Vertical gradient Fills vertically with the colors from the gradient.

Circular gradient Fills an area with the gradient mapped from the center out to the farthest rectangle surrounding the filled area. Thus if you fill an ellipse, you should set up the gradient with the color you want at the edge of the ellipse right in the center of the gradient.

Brush pattern Fills an area with a patter created from the current custom brush.

Form fitting brush The custom brush is warped to fit the shape of the area being filled.




Filters



There are many special effects filters in project dogwaffle. They are accessed from the Filters menu. Go to the description of menu items to find out more.

See the filter menu items




Gradients


Gradients are easily edited in dogwaffle from the gradient/fill panel.
You may drag colors from the wells on the tools panel and drop them onto the dashed line under the gradient editor to add an entry. These entries show up as small triangles that my be moved around on the dashed bar.
Optionally, you may edit a gradient with the mouse by sweep drawing over the editing area for each of the color channels in the gradient.
Gradients are used by all of the fill tools, the render noise filters, the 'map to gradient' filter, and several others. They are also available to plugins should somebody want to use them.




The brush options panel

more later...




Optipustics

Optipustics are procedural brushes that do various things...
more later...




Custom brushes

Custom brushes are brushes created by the user, and override the internal brushes. They can be created with the brush selector tool, or with 'copy selection' from the brush menu. Copy selection uses the alpha channel to determine the shape of the brush.
One a brush is created, it may be selected from the bottom of the menu of available brushes when you left click on the brush icon.
Custom brushes may also be used as fill patterns from the Gradient/Fill panel.




Paper textures

Paper textures are used both by the natural tools, and the fill tools. An embossing effect is created giving a drawing the appearance of a rough paper.
The effect of dry paint that doesn't fully penetrate the fiber of the paper may also be created using the drybrush option. It works in conjunction with the opacity slider to control the dryness of the effect.




Plugins



Dogwaffle exports some of it's internal data and functions to external applications. Anyone who wants to may create applications in Visual Basic 5 (professional or enterprise) or above that can communicate with dogwaffle and access it's data structures and functions.
There are a good handful of plugins already available including the ability to import and export Windows BMP files and they are included with the distributable.

Filter plugins
Import plugins
Export plugins
Brush plugins
Misc. plugins



Filter Plugins

12 bit dither Converts an image to the appearance of a 12 bit color space using Floyd dithering. The buffer is maintained at 24 bits.

Black hole Distorts the image with a spherical warp.

Globe Distorts the image as if looking at it through a crystal ball.

Maximize_pf Sets each pixel to the highest value of the neighboring pixels.

MaxMin_pf Performs a maximize and then a minimize. The result is very similar to the original but with light noise removed.

Median_pf Sets each pixel to the middlest value of it's neighboring pixels. It is commonly used to remove noise spikes from an image, although the minmax and maxmin filters will probably be more usefull.

Minimize_pf Sets each pixel to the lowest value of the neighboring pixels.

MinMax_pf performs a minimize, then a maximize. The result is very similar to the original but with dark noise removed.

Marage_pf Creates a vertical mirror image similar to a marriage.

Mosaic_pf Converts the buffer into a chunky pixely looking image.

MysticVision_pf Does a zoom effect and adds the result on top of the original.

OptimizedPalette_pf Converts the buffer to the appearance of an 8 bit image using an optimized color table and random noise dithering.

RubberSheet_pf Maps the buffer onto a polygon with control points.

Spherize_pf Maps the buffer onto a sphere with lighting effects. Use the left mouse button to move the first light and the right button to move the second light.

Zoom_pf Applies a zoom effect from the center. Any programmers care to finish this plugin. It just needs an interface to set the x and y coordinates of the center. Source codes in the plugins.zip file.



Import Plugins

bmp_pi Imports a BMP file into the current buffer, erasing the current one. Compression and alpha loading is not supported.



Export Plugins

bmp_px Saves the current buffer as a BMP file. Currently compression and alpha saving is not supported.

iff_px This plugin is not currently functional. It saves all the correct iff header and the body correctly, but it just needs the proper chunky to planer conversion. We have any Amiga people out there that would like to finish this off?

print_generic_px Exports the current buffer to the printer using the current settings. Anybody out there care to write a more flexible version???

printerprefs_generic Opens the windows printer control panel.



Brush Plugins

Store_brush_pb Stores a brush so it can later be recalled. Also useful just for viewing a brush with it's key.

SwapWithBuffer_pb Swaps the main buffer and the custom brush.

bmp_load_pb loads a brush from a bmp file.

bmp_save_pb Saves a brush as a bmp file.

KeyInvert_pb Inverts the key(or alpha) of the current brush

KeyToBlack_pb Creates a new key for the current brush using black as the key color

KeyToLuminance_pb Uses the brightness values of the current brush to create a new key.

KeyToNone_pb Removes a key from a brush.

KeyToPrimaryColor_pb Creates a new key for the current brush using the current primary color as a key color

KeyToSecondaryColor_pb Creates a new key for the current brush using the current secondary color as a key color.



Misc plugins

Alpha grow Enlarges the alpha channel selection.

Alpha shrink Reduces the alpha channel selection.

Clock_pm Displays a clock. Right clicking on the clock brings up some options. Programmers, feel free to add new bitmaps and stuff to the source code...

bColor mixer Displays a panel similar to an artist palette where colors can be mixed.

FieldPack_pm This plugin lets you convert sequences of interlaced frames into non-interlaced using special filters to maintain more detail than simple interpolation provides. It can also extrapolate additional frames using motion analysis and morphing to make 4 frames from every one interlaced frame. Other features include re-interlacing of frames. Fieldpack has it's own help system, so check that for further information.

GradientToVB_pm This plugin writes out Visual Basic source code placing the current gradient into an array.

PaletteToGradient_pm This plugin creates an optimized 256 color palette from the current image and applies it to the current gradient.

PaletteToWells_pm This plugin creates an optimized 64 color palette from the current image and applies it the color wells.

StoreAlpha_pm This plugin stores the current alpha channel for later recall. It also has several options for managing the stored alpha such as adding to, subtracting from or replacing the current alpha.

StoreBuffer_pm This plugins stores the current buffer for later recall.





Programming plugins in Visual Basic

Dogwaffle plugins are standard executable programs that are written in Visual Basic. No restrictions are placed on developers, except that a plugin use only controls that are used by dogwaffle. This will allow plugins to be distributed without an installer. The interface uses automation that is built into Visual Basic and is so well hidden from the programmer, that it only requires one line of code to get things going.
Plugins executables names are appended with "_pf" for a filters, "_pi" for importers, "_px" for exporters, "_pb" for plugins that act on brushes, and "_pm" for plugins that don't fall into any of the other categories. This convention is only so dogwaffle can neatly categorize it's plugins.
To get a list of all available functions and their descriptions, create a reference to dogwaffle in Visual Basic (Project menu/References...) and use the Object Browser (View menu).
The following components are used by dogwaffle:
Microsoft common dialog 6.0 (sp3)
Microsoft common controls 5.0 (sp2)
Microsoft Rich Text Box 6.0 (sp3)
It is recommended that you use only these components and remove any additional components and references. If you use additional components or referees, you may have to include an installer for them (so I recommend getting by with the basics).

To access the plugin interface functions, you create a dogwaffle object. It sounds scary if you haven't done it before, but It's really simple, only one line (or two if you count the dim statement), then everything works the way your used to dealing with stuff in Visual Basic.
'create a dogwaffle object
Public Dogwaffle As Object
Set Dogwaffle = CreateObject("Dogwaffle.Dogwaffle_Class")
'now you can use any dogwaffle method (or function)
'like this
'Dogwaffle.Refresh 'refreshes the screen



Reference of plugin interface methods:

This may or may not be a full listing. Look at the example code if your not sure how to use anything. Code for all of the current plugins is provided in the directory were dogwaffle is installed.

Sub Dog_ActivateCustomBrush()
Activates the custom brush tool.

Property Dog_BufferHeight As Integer
read-only
The hight of the main buffer in pixels

Property Dog_BufferWidth As Integer
read-only
The width of the main buffer in pixels

Function Dog_CreateEmptyBrush(BrushWidth, BrushHeight)
Creates a new empty custom brush of the given size. Returns -1 if could not be created.

Function Dog_GetABuffer()
Gets a copy of the alpha channel in a variant

Function Dog_GetAlphabits() As Byte
Returns a value that indicates the activation state of the alpha channel

Function Dog_GetB(X As Integer, Y As Integer) As Long
returns the blue attribute of the specified pixel.

Function Dog_GetBBuffer()
Gets a copy of the main green buffer in a variant

Function Dog_GetBrushABuffer()
Gets a copy of the current working custom brush alpha buffer.

Function Dog_GetBrushBBuffer()
Gets a copy of the working custom brush blue buffer

Function Dog_GetBrushGBuffer()
Gets a copy of the working custom brush green buffer.

Function Dog_GetBrushHeight() As Integer
Gets the height in pixels of the current working custom brush.

Function Dog_GetBrushRBuffer()
Gets a copy of the working custom brush red buffer.

Function Dog_GetBrushWidth() As Integer
Gets the width in pixels of the current working custom brush.

Function Dog_GetG(X As Integer, Y As Integer) As Long
returns the green attribute of the specified pixel.

Function Dog_GetGBuffer()
Gets a copy of the main green buffer in a variant

Function Dog_GetGradient(Index As Integer)
Gets a copy of the gradient There are 8 indexes altogether. Use Dog_GetGradientIndex to get the one currently selected by the user.

Function Dog_GetGradientIndex() As Integer

Function Dog_GetPrimaryColor() As Long
Gets the primary pen color that is used for drawing with the left mouse button.

Function Dog_GetR(X As Integer, Y As Integer) As Long
Returns the red attribute of the specified pixel.

Function Dog_GetRBuffer()
Gets a copy of the main red buffer in a variant

Function Dog_GetRGB(X As Integer, Y As Integer) As Long
Returns the RGB attributes of the specified pixel in long word format.

Function Dog_GetSecondaryColor() As Long
Gets the secondar pen color that is used for drawing with the right mouse button.

Function Dog_GetSwapBBuffer()
Returns the Swap blue buffer in a variant

Function Dog_GetSwapGBuffer()
Returns the Swap green buffer in a variant

Function Dog_GetSwapRBuffer()
Returns the swap red buffer in a variant

Sub Dog_Lock()
Locks the buffers to prevent them from being accessed you're using them.

Sub Dog_MessageBox(message)
Displays the supplied message to the user

Sub Dog_NewBuffer(width As Integer, height As Integer)
Creates a new dogwaffle buffer (currently erasing the old one)

Function Dog_QuestionBox(message) As Integer
Prompts the user with a OK/Cancel requester. Result is 1 for ok and 2 for cancel.

Sub Dog_Refresh()
Refreshes the display after you've made changes.

Function Dog_RequestFile_Open(Title As String, Filename As String, Pattern As String) As String
Displays an Open file requester. Result is a filename or ""

Function Dog_RequestFile_Save(Title As String, Filename As String, Pattern As String) As String
Displays a Save file requester. Result is a filename or ""

Sub Dog_SaveUndo()
Saves an undo

Sub Dog_SendFormObject(NewObject As Object, showmode As Integer)
A form in Visual Basic is a window with controls and various subroutines attached. The whole crazy thing is handled as an object and can thus be treated as a single thing referenced by a variable of type Object. Dog_SendFormObject sends an instance of a form object to Dogwaffle and displays it as part of the dogwaffle interface.

Sub Dog_SetABuffer(abuf)
Sets the alpha buffer with the supplied array.


Sub Dog_SetBBuffer(bbuf)
Sets the blue buffer with the supplied array.

Sub Dog_SetBrushBBuffer(bbuf)

Sub Dog_SetBrushGBuffer(gbuf)

Sub Dog_SetBrushRBuffer(rbuf)

Sub Dog_SetGBuffer(gbuf)
Sets the green buffer with the supplied array.

Sub Dog_SetPrimaryColor(R As Byte, G As Byte, b As Byte)
Sets the primary pen color that is used for drawing with the left mouse button.

Sub Dog_SetProgress(progress As Single)
Sets a value to the visible progress bar on the plugin interface. Progress is a value between 0 and 100.

Sub Dog_SetRbuffer(rbuf)
Sets the red buffer with the supplied array.

Sub Dog_SetRGB(X As Integer, Y As Integer, R As Byte, G As Byte, b As Byte)
Sets the specified pixel in the main buffers to the value r,g,b.

Sub Dog_SetSecondaryColor(R As Byte, G As Byte, b As Byte)
Sets the secondary pen color that is used for drawing with the right mouse button.

Sub Dog_SetSwapBBuffer(jbbuf)

Sub Dog_SetSwapGBuffer(jgbuf)

Sub Dog_SetSwapRBuffer(jrbuf)

Sub Dog_Unlock()
Unlocks the buffers for use by the user (if no other plugin still holds a lock).

Function Dog_ValueBox(Title As String, Min As Integer, max As Integer) As Integer
Prompts the user for a value within a specific range. Result is the value or -1 if canel.


And that's about it. The example source code is in a zip file that shipped with dog waffle. The plugin examples may be freely modified and distributed. That's what it's there for. Most of it is fairly simple.




Example plugin

Here is a very simple example of a plugin. The following is the complete program. Just paste it into an empty project with no forms, and one module. That's it.

Sub Main()
'*** NEGATIVE FILTER EXAMPLE ***
'to use this example, create a visual basic project with no forms
'and one empty module and paste this code into it.  that's it.
'dogwaffle should be running when this code is executed.

Dim x As Integer, y As Integer
Dim r As Byte, g As Byte, b As Byte
'allocate the main buffers
Dim MainRBuffer() As Byte
Dim MainGBuffer() As Byte
Dim MainBBuffer() As Byte

'create a dogwaffle object
Dim Dogwaffle As Object
Set Dogwaffle = CreateObject("Dogwaffle.Dogwaffle_Class")

'get the width and height of the buffer
th = Dogwaffle.Dog_BufferHeight
tw = Dogwaffle.Dog_BufferWidth

'get the buffers
MainRBuffer() = Dogwaffle.Dog_GetRBuffer
MainGBuffer() = Dogwaffle.Dog_GetGBuffer
MainBBuffer() = Dogwaffle.Dog_GetBBuffer

'process the buffers.
'in this case, a negative effect.
  For y = 0 To th-1
   For x = 0 To tw-1
      r = MainRBuffer(x, y)
      g = MainGBuffer(x, y)
      b = MainBBuffer(x, y)
      MainRBuffer(x, y) = 255-r
      MainGBuffer(x, y) = 255-g
      MainBBuffer(x, y) = 255-b
    Next
  Next

'send the buffers back to dogwaffle.
Dogwaffle.Dog_SetRbuffer MainRBuffer()
Dogwaffle.Dog_SetGbuffer MainGBuffer()
Dogwaffle.Dog_SetBbuffer MainBBuffer()

'and refresh the screen
Dogwaffle.Dog_Refresh

End Sub





Menu items.

File menu
Buffer menu
Brush menu
Filter menu
Alpha menu
Windows menu
Prefs menu
Help menu





File menu

New... closes the current buffer and creates a new one of a specified size.

Open... closes the current buffer and opens a new one from a targa file. If the new file is the same size as the existing one, the current is overwritten and the swap buffer remains as it was.

Open plugin... Displays a list of import plugins. Currently BMP is supported. More may be provided at a future date or developers are welcome to create there own.

Save... Saves the current buffer as a targa file. Note that only the current buffer is saved. If your using layer mixing, you'll have to combine the layers first before saving.

Export plugin... Displays a list of export plugins. Currently BMP and printer exporters are provided. IFF is under developement.

Quit Exits project dogwaffle.



Buffer menu

Undo Erases previous actions.

Redo Redraws undone actions.

Clear Clears the current buffer to the secondary color.

Store... Stores a copy of the current buffer so it can be recalled later.

Buffers/Swap buffers Swaps the current and spare(or swap) buffer. The swap buffer is a place for storing temporary images or may be used for layer mixing. It's also used by some filters.

Buffers/Copy to Swap Copies the current buffer to the swap buffer.

Buffers/Copy swap to Alpha Copies the swap buffer to the alpha channel, converting it to 8 bit greyscale in the process.

Buffers/Copy Alpha to Swap Copies the alpha channel to the swap buffer. It then may be edited and copied back. Provides a means of working on the alpha channel.

Flip Flips the buffer and the alpha channel horizontally or vertically (but not the swap buffer).

Rotate Rotates the buffer, the swap buffer, and the alpha channel clockwise or counterclockwise.

Resample... Scales the buffer, swap buffer, and the alpha channel to a specified size.

Crop to Selection Changes the buffer to the size of whatever is in the alpha channel. Usually used with the 'rectangle to alpha' tool.

Greyscale Converts the buffer to a greyscale. You have the option of mixing the channels in a way that is appropriate for a composite monitor or as a simple average. The best way to tell the difference is to apply to color bars. The buffer is maintained at 24 bits, with the red, green and blue channels each containing the same image.

Invert Converts the buffer to a negative.

Dynamic range Examines the buffer and increases the contrast to the highest possible value without loosing any color information.

Fill Fills the entire buffer with the current fill settings.

Paint fill Applies a paint like effect to the current selection. The effect is controlled by the current opacity and paper settings and is warped nicely to the shape of the selection.

Adjustable paint fill Applies a paint like effect to the current selection and then presents a rubberband to control the orientation of the effect. The effect is controlled by the current opacity and paper settings and is warped nicely to the shape of the selection.

(Tip) Blurring the alpha channel selection will provide a softer raised effect, but it is also based on the current paper texture.

Buffer info... Displays the width, height, and memory usage of the current buffer.



Brush menu

Copy selection Creates a brush from the buffer using the alpha channel as a cookie cutter. Using the Brush selector tool on the tool panel may be simpler in many cases.

Load... Loads a new brush from a file.

Save... Saves the current custom brush to a file.

Free Frees the memory used by the current custom brush.

Brush Plugin... Opens the plugin panel to the brush tab. See the section on plugins for more info.

Mode/Color Custom brushes are painted to the buffer in the normal fashion.

Mode/Matte Only the brushesÆ key (or alpha) is used with the current drawing color.

Make seamless... Blends the edges of a brush to get a more seamless transition from one edge to the other.

Transform/Flip Flips the brush horizontally or vertically

Transform/Rotate... Rotates a brush by a specified value

Transform/Scale... Scales the brush to a specified size.



Filter menu

Adjust
Color
Blur
Sharpen
Convolve
Noise
Transform
Video
Artistic
Render
Combine with swap
Composite with swap
Displace by swap
Emboss by swap
Filter plugin...


Fade last action... Mixes the current buffer with what's stored in the most recent undo buffer.

Adjust/Color... Lets you adjust the R,G,B channels of the buffer separately

Adjust/Value... Displays a histogram of the current buffer and lets you adjust the Brightness, contrast and gamma. A histogram is a graph of the brightness values stored in a buffer.

Adjust/Saturation... Adjust the saturation of the buffer.

Adjust/HSV... Adjusts the Hue/Saturation/value of the buffer.

Color/Map to gradient The brightness of each pixel becomes an index into the current gradient, mapping the color at that index onto the pixel.

Color/Negative Performs a simple average of the red, green and blue channels to get a greyscale image. The buffer is still maintained at 24 bit depth.

Color/Invert value Creates a negative of only the brightness component of an image, leaving the hue and saturation intact.

Color/Power curve The formula for this function is gamma(Saturation*Value). Saturation is reduced more for lower values.
The idea was to simulate the way Human vision is less sensitive to color in low lighting.

Color/swap channels Exchanges the Red, Green and Blue channels.

Color/Roll channels Rolls the Red, Green and Blue channels, so that red becomes green, green becomes blue and blue becomes red.

Color/Eight bit dither Applies 8 bit dithering techniques to the buffer. While the apparent color is reduced, the buffer is maintained at 24 bit depth. Optimized computes a palette of 256 colors from the image and mappes to it. Ordered and random dither uses a fixed color space where each component is quantized to 6 steps.

Color/One bit dither Applies 1 bit dithering techniques to the buffer. The random dithering is useful for generating a stipple effect. The buffer is maintained at 24 bit depth.

Color/Posterise... Reduces the number of colors in an image so that banding becomes evident. The buffer is maintained at 24 bit depth.

Blur/Simple blur Performs a simple box filter convolution to the buffer. Every pixel is averaged equally with each of its neighbors. The result is a slightly blurry image. If you plan on performing further convolution such as edge detect, then consider using the gaussian blur filter instead.

Blur/Gaussian blur... Performs a guassian blur where the pixels are averaged with the middle pixel receiving the highest weight.

Blur/Custom blur... May some day be useful for creating 'circle of confusion' effects like those that are produce by real cameras.

Blur/Light diffusion... Simulates the way light is diffused by an optical system, creating that 'dreamy' effect if overused.

Blur/Motion blur... Creates the effect of motion blur by blurring in a single direction.

Blur/Zoom blur... Creates the effect of zooming toward or into an image.

Sharpen/Shapen Enhances the apparent sharpness of an image by increasing the contrast between neighboring pixels.

Sharpen/Unsharp mask While it sounds like the opposite of sharpen, unsharp mask sharpens in a more analytical way by only sharpening areas of higher contrast.

Convolve/Edge detect Detects the edges of items in an image and gives them a solid outline similar to a pencil drawing.

Convolve/Emboss... Give an image a stone carving look.

Convolve/Color Emboss... Adds the appearance of relief to and image.

Convolve/Maximize Spacially expands areas of lightness in an image.

Convolve/Minimize Spacially expands areas of darkness in an image. Might be used several times to create a painting like effect.
Convolve/Median Spacially expands the average color in an image. This filter is useful for removing isolated noisy pixels from an image without adversely altering it's appearance.

Convolve/MinMax This filter is useful for removing isolated bright pixels from a dark background.

Convolve/MaxMin This filter is useful for removing isolated dark pixels from a light background.

Noise/Value... Randomizes the brightness component of the buffer.

Noise/Color... Adds random values to the red, green, and blue values of the buffer.

Noise/Jitter... Displaces the pixels in a buffer by random values.

Transform/Shift... Lets you move the pixels of the buffer around as if sliding a sheet of paper on a table. This lets you expose the edges of an image so you can work on making a seamless image, or like whatever.

Transfrom/Warp mesh... Presents a grid with control points that can be dragged around. The image deforms to the shape of the grid in real time. Warp mesh requires that Direct X 7 be installed. It is not included, so if you need it, you'll have to find it elsewhere. Probably the Microsoft web sight would be a good place to look.

Transform/Isometric 3D... This filter converts in image into what appears to be a 3-dimensional landscape by using the brightness value of each pixel as a Z coordinate. This filter works best if the buffer is square. A color may be dragged from the color wells onto the light color gadget, or a color may be picked from the Windows color dialog. The inverse of the specified light color will be used to fill in shade areas. Height is the maximum number of pixels to displace the z coordinates. Shading quality determines if the slope of each pixel is calculated only by the neighboring pixel, or by multiple pixels. Shading intensity determines the contrast between the light and dark areas, and Shading depth determines the smoothness of the surface. Gloss and specular work together to specify the shininess of the surface, while the effect is greatly dependant of the shading depth. Color from swap uses the pixels of the swap buffer to paint the surface of the landscape.

Video/Slate Creates an NTSC style color bar pattern.

Video/De-Interlace Images captured from video footage will likely be interlaced. Interlace is the way images are stored as 2 even and odd planes (or fields) in a single image. This allows video systems to display 60 images per second with only 30 frames. But the side effect, if you look at individual frames of video, is that that images that contained movement appear to jitter on a TV monitor. This is because the two fields of the frame are actually being displayed one at a time, switching back and forth very quickly. The De-Interlace filter uses a vertical-only blur convolution to blend the two fields of the image together and removes the flicker. A plugin called Feild pack is provided that provides much more sophisticated handling of interlace video. It also allows sequences of frames to be processed.

Video/Reduce flicker Similar to De-interlace, but doesnÆt remove as much high frequency detail.

Video/Video lines Simulates the visible scan lines found on a television monitor.

Artistic/Apply paper... Applies the currently selected paper texture to the buffer. It's perfectly ok to select the paper texture from the tool panel while this filter is open.

Artistic/Wet paint... Extrudes pixels to give the appearance that paint is running. Using a positive value makes the lighter colors run, and a negative value makes the dark pixels run.

Artistic/Brush strokes...

Render/Plasma noise... Renders fractal noise. Iterations is the number of times the recursive subroutine zooms in on the noise, increasing the detail. A small iteration gives a finer, higher frequency noise.

Render/Bumpy toy... Renders fractal noise, then applies a gradient to it. Using this, you could create the appearance of things like marble or clouds.

Render/Radiant... Allows you to create brilliant lens flares and reflections like those of a real cameras optical system. The connection between Dogwaffle and radiant isn't implemented yet, so for the time being, you'll have to save out your image in radiant and load it as a brush in dogwaffle.

Combine with swap/Mix... Allows mixing between the main and swap buffers.

Combine with swap/Alpha blit... Copies the swap buffer to the main buffer, using the alpha channel like a cookie cutter.

Combine with swap/Premultiplied alpha blit... Copies the swap buffer to the main buffer through the alpha in a way that preserves the brighness of the original. Say you did a normal alpha blit of a text logo with a lens flare onto a light background, the edges of the lens flare would appear dark grey. Premultiplied compositing adjusts for these situations.

Combine with swap/Additive Adds the swap buffer to the main buffer. The formula is simply Main(r,g,b) + Swap(r,g,b). If values exceed 255, they're clipped.

Combine with swap/Subtractitive Subtracts the swap buffer from the main buffer. The formula is Main(r,g,b) - Swap(r,g,b). This is often used for finding the difference between two images. Pixels that are exactly the same will become black, where as pixels that are different between the two images won't.

Combine with swap/Mulitiply Multiplies the two buffers and divides them by 255. One of my personal favorites. This filter is very useful when doing watercolor like paintings. You can paint on one buffer, then go to the other and paint something else, and combine the two as if you were painting on top of dry watercolor paint.

Combine with swap/Divide Divides the two buffers. I've yet to find a use for it.

Combine with swap/Screen Inverts and multiplies the two buffers. The result is a sort of additive where the brightness never produces clipping.

Comine with swap/Luminance Combines the two buffers using the brightness of the swap buffer as a key.

Combine with swap/Compliment Combines the inverse of the swap buffer using the color of each channel as a key.

Comine with swap/Around gray Combines the two buffers so that values above 127 are additive and values below 127 are subtractative.

Combine with swap/If lighter Combines if the value in the swap buffer are lighter then the values in the main buffer.

Combine with swap/If darker Combines if the values in the swap buffer are darker than the values in the main buffer.

Combine with swap/Texturize Multiplies the average of the swap buffer with the main buffer.

Combine with swap/Binary This is a way to dither an image down to 2 colors with the dither pattern being controlled by the swap buffer. You could for example use random noise, an ordered pattern, or a series of small circular gradients to create a halftone.

Composite with swap/Greenscreen Performs the equivalent of a traditional green screen composite. Combines the main buffer with the swap through a matte that is based on the green content of the image. The two sliders control the closeness of the matte. The High clip slider determines how low a value of green will be considered part of the matte, while the low clip determins how much green will be ignored as part of the matte.

Composite with swap/Bluescreen See Greenscreen above.

Displace by swap/Displace Displaces the pixels of the main buffer by the value of the pixels of the swap buffer. The pixels are displaced on x by the red channel, and on y by the green channel.

Displace by swap/Cloaking displace Displaces the pixels in each channel of the main buffer by the values of the channels of the swap buffer in a way that is reminiscent of the Bird of Prey decloak effect. The effect was originally achieved by throwing off the timing of the film negative.


Emboss by swap/ Embosses the main buffer by the brightness levels of the swap buffer.

Filter plugin... Opens a panel displaying the available plugin extensions to Dogwaffle.

Plugins






Alpha menu

The alpha channel is similar to a matte, or friskette. Anything you paint through the alpha channel will have varying levels of opacity depending on what's in the alpha. It's possible to add primitive shapes to the alpha with the rectangle_to_alpha and Ellipse_to_alpha tools and the tool panel. It's also possible copy a buffer directly to the alpha channel using Image/Buffers/Copy Swap Buffer To Alpha.

Select all Sets the entire alpha channel to 100%. Use this when you want to make a brush from the entire buffer with Brush/Copy selection. Otherwise, there's not much need for it since everything acts the same as having the alpha channel turned off.

Clear alpha Clears the alpha channel and turns it off.

Alpha on/off Sets the activation status of the alpha channel, but doesnÆt effects what's in the alpha.
Invert alpha Inverts the content of the alpha channel.

Blur alpha Blurs the content of the alpha channel.





Window menu

Panels/Zoom... Opens the zoom panel. With it you control the size that the main buffer window appears on screen. The image size itself doesnÆt change.

Panels/Fat bits... Opens another window to display an independent view of the buffer that may use a different magnification than the main window. It allows you to work on one portion of the buffer, while seeing the entire buffer at the same time.

Panels/Fill Gradients... Opens the Fill/Gradients panel.

Gradients
Fill tools


Panels/Brush options... Opens the brush options panel.

Brush options


Panels/Optipustics... Opens the Optipustics panel.

Optipustics


Refresh Refresh the screen if it needs it.

Unlock Unlocks the buffer if a plugin has accidentally left it locked.





Refresh methods/Default, Bitmap, Simple Determines the manner that the screen buffer is sent to the display hard way. Bitmap should be select unless using really old display hardware. Hopefully these options will be removed in the future altogether.

Refresh methods/Force 15 bit If you're using hardware that only supports only 32 thousand colors, then enable this options. I've seen a few older high-end 3d cards that were like that.

Refresh methods/Optimized Was intended to shave off a few microseconds from the screen update by only sending the part of the buffer that changes, but I'm not sure it every really worked. It doesnÆt work under NT or 2000. It was pretty hard to wrench any kind of performance back then. At least DirectX makes it all get out of the way.

Backdrop/Mdi Background bitmap Allows you to select a Windows bitmap file as a new backdrop. MDI stands for multiple document interface, by the way.

Backdrop/Mdi background color Set the color for the backdrop if not using a bitmap.

Save settings Saves the current preference settings to the registry so they'll be recalled the next time the program starts. Dogwaffle doesnÆt force settings on you every time you exit, like most programs for the pc.

Memory options... Determines how many megs of ram to set aside for multiple undo's. If you're using a machine with less than 32 megs, then first get more ram, but also set this to a lower value. Dogwaffle otherwise dosn't require a huge amount of ram, so if you have plenty, then set this to a higher value. I usually use around 12 megs. For video res images, thatÆs plenty. You'll have to save the settings if you want this to stick.

Save wells... Saves the current set of color wells on the tool panel to a file.

Load wells... Loads a set of color wells from a file. A file called Def_well.wl will be loaded each time the program starts.



The help menu

About Project Dogwaffle Displays the splash screen.

Project Dogwaffle Help Displays the document you are reading.



Dogwaffle FAQ

 

Why another image editor?
Dogwaffle isn't an image editor, it's a paint program for creating original images.

How do I use Dogwaffle as a plugin for Photoshop?
You don't. Photoshop and Dogwaffle are two seperate things altogether.

Can I use Photoshop filters?
No. Dogwaffle has it's own flexible plugin architecture that's in no-way compatible with Photoshop.

Can I use Dogwaffle brushes in Photoshop?
No, unless someone really wanted to convert them into whatever format they use.

Photoshop is the only graphics software I'll ever need.
If you think that, you're probably right.

Dogwaffle isn't as good as my pirated copy of Photoshop.
Why are you even telling me this!

How does Dogwaffle compare with Painter?
They're both tools. Don't worry about it -- just use what you like.

How is Dogwaffle different from other paint programs on the PC?
The ability to easily create and work with custom brushes is quite nice. The real-time filters are hard to live without once you're used to them. The workflow has particular non-pc feel to it but may take some getting used to for the un-initiated. The swap buffer is very useful. Dogwaffle is 100% freeware, so no theft is needed to run it.

I don't know how to do anything.
Keep in mind that right and left mouse buttons both have special functions for almost all of Dogwaffles tools. For the most part, left clicking selects the tool, and right clicking brings up a menu of options.

Does Dogwaffle only load Targas?
Dogwaffle loads nearly 70 formats. Set the 'Files of type:' gadget in the load dialog to 'all supported files.'

The background doesnÆt stretch all the way on 1800x1600 screens.
Dogwaffle currently doesnÆt stretch its backdrop. You're welcome to load a different background image and save it as the default.

Why is it so slow?
It isn't.
Are you running Windows ME? Nuff said. Seriously, menus are a bit slow under ME. I don't know why.
Are you running in 15 or 24 bit mode. These screen modes aren't that common anymore and arenÆt fully supported.
If it works for you, you can select the 'optimized for 95/98/me' option. Not all video cards support this under NT/2000.

Why isn't the text tool better.
My personal philosophy - text has been done to near perfection in software such as Aura. I don't care to compete with applications I have so much respect for. Plus, to me, text is dull.

Why only two layers?
More will be available later. I just finished support for redirecting brush output to arbitrary channels, and thatÆs at least one problems out of the way for supporting multiple layers with alpha blending. For now, there's a lot you can do with two layers.

I get lost and don't know what's going on.
Try pressing the 'esc' key. This clears all of the brush settings to their default settings.

Are there any tutorials?
Only a few.

What's an SKD?
Software development kit. If you don't know what it is, you don't need it.

Can I load and save Gifs?
No.

Will it load IFFs?
Sorry.

Can I set the quality level of JPG's?
Yes. Select Jpeg as the 'Save as type' in the file dialog. When you save, you'll get a panel asking for the compression quality.

What formats are supported for saving?
Currenly Targa, Bmp, Jpeg, Png, Psd (single layer), Tiff. More may be along later if anyone asks for them.

What's a 'swap buffer'?
Pressing the 'j' key will swap between the main buffer and the swap buffer. This extra buffer is there for your convenience. Use it for whatever you like. Some filters use the swap buffer as a source for certain effects, such as displacing one image by another. You may copy temporary images to the swap buffer to store for later, or you may paint through one buffer onto the other.

Do squirrels really eat acorns?
Yes they do, but they don't hibernate. You should never feed squirrels raw peanuts.

What's a custom brush?
You can create and paint with your own brushes. Some image editors requre brushes to be loaded from disc, but Dogwaffle lets you create and modify them on the fly. Once you pick up an image from the screen, it behaves just like a normal brush. The brushes transparency is controlled by a key color. This transparency can be modified on the fly in the brush key editor.

How do I flip the primary and secondary colors?
All color gadgets in Dogwaffle support drag-and-drop. Simply pick one up and drop it over the other - the two colors will be swapped.

I don't like using the Windows color editor when selecting colors for filters.
You don't have to. Since dogwaffle makes full use of drag -and-drop, simply drag colors from the wells, or the primary or secondary colors onto the color gadget in question. The same goes for the gradient editor -- You can edit the colors in a gradient manually, or you can drop colors onto the little dotted line below the gradient.

I don't like the computer style color mixers.
The mixer button at the bottom of the tool panel opens up any number of copies of the palette mixer. You can use this to mix colors, or you can pick a brush that you've already created to use as a palette.

What's up with color mixing in Dogwaffle?
You have a primary and secondary color - these correlate to the right and left mouse buttons. You can mix and paint with a separate color for each button.

What's up with rgb2?
These mixers let you select a color with only one mouse click by dragging across the three color bars.

What's up with the rectangle and circle tool?
There's a diagonal line going through each icon. Left clicking in the top left corner activates the tool as 'outline only' and clicking in the bottom right activates the tool as filled.

All I can paint is tiny little leaves and things.
Dogwaffle wasn't designed to be limited by the small selection of presets that are built into the program. That's why you can create your own brushes.

How are custom brushes just like regular brushes.
There are two modes, Color and Matte (F1, F2) Matte mode lets you use the custom brush just like a regular brush, with the color being determined by you primary or secondary color.

How do I create 'selections'?
Dogwaffle doesnÆt do selections exactly -- It does an alpha channel. The second row of icons are the alpha channel tools. It goes something like 'lasso to alpha', 'rectangle to alpha', 'ellipse to alpha', and 'magic wand' using these tools allow you to exclude areas of you picture from being effected by drawing operations.
holding 'ctrl' lets you drag your 'selection'
holding 'alt' lets you modify your 'selection' by adding with the left mouse button, or subtracting with the right mouse button.
Selecting the menu item 'Brush->Copy all/selected' lets you pick up the selected part of the image and paint with it as a brush.

I don't like Dogwaffle. There's too much to learn and it's not like Photoshop.
If you don't mind learning stuff, then you'll get more out of it.

I don't like the way zoom is handled.
Me either.

How well does dogwaffle work with Windows XP?
I don't know.

How much ram is required to run Dogwaffle?
A good rule is twice as much as your OS requires. So 64 megs for Win98, 256 for ME, and 512 for XP. Hey, I don't make this stuff up.

How do you feel about developing for Windows?
Im sure Windows is fine for writing spreadsheets and databases. It's not really designed for doing this sort of stuff well, so I do my best with what's there.

Why isn't there a Mac version?
I never got around to getting a Mac. I'm sure they're lovely computers. For now, I'm stuck with a PC.

Why isn't there a Linux version?
Frankly, I've not been able to get Linux to run on any of my machines.

What's up with all the Amiga conventions?
What can I say, I worked on the machine for the better part of a decade. I'm sure there's a dozen people out there who would appreciate this stuff. Amiga was way ahead of it's time, with a real preemptive multitasking OS that could run in less than 512 k, hardware graphics manipulation such as bit blitting, 12 bit color (when the pc could handle maybe 16 colors), video compatibility, fast compressed animation playback from ram, near unified memory architecture, etc. Back then, the 68000 processor was ridiculously simply to program in assembler and applications were relatively fast. All of this power led to some breakthrough applications that have yet to be fully duplicated. (I'd have to applaud Newtek for bringing Aura to the PC. It's one of my favorite applications now.) I'm not saying that we should all go back to using Amigas, but we sure did loose a lot of good things along the way.

Was Dpaint really all that great?
I'm sorry, but yes it was. Sure it had a long way to go to become what is considered a modern image editor, but it did so many things that were appropriate for the time. Animation was the biggest thrill of using Dpaint. Animations could be created on machines with a small amount of ram, even as little as 1 meg, and were fully interactive withought the need for building previews. Anim brushes were also a big plus. TodayÆs image editors have canned 'tubes' of image sequences, but Dpaint let the user quickly create and play with animated brushes on the fly. They were really cool.

What breakthroughs have there been since Dpaint went out of style?
Processors are about 35 times faster although they're held back by software memory management and memory bandwidth. 32 bit display hardware is common these days. Natural painting has come a little ways since then. Dpaint 5 had basic paper support, a cheesy airbrush tool, and tablet support that I could never get drivers for. Layers would seem to be the big thing. I had never fully considered them when I laid the groundwork for Dogwaffle. Image processing techniques have been better standardized and documented since then. It's really become academic.

What went wrong with PC's
I hate to say it, but object oriented programming has gotten out of control. It's not really efficient or applicable to performance coding.
Even though there's some good 3-D hardware out there, there is no hardware for general image processing aside from maybe gamma correction. MMX was meant to help speed up multimedia applications, but it's implementation is so general that it's not really useful. MMX mainly consists of a re-implementation of existing processor functions such as copying and performing math in registers, but in such a way as to allow a few bytes to be operated on at the same time. The problem is, there are few image processing specific operations such as pushing data through a lookup table, or applying what are now pretty much standard convolutions, etc. Worse, MMX requires assembler programming. Programming assembler on the PC is a pain at best, and there are few resources available on the subject. Even Microsoft has yet to fully support MMX in their development environments. Lately, processor development seems to be going backward in the name of better advertising. The Pentium 4 has traded less operations per clock and a smaller cache for faster clock speeds.

On the bright side?
On the bright side, Dogwaffle takes advantage of some fairly powerful processors (Particularly Athlons) and a lot of optimizations to make for relatively real-time image processing. When Intel gets the kinks out of their Pentium 4's, they should really shine too.

What's up with Visual Basic?
I like VB. It's easy to create Windows applications, and it produces good, reliable, and even fast code with a little know-how. Microsoft seems to be moving away from what I like about it though. It's my understanding that future versions will no longer support native code. I won't be moving to these new versions. Rather, I'll be pushing to get more of the code ported to C, which is up to twice as fast, or even assembler if needed. Already, most of the image processing code is already implemented in C and assembler.

What's the future of Dogwaffle?
Version 1.1 should feature a stroke recorder and built in lens flare editor
Version 1.2 might address tablet issues to a small extent, but don't count on it I still have a lot of problems to work out.
Version 1.3 may support layers, but only if I feel like it at the time.
There is no planned version 1.4
Version 1.5 might address issues with a basic timeline.

Are there hidden features in Dogwaffle?
Check out the keyboard shortcut reference in the help menu.

I don't know how to use Radiant.
Well, there's a lot to it. It was developed as a stand-alone application, so it's integration with Dogwaffle is not all it could be. Your best bet is to experiment with it. Your output can be copied back to Dogwaffle at any time with the 'Copy to Dogwaffle' button. The output is then sent to Dogwaffle as a new custom brush.

What's that FieldPack thing?
The field pack plugin lets you take an image sequence recorded from video and extrapolate extra frames by detecting motion in the video and morphing between the frames to get a new frame.

I don't like the default colors.
You can edit your own, select from the list of presets, or create a new set with the 'build palette from buffer colors' plugin. It's selected from the menu when you right click on the mixer button.

What are Optipustics good for?
I don't know, but there they are.