Change Log
----------

  V0.40
  
  - First alpha release.
  
  - Fixes:
    - PALib support removed.
    - Pointer to selected day button in calendar resets to NULL when new month
      selected; prevents day button incorrectly popping up if same button is
      clicked in new month.
    - Calendar::getPreferredSize() returns valid values.
    - Label text is greyed out when disabled.
    - Huge speed increase in Calendar::resize().
    - Calendar's child controls correctly fill entire available space.
    - Calendar correctly selects date if new day is the same as old day but in
      a different month.
    - Gadget drag event only raised if stylus is actually moved whilst dragging
      mode active.
    - ScrollingPanel drag and scroll events only raised if stylus is actually
      moved whilst dragging mode active.
    - MultiLineTextBox greys out text when disabled.
    - MultiLineTextBox::removeText() correctly repositions cursor.
    - TextBox greys out text when disabled.
    - Scrolltest compiles correctly.
    - SimpleScreen and SimpleWindow helper gadgets removed.
    - Renamed LinkedList to WoopsiLinkedList and LinkedListIterator to
      WoopsiLinkedListIterator to avoid type clashing with LinkedList in devkit.
    - Tidied up woopsifuncs.h.
    - SuperBitmap::getBitmap() returns a pointer to the Bitmap object instead of
      the Bitmap object's raw pixel data.
    - Moved skinned gadgets out of main library and into bonus folder.
    - Removed fatInitDefault() stub method for SDL out of individual .cpp files
      and into nds.h.
    - dimmedscreen.h includes woopsi.h.
    - Graphics::drawBitmap() clips correctly if bitmap destination co-ords are
      greater than the size of the destination bitmap.
    - GraphicsPort::drawPixel() clips correctly.
    - GraphicsPort::drawXORPixel() clips correctly.
    - Replaced DMA_Force and DMA_Copy with woopsiDmaForce() and woopsiDmaCopy()
      to fix ancient problems with DMA not seeing latest RAM state.
  
  - New Features:
    - Calendar test added.
    - MultiLineTextBox test added.
    - TextBox test added.
    - Added an overload to GraphicsPort to print a length of a string in a
      specific colour.
    - Restructured directories into traditional library layout.
    - Upgraded main project to VC++ 2008.
    - Added libwoopsi.a to SVN.
    - Added template example that uses libwoopsi.
    - Reorganised demo code into new demo directory.
    - BitmapIO class can load 16-bit BMP images with any pixel encoding.
    - BitmapIO class can load V3, V4 and V5 DIB headers.
    - BitmapLoader example illustrates loading of most supported BMP types.
    - Added skinned gadget example.
    - Added SkinIO class to bonus folder - loads skins from disk.
    - Added BitmapBase class to define basic interface for a bitmap.
    - Added BitmapWrapper to enable included (not loaded) bitmap data to be used
      as a read-only Bitmap object.
    - Moved drawing code out of Bitmap class into new Graphics class.
    - Added MutableBitmapBase class to define basic interface for an editable
      bitmap.
    - Added FrameBuffer class to wrap framebuffer inside a bitmap class.
    - All references to DrawBg array now work with frameBuffer array.
    - Added GraphicsUnclipped to perform raw unclipped bitmap drawing.
    - GraphicsPort inherits from GraphicsUnclipped in order to reduce code
      repetition.
    - Font system uses new Bitmap object hierarchy.
    - System fonts available as global objects.
    - Rewritten clipping routine in Font and MonoFont.
    - Reorganised VC++ project with more filters.
    - Rect struct moved out of Gadget class and into separate header.
    - SuperBitmap no longer includes drawing functions; instead it exposes a
      non-const pointer to its bitmap and a non-const pointer to a Graphics
      object that can draw to the bitmap.
    - Added bitmapdrawing example.
    - Added gadgetdrawing example.
    - Added blit() and blitFill() methods to Bitmap and FrameBuffer, and
      signatures to MutableBitmapBase.
    - Added getData(x, y) method to all bitmap classes.


  V0.39 (20091024)
  
  - Fixes:
    - Removed framebuffer-hitting code from DimmedScreen gadget and replaced
      with call to GraphicsPort::dim().
    - ListBox removes itself from its ListData object when deleted.
    - Keyboard example shows cursor.
    - Moved DimmedScreen into woopsi folder as an official gadget.
    - CycleButton::getPreferredDimensions() populates rect with correct values.
    - Const fixed Gadget::getRefcon().
    - Gadget::disable() and Gadget::enable() redraw the gadget by default.
    - Fixed clipRectToHierarchy() bug introduced in switch to non-recursive
      function in last release.
    - RadioButtonGroup redraws when resized.
    - RadioButtonGroup returns correct dimensions from getPreferredDimensions().
    - Updated copyright notice in defines.h.
    - Bitmap::getPixel() works correctly for large bitmaps.
    - Bitmap::drawBitmap() flushes mem correctly for DMA copy.
    - Gadget::show() clears rect cache of sibling gadgets with a lower z-index
      to ensure that they do not draw over the top of the newly-shown gadget.
    - A disabled gadget that overlaps another now intercepts clicks correctly,
      no longer allowing them to fall through to the gadget below.
  
  - New Features:
    - TextBox and MultiLineTextBox cursor moves when d-pad left/right are
      pressed and gadget has focus.
    - Added tests folder:
      - CycleButton test;
      - RadioButtonGroup test.
    - Added BinaryFile class to bonus folder.
    - Added BitmapIO class to bonus folder - load/save BMP files using libfat.
    - Added BitmapLoader example.
    - Added SuperBitmap::drawBitmap() overload to handle Bitmap objects.
  

  V0.38 (20090428)
  
  - Fixes:
     - Removed PALib dependency from filerequester example.
     - FileRequester gadget fixed for devKitARM r24 (Quirky).
     - ListBox redraws correctly when an option is selected in single selection
       mode.
     - Fixed crash in SliderVertical when trying to set value if max and min
       values are the same (Quirky).
     - Fixed crash in SliderHorizontal when trying to set value if max and min
       values are the same.
     - Fixed FileRequester crash when path has trailing slash (Quirky).
     - Fixed double-click in SDL (Quirky).
     - FileRequester fixed for SDL (Quirky).
     - SDL path fixes (Quirky).
     - Escape key to quit in SDL mode (Quirky).
     - WindowBorderTop and SkinnedWindowBorderTop no longer have pointers to
       freed memory if window title changes (Quirky).
     - ScreenTitle and SkinnedScreenTitle no longer have pointers to freed
       memory if screen title changes (Quirky).
     - Flipping window depth with depth gadget no longer results in corrupted
       window contents.
     - Fixed const-correctness of various Text class methods.
     - SDL framebuffers initialised to black.
     - More doxygen fixes.
     - Removed WoopsiArray::begin().
     - Removed LinkedList::begin().
     - Renamed Gadget::draw() to Gadget::redraw() and removed unnecessary
       overloads from all classes.
     - Const correctness fixes in Gadget class.
     - ScrollingTextbox adjusts scrollbar grip position correctly when first
       initialised.
     - Alert box draws XOR rect correctly when released.
     - Requester draws XOR rect correctly when released.
     - WoopsiKeyboard no longer adds itself as the decoration event handler
       twice; fixes XOR rect drawing when clicked/released.

  - New Features:
     - Added Gadget::getChild() and Gadget::getChildCount() (for leonelhs).
     - Added context menu example (for leonelhs).
     - ListData class raises events to ListDataEventHandler objects.
     - ListBox listens for ListData events.
     - Added base template class for event args passing.
     - Refactored gadget event system:
       - Replaced EventArgs struct with GadgetEventArgs class.
       - Renamed EventHandler to GadgetEventHandler.
       - Gadgets can now have multiple event handlers.
       - Replaced handleEvent() method with multiple methods.
       - Removed EventType enum from GadgetEventHandler.
     - ListData events passed by references instead of pointers.
     - WoopsiKeyboard includes a set of new events:
       - Press
       - Release
       - Repeat
     - WoopsiKeyboard no longer stores the last key clicked.
     - WoopsiKeyboard has set of event-related classes:
       - KeyboardEventHandler
       - KeyboardEventArgs
     - Refactored context menu event system:
       - Added ContextMenuEventArgs class;
       - Removed "_value" from ContextMenu;
       - Removed "getContextMenuValue()" from Woopsi;
       - Selected context menu item now accessible via
         ContextMenuEventArgs::getItem().
     - Slider grip automatically resizes; no need to call resizeGrip().
     - End point rects now cached (sans child rects) for extra speed.
     - Gadget rect caching moved into separate RectCache class.
     - RectCache::removeOverlappedRects made non-recursive.
     - Gadget::clipRectToHierarchy made non-recursive.
     - Added GraphicsPort::copy() to copy regions of the framebuffer around.
     - Screen dragging code improved; uses new GraphicsPort::copy() method.
     - Added GraphicsPort::scroll() to scroll regions of gadgets.
     - Removed scrolling code from ScrollingPanel and rely on new scroll()
       method instead.
     - Added GraphicsPort::dim() function to add DimmedScreen functionality to
       all gadgets.
     - Added ability to specify foreground or background clipping when creating
       a new GraphicsPort instance.

  V0.37 (20090112)
  
  - Fixes:
     - ListBox::setAllowMultipleSelections() works correctly.
     - Replaced byte and short iterator variables with ints.
     - Compatible with devKitPro v24 and libnds 1.3.1.
     - Renamed "DynamicArray" to "WoopsiArray" for compatibility with dkp24.
     - Made libnds makefile the default instead of PALib.

  V0.36 (20081104)
  
  - Fixes:
     - s32 used as iterator when working with visible rect cache to prevent
       permanent loops when large numbers of rects were visible.
     - s32 used as child gadget iterator.
     - MultiLineTextBox::resize() correctly recalculates the number of visible
       rows.
     - Tidied up MultiLineTextBox::getRowX() and getRowY().
     - MultiLineTextBox::getCurrentPage() no longer divides by 0 if there are no
       visible rows.
     - MultiLineTextBox::draw() tidied up; correctly draws when partial line of
       text is visible.
     - MultiLineTextBox vertical alignment options all work correctly.
     - MultiLineTextBox scrolls correctly when text is added.
     - MultiLineTextBox has cursor support.
     - Text::stripTopLines() was not removing all characters.
     - Deleted empty fontbase.cpp file.
     - Removed unused "bitmap.h" include from "skin.h".

  - New Features:
     - Moved all classes into WoopsiUI namespace.
     - Added Date class.
     - Added Calendar gadget.
     - Added Calendar example.
     - Added Date example.
     - Added ProgressBar example.
     - Text::wrap() only wraps lines impacted by insert/delete/append
       operations.
     - Replaced unused Bitmap struct with a Bitmap class with drawing routines.
     - Replaced SuperBitmap drawing operations with a Bitmap object.

  V0.35 (20081012)
  
  - Fixes:
     - Renamed "Textbox" to "TextBox".
     - Corrected case of "PackedFontBase.h" include in "packedfontbase.cpp"
       (thanks Gattman, bug 2101099).
     - Removed offcolour pixels from around @ symbol in sysfont bitmap.
     - Moved @ symbol in tinyfont.bmp to correct ASCII location.
     - SkinnedWindows move to front when clicked.
     - Renamed TextBox::TextPositionXXX to TextAlignmentXXX, along with all
       related functions and similar in MultiLineTextBox and ScrollingTextBox.
     - TextBox::addText() was allocating one byte too many when concatenating
       strings.
     - Renamed addText() to appendText() in TextBox, MultiLineTextBox and
       ScrollingTextBox classes.
     - Text::wrap() correctly wraps text rows with no break points.
     - Fixed const-correctness of some Font (and subclass) methods.

  - New Features:
     - Button has different appearance when disabled.
     - CheckBox has different appearance when disabled.
     - ContextMenuItem has different appearance when disabled.
     - CycleButton has different appearance when disabled.
     - RadioButton has different appearance when disabled.
     - Added WoopsiKeyboard gadget.
     - Added all missing 7-bit ASCII glyphs to sysfont.
     - Added keyboard example.
     - Added TextBox::appendText(char).
     - Added TextBox::setText(char).
     - Added MultiLineTextBox::appendText(char).
     - Added MultiLineTextBox::setText(char).
     - Added ScrollingTextBox::addText(char).
     - Added ScrollingTextBox::setText(char).
     - Added WoopsiTimer gadget.
     - Woopsi::registerForVBL() and Woopsi::unregisterFromVBL() now only work
       with timers; all VBL code now is handled with timer gadgets.
     - Removed EVENT_VBL event.
     - Removed Gadget::vbl().
     - AnimButton automatically animates as it has as built-in timer gadget.
     - Added missing glyphs to tinyfont.bmp.
     - Added timer example.
     - Added cursor functionality to TextBox.
     - Added GraphicsPort::drawFilledXORRect().
     - Added GraphicsPort::drawLine() and associated clipping functions.
     - Added WoopsiString class and replaced string handling code in TextBox.
     - Added Label gadget as a base class for TextBox and Button; can be used as
       a read-only, borderless text display gadget.
     - Text inherits from WoopsiString class.
     - Added MultiLineTextBox::removeText() methods.
     - TextBox border bevelled both out and in.

  V0.34 (20080702)
  
  - Fixes:
     - All gadgets have protected copy constructors.
     - Added destructor to DimmedScreen class.
     - Replaced SuperBitmap::drawLine() with a function that works correctly.
     - Fixed crash in SuperBitmap::floodFill() when pixel stack overflowed the
       DS' stack.
     - Fixed bug in SuperBitmap::floodFill() that prevented rows above the
       initial click point being filled and occasionally froze the DS.
     - Fixed path null pointer crash in FileRequester constructor.
     - SuperBitmap::drawHorizLine() no longer tries to DMA_Force() if the width
       of the line is 1.
     - Fixed size of data stored in SuperBitmap floodFill's stack.
     - Removed bitshifts from Screen::Drag() that would prevent resizing the
       screen on alternative platforms.
     - Windows can no longer be dragged vertically out of non-permeable screens
       that are themselves dragged down.
     - Fixed crash when dragging screen in SDL build.
     - Added John's fix to limit SDL screen dragging to bottom screen.
     - Gadget::lowerGadgetToBottom() does not try to move decorations.
     - Gadget::raiseGadgetToTop() only invalidates the rect cache of any gadgets
       it collides with.
     - AmigaWindow controls how it moves to the top of the parent gadget stack
       rather than the Screen gadget.
  
  - New Features:
     - FileRequester tidied up and flags parameter added to constructor.
     - Added FileRequester demo to examples directory.
     - Added DimmedScreen demo to examples directory.
     - Fixes to example makefiles.
     - Added DimmedScreen readme file.
     - Added WPaint to examples directory.
     - Gadgets get drawn automatically when added to their parents.
     - Added EVENT_MOVE_FORWARD and EVENT_MOVE_BACKWARD events.

  V0.33b (20080522)
  
  - Fixes:
     - Fixed warnings in the AnimButton/BitmapButton constructors.
     
  - New Features:
     - Added makefiles to "Hello World" examples.

  V0.33 (20080522)
  
  - Fixes:
     - Gadget::click() checks correct class variable for double click timer.
     - Deleted ListBoxItem class.
     - Removed "closable" from gadget flags.
     - SkinnedWindow resizes titlebar correctly.
     - Wired up SkinnedWindow depth button visibility to skin data.
     - More consistent names for SkinnedScreen button pointers.
     - Added missing GraphicsPort::drawPixel() functions.
     - Made char pointers const-correct for devkitPro r23 compatibility.
     - System makes copies of string data where appropriate.
     - Removed duplicate title string pointer from window classes.
     - SkinnedWindow only drags when titlebar clicked, not any border gadget.
     - Fixed crash when gadget closed but parent subsequently points one of its
       pointers back at it.
     - Fixed checkbox incorrectly setting font pointer instead of leaving it to
       the base class.
     - Fixed overflow in slider grip position calculations.
     - Slider grip moves one page width/height when the gutter is clicked.
     - Scrollbar buttons default to adjusting grip value by 1.
     - Gadget::addGadget() checks to see if new children want to steal the focus
       and will grant it if necessary.
     - Focus and blur propagate throughout the gadget ancestor list even if a
       gadget along the way already has focus (or not).
     - Moved _clickedGadget pointer into Woopsi class and deleted all other
       occurences.
     - Changed _clickedGadget handling so that release works with the single
       pointer in Woopsi.
     - Windows drag correctly if only one co-ordinate has changed.
     - Screen title bar no longer steals focus when clicked.
     - Text::wrap() recognises the end of a single-line string correctly.
     - BitmapButton inherits from Gadget instead of Textbox.
     - AnimButton inherits from Gadget instead of Textbox.
     - Textbox no longer redraws when clicked; functionality moved into Button
       and ContextMenuItem classes.
     - Removed redundant DecorationGlyphButton::release().
     - Fixed tense in DS lid close/open events, so the events are now called
       "EVENT_LID_CLOSE" and "EVENT_LID_OPEN", and the methods to work with them
       are called "raiseLidCloseEvent()", "raiseLidOpenEvent()", "lidClose()"
       and "lidOpen()".
  
  - New Features:
     - ListBox rewritten to be a single gadget instead of a compound gadget.
     - ListBox allows multiple selection.
     - Added extra flags to AmigaWindow and SkinnedWindow classes allowing close
       and depth gadgets to be hidden when gadgets are constructed.
     - AmigaWindow allows depth and close buttons to be shown/hidden at will.
     - SkinnedWindow allows depth and close buttons to be shown/hidden at will.
     - Screen constructor accepts flags parameter.
     - AmigaScreen constructor accepts flags parameter.
     - SkinnedScreen constructor accepts flags parameter.
     - AmigaScreen allows depth and flip buttons to be shown/hidden at will.
     - SkinnedScreen allows depth and flip buttons to be shown/hidden at will.
     - Added ScrollingListBox class.
     - Added DefaultStyle class for control over gadget default colours.
     - Added DimmedScreen class to the bonus folder.
     - Added Requester class.
     - Added FileRequester class to the bonus folder.
     - Added Window and Screen setTitle() methods.
     - Added drawEllipse() to the SuperBitmap class.
     - Added drawFilledEllipse() to the SuperBitmap class.
     - Added ListData class.
     - Added FilePath class to bonus folder
     - Added gadget test screen to demo.
     - Added release-outside event that fires if the stylus is released outside
       the boundaries of the gadget.
     - Added eventVX and eventVY to EventArgs struct.
     - Drag and move events populate eventVX and eventVY EventArgs properties.
     - Added EVENT_ACTION event.
     - Button, AnimButton and BitmapButton all raise EVENT_ACTION events.
     - CycleGadget raises EVENT_VALUE_CHANGE events when released if the value
       has changed.
     - ScrollbarVertical up/down buttons repeat when held.
     - ScrollbarHorizontal left/right buttons repeat when held.

  V0.32 (200804327)
  
  - Fixes:
     - Moved abstract methods out of FontBase not needed by all fonts.
     - Renamed "checkGlyphData()" in font classes to "isCharBlank()".
     - Moved more code out of FontBase into FixedWidthFontBase.
     - Changed FontBase::clearColour() to support Jeff's new font classes.
     - Screens receive focus correctly when clicked.
     - Screens no longer start dragging when clicked other than in the titlebar.
     - Text class now responsible for maintaining string memory instead of
       MultiLineTextBox.
     - Text::wrap() trims spaces from the start of each line.
     - Text::wrap() breaks more sensibly at quotes, etc.
     - Closing/shelving a child gadget chooses a new focused gadget correctly if
       the child is the only gadget in the list.
     - Gadgets now check recursive isEnabled() function instead of using the
       enabled flag directly.
     - Removed WiFi icon due to problems with some loaders.
     - Moved ROM icon to icons directory to reduce ROM size.
     - Removed vector from woopsiheaders.h.
     - Gadget constructor respects GADGET_PERMEABLE flag.
     - Renamed Woopsi::play() to Woopsi::run().
     - Protected methods within Woopsi class that should not be public.
     - Gadget::unregisterChildrenFromVBL() recurses through child tree and
       unregisters all descendents.
     - Gadget destructor will perform all deletion operations if it is called
       directly and the correct deletion queue method is bypassed.
     - Context menu shelved if the gadget that opened it gets closed.
     - Slider/scrollbar inaccuracies fixed.
     - Fixed rounding errors in TextBox alignment.
     - Documentation updates.
     - Switched demo code to follow Jeff's design pattern.
     - Changed Woopsi queue handling to use while loops, so that unexpected
       changes to the lists don't cause crashes.
     - All attempts to dereference woopsiApplication check for NULL first.
     - Gadget::redrawDirty() clips to parent dimensions correctly.
     - Woopsi's gadget delete queue gets processed before the VBL listeners,
       ensuring that deleted gadgets no longer try to fire events.
     - Deleted gadgets no longer raise events.
     - Gadget::isDeleted() recurses up through hierarchy.

  - New Features:
     - Added PackedFontBase, PackedFont1 and PackedFont16 classes (proportional
       font support).
     - Added "pythonscripts" folder with Jeff's "bmp2font" Python script for
       creating PackedFont-compatible fonts.
     - Renamed existing show/hide system to shelve/unshelve and added true
       show/hide system.
     - Added Gadget::isEnabled().
     - Added ListBox and ListBoxItem classes.
     - Added double click events (optional per gadget via a flag).
     - Added ProgressBar class.
     - Added EVENT_SHELVE and EVENT_UNSHELVE events.
     - Gadgets can become modal.
     - Added Jeff's application control code to Woopsi class.
     - Added CycleButton class.
     - Merged SDL loop code into Woopsi class.
     - Merged DS and SDL woopsifuncs files.
     - Buttons change colour when clicked.

  V0.31 (20080411)
  
  - Fixes:
     - Started inlining methods that can be inlined.
     - Made destructors protected to prevent creation of gadgets on the stack.
     - More const-correctness.
     - Gadget destructor deletes children using destroy() method instead of
       calling delete.
     - Textbox::resize() remembers correct value of visible flag.
     - Gadget::show() invalidates the rect cache correctly.
     - Refactored active/inactive/focused/blurred system:
        - Renamed Gadget "active" flag to "hasFocus".
        - Renamed Gadget "setActiveGadget" to "setFocusedGadget".
        - Renamed Gadget "_activeGadget" to "_focusedGadget".
        - Refactored Gadget "setActive()" into "focus()" and "blur()" methods.
     - Refactored visible/invisible system:
        - Renamed Gadget "visible" flag to "drawingEnabled".
        - Removed Gadget::setVisible().
        - Removed Gadget::isVisible().
        - Added Gadget::enableDrawing().
        - Added Gadget::disableDrawing().
        - Added Gadget::drawingEnabled().
        - Gadget::isDrawingEnabled() only returns true if the gadget is not
          hidden or deleted.
        - GraphicsPort drawing methods do not check Gadget::isDeleted() as it
          is checked in isDrawingEnabled().
     - MultiLineTextBox restores correct drawing state when resizing.
     - Fixed spelling of "closeable" to "closable".
     - Moved Gadget::_visibleRegionCacheInvalid bool into the flags struct.
     - Split PacMan demo into separate files for each class.
     - Fixed Font and MonoFont scanGlyph() max co-ord overflows.
     - Rewritten Text::wrap() function to be faster and more efficient.
     - Tidied up Text class in general.
     - Bugfixes to ScrollingTextbox scrollbars.
     - Bugfixes to ScrollingTextbox event handling.
     - Vertical and horizontal grip respect borders of gutter when dragged.
     - Sliders check new value against max/min values when value is set.
     - Gadget::click() calls "setDragging()".
     - Gadget::drag() only raises drag events when _flag.dragging is set.
     - SuperBitmap uses standard dragging system instead of "allowStylusScroll".
     - Checkbox uses graphics port for all drawing.
     - RadioButton uses graphics port for all drawing.
     - Bugfixes to sliders.
  
  - New Features:
     - Added ScrollingTextBox class.
     - Added bonus code folder.
     - Moved LinkedList and LinkedListIterator classes from main codebase into
       bonus folder.
     - Added Hashmap and HashmapIterator classes into bonus folder.
     - Restored SimpleWindow and SimpleScreen classes in bonus folder.
     - Added getPreferredDimensions() to Gadget and Textbox classes.
     - Moved header includes from woopsi.h to new woopsiheaders.h to allow
       more streamlined binaries.
     - Added Gadget::remove() and Gadget::removeChild() methods.
     - Added ContextMenu and ContextMenuItem classes.
     - Added Gadget "hidden" flag to more accurately identify if a gadget has
       been hidden.
     - Added Gadget::isHidden() method.
     - Font system improvements:
        - Moved drawChar() function out of TextWriter into font classes to allow
          fonts to draw themselves.
        - FontBase::drawChar() returns the x co-ordinate for the next character,
          allowing the font and TextWriter classes to handle proportional fonts.
        - Added getStringWidth() functions for determining the pixel width of a
          string when printed with a given font, allowing gadgets to work with
          proportional fonts.
        - Added FixedWidthFontBase base class for fixed width fonts.
        - Removed all fixed-width code from FontBase.
        - Upgraded gadgets to support proportional fonts.
        - Upgraded Text class to support proportional fonts.
     - Added GraphicsPort::drawBitmap() function that accepts a transparent
       colour value and does not draw that colour.

  V0.30 (20080326)

  - Fixes:
     - Removed EventHandler inheritance from Gadget.
     - Added EventHandler inheritance to AmigaScreen and SkinnedScreen.
     - Minor optimisation in TextBox click() and release() functions.
     - Added more DMA_Active() checks to fix SuperBitmap DMA problems.
     - Made EventHandler an abstract class.
     - Removed post-DMA waits.
     - Added cache flushing to fix empty pixels when using DMA hardware.
     - Fixed incorrect vector pointer in Gadget::moveHiddenToChildList().
     - Font::scanGlyph() no longer scans past the end of its bitmap's memory.
     - Tidied up Debug class.
     - Added javadoc comments to more files.
     - Swapped ScrollingPanel and ScrollableBase to use a more logical model
       of the scrolling region.
     - Made Gadget::getX() and Gadget::getY() const.
     - Fixed SliderVertical bugs.
     - Added scrollbar to Debug GUI.
     - Fixed incorrect line count in Text::wrap() function.
     - Fixed incorrect check for movement in all gadget drag() functions.
     - Removed unnecessary bitmap dimensions from AnimButton class.
     - Made Gradient::resize() public.
     - Removed "auto drawing" code from MultiLineTextBox.
     - Switched to using visibility toggle in Debug class to optimise textbox
       redraws.
     - Changed value of TOP_SCREEN_Y_OFFSET to 512 to enable bitmask checking.
     - ScreenDepthButton uses GraphicsPort for all drawing operations.
     - Tidied up some of the includes and dependencies.
     - Removed SimpleScreen and SimpleWindow classes.
     - Hiding/closing a child now releases the child if it is clicked.
     - Removed unused Screen::drawChildren(clipRect) method.
     - MultiLineTextBox resizes correctly.
     - Textbox resizes correctly.
     - AmigaWindow resizes correctly.
     - Minor optimisation in clipping.

  - New Features:
     - Added vertical slider.
     - Added vertical scrollbar.
     - Added horizontal slider.
     - Added horizontal scrollbar.
     - Added up, down, left and right arrow glyphs.
     - Added ScrollableBase base class for scrolling gadgets.
     - Removed ScrollableBase functions from ScrollingPanel and added
       ScrollableBase as a base class for ScrollingPanel.
     - Added EVENT_SCROLL to EventHandler.
     - Added _darkColour to Gadget class.
     - Added LinkedList, LinkedListIterator and DynamicArray classes.
     - Removed all STL code.
     - Added event enabling/disabling to Gadget class.
     - Added event enabling/disabling to ScrollingPanel class.
     - Gadgets track calls to erase() and no longer perform a second erase
       without a call to draw() first.
     - Added Gadget::changeDimensions() to allow move and resize with just one
       redraw.
     - Merged code for child click, release, keypress, key release, lid opened,
       lid closed, focus and blur into the Gadget class, giving basic descendant
       interaction out of the box.
     - Moved window close/depth button logic out of button classes and into
       a new AmigaWindow event handler method.
     - Replaced screen buttons with DecorationGlyphButton class.
     - Replaced window buttons with WindowBorderButton class.
     - Skinned decoration buttons inherit from DecorationGlyphButton.
     - Finished Alert class.
     - Added library makefile.

  V0.29 (20080111)
  
  - Fixes:
     - Windows prevented from being dragged out of top of screen.
     - ScreenTitle and WindowBorderTop make a copy of the text passed into them.
     - BitmapButton's drawing routine offsets its blit origin by 1 to account
       for the gadget's border width if applicable.
     - Replaced most of SuperBitmap's draw(Rect) routine with a call to
       GraphicsPort::drawBitmap().
     - Increased size of window gadgets in demo skin.
     - Updated SuperBitmap to use s16 instead of u16 for co-ordinates.
     - Text::wrap() correctly wraps the last line of text.
     - Fixed more bugs in TextViewer.
     - Removed old Debug methods.
     - Fixed clipping in SuperBitmap draw routines.
     - Fixed all warnings.
     - Fixed GraphicsPort clipping - windows were wrapping around vertically
       when drawn in screens that were dragged down.
     - Fixed bugs in setting gadget attributes from skins.
     - Window was handling click() even if a child was clicked.
     - SuperBitmap::drawFilledRect() was drawing the top line of the rect over
       itself.
     - Removed all left bitshifts from GraphicsPort::clipFilledRect() and
       replaced with SCREEN_WIDTH multipliers (aid portability).
 
  - New Features:
     - Added SuperBitmap::drawFilledCircle().
     - ScreenFlipButton uses GraphicsPort for all of its drawing operations.
     - Added woopsiRGB() define as shortcut to RGB with alpha bit set.
     - Replaced pixel plotting with DMA_Force() in SuperBitmap::drawHorizLine().
     - Added SuperBitmap::clipBitmapCoordinates().
     - SuperBitmap draw routines clip to bitmap dimensions.
     - Added GraphicsPort::drawFilledCircle().
     - Ball in Pong demo is now circular.
     - Added PacMan demo.
     - MultiLineTextBox outputs using the GraphicsPort.
     - MultiLineTextBox automatically chooses smallest number of rows if no
       value (or 0) is given as the parameter in its constructor.
     - MultiLineTextBox trims its text to match the number of rows specified in
       its constructor.
     - Added MultiLineTextBox::setAutomaticDrawing() - if set to "false",
       draw() must be called when changes are made to the textbox's text for
       them to be shown.
     - GraphicsPort has a new drawText() function with a length parameter.
     - Added Debug console that automatically creates itself when called for
       the first time.
     - Added Debug::printf().
     - Changed skinning structs to be more descriptive.
     - Added tiny font to debug console.
     - Added ScrollingPanel gadget.
     - Added SDL layer.
     - Added vertical scrolling to MultiLineTextBox.
     - Added macros for using the 2nd DMA channel.
     - Added check for DMA active flag in SuperBitmap drawing code.
     - Gadget class inherits from EventHandler, so any gadget can be subclassed
       and made to handle events.
     - Screen decoration button gadgets have their parent screen set as their
       event handler.
     - Screen decoration button gadgets raise release events to notify their
       screens of user input instead of calling functions (subclassing aid).

  - Broken:
     - Vertical alignment in MultiLineTextBox other than top.

  V0.28 (20071214)
  
  - Fixes:
     - Gadget::hideChild() was only hiding previously-hidden children.
     - Gadget::hideChild() was moving an iterator in the wrong direction.
     - Gadget::closeChild() was moving an iterator in the wrong direction.
     - Gadget destructor closes children correctly.
     - Gadget::moveChildToHiddenList() was incorrectly reducing the decoration
       count.
     - Gadget::moveChildToDeletedList() was incorrectly reducing the decoration
       count.
     - Gadget destructor did not close hidden children.
     - Children and hidden children deregistered from VBL when destructed.
     - Woopsi no longer automatically switches screen focus when a screen
       closes.
     - Renamed screenbase and windowbase files back to screen and window.
     - Renamed WindowBase class back to Window.
     - Swapped Bitmap class for Bitmap struct.
     - GraphicsPort now works with const references to clipping rects.
     - Fixed GraphicsPort::drawBitmap() clipping on top screen.
     - Fixed GraphicsPort::drawFilledRect() clipping on top screen.
     - Removed SuperBitmap::newBitmapGraphicsPort() as the top screen offset
       code in the GraphicsPort made it unworkable.
     - VBL count increased before child VBL functions called.
     - Font class initialises _isMonochrome variable correctly.
     - GraphicsPort and SuperBitmap reset font colour correctly when using
       colour parameter.
     - Window drag initialisation moved into WindowBorderTop gadget.
     - Removed Window::checkTitleBarClicked().
     - Added const-correctness and implementation hiding to Font classes.
     - Removed Gadget::GadgetType enum and all references to it.
     - Improved const-correctness of GraphicsPort class.
     - BitmapButton works with const u16* bitmap data instead of non-const.
     - Swapped bool cast for flag setting in Gadget constructor with PALib-style
       double logical NOT construct.

  - New Features:
     - Skinning system.
     - Added MonoFont class for 1bpp font support.
     - Split Font class into Font and FontBase classes.
     - Added Animation class.
     - Added GraphicsPort::drawRect().
     - PALib is optional.
     - Added AnimButton.
     - Added GraphicsPort::drawBevelledRect().
     - Removed Gadget::drawIntOutline() and replaced with
       GraphicsPort::drawBevelledRect().
     - Added Gadget::getXXXColour() functions.
     - Added Gadget::getOutlineType().
     - Added AnimButton test.
     - Added new ROM icon.

  V0.27 (20071209)
  
  - Fixes:
     - Renamed "font" to "sysfont".
     - Moved font includes out of "all_gfx.h".
     - Removed font inheritance (problematic with many gadgets).
     - Made font an optional parameter in all gadget constructors.
     - Removed font from constructors of window border gadgets that do not use a
       font.
     - Woopsi height based on top screen offset instead of an arbitrary number.
     - Private class members set to protected where appropriate.
     - "Gadget::setBorderless()" now invalidates rect cache.
     - Removed "Gadget::removeGadget()" function (request 1846590).
     - "Window::createBorder()" sets border focus correctly.
     - Window border gadgets base their colour on the parent's active flag
       rather than by abusing the focus system and their own active flags.
     - GraphicsPort was using SCREEN_WIDTH instead of _bitmapWidth when blitting
       bitmaps.
     - Fonts work with const u16* bitmap data instead of plain u16*.
     - Woopsi clears its background correctly when a screen closes.
     - Gadgets draw only those regions not obscured by children (previously
       broken by switch to region caching).
     - Gradient cache uses new instead of malloc.
     - Removed support for external bitmaps from SuperBitmap.
     - Renamed Gadget::getRectClippedToParent to
       Gadget::getRectClippedToHierarchy.
     - Making a gadget invisible makes its children invisible.
     - Fixed off-by-one error in Gadget::checkCollision() functions.
     - Fixed gadget-space to display-space co-ordinate problem in GraphicsPort
       clipping routines.
     - Removed GraphicsPort::clipXORRect() and replaced with bugfixed
       alternative.
     - Various functions in Gadget class now check isVisible() instead of
       _flags.visible.
     - focus() functions ignore the call unless the gadget is not active.
     - GraphicsPort will no longer draw to deleted/invisible gadgets.
     - Tidied up ambiguities in Gadget::closeChild().
     - Gadget::closeChild() function setting the active gadget pointer to top
       gadget in the stack, but the top gadget could have been the gadget
       being closed.
     - Fixed same problem in Gadget::hideChild().
 
  - New Features:
     - Added static system font routines to Woopsi class.
     - Gadgets automatically use system font if no font specified (bug 1846003).
     - Added "floodFill()" function to SuperBitmap (request 1816931).
     - Added "drawBitmap()" function to SuperBitmap (request 1813792).
     - Added "newBitmapGraphicsPort()" function to SuperBitmap.
     - Added "setFont()" function to Text.
     - Split Screen class into ScreenBase, AmigaScreen and SimpleScreen classes.
     - Added "permeable" flag to gadgets - if set to "true", child gadgets can
       be dragged to exceed the borders of their parents (ie. windows can be
       dragged off-screen).
     - Gadget::getRectClippedToHierarchy clips to entire ancestor tree.
     - Gadget::moveTo() enforces permeability of parent gadgets.
     - Gadget::resize() enforces permeability of parent gadgets.
     - Window::resize() enforces permeability of parent gadgets.
     - Changed VBL events so gadgets must register with Woopsi to receive them
       (request 1847147).
     - Centralised gadget deletion queue handling into static Woopsi functions.
     - Added Gadget::hideChild() function.
     - Added VBL counting and static getVBLCount() function to Woopsi class
       (request 1847147).
     - Split Window class into WindowBase, AmigaWindow and SimpleWindow classes.
     - Added text output methods with colour parameter to GraphicsPort and
       SuperBitmap classes.

  V0.26 (20071208)
  
  - Fixes:
     - Added clip-to-physical-screen code back in.
     - Fixed inconsistency in screen _flags.borderless variable.
     - Fixed warning in gadget.cpp (bug 1826584).
     - Removed parent pointers from gadget constructors.
     - Removed eventhandler.cpp and rolled the functionality into the header.
     - Removed font bitmap check from TextWriter (feature 1830307).
     - Renamed "addXXX()" gadget creation functions to "newXXX()" (feature
       1830242).
     - Added check for null parent pointer before adding gadgets to child
       vector (bug 1830241).
     - Fixed flicker in top display when flipping screens.
     - Fixed border size confusion in Window class.
     - Fixed problem with height and width to y2 and x2 conversion in
       TextWriter.
     - Fixed scroll limit problem in TextViewer.
     - Fixed drawing problems in TextViewer.
     - Removed _deleteQueueActive from Gadget class and rely on vector size
       instead (bug 1843784).
     - Made destructors virtual where appropriate.
     - Set gadgets to be invisible until added to a parent gadget to prevent
       them being drawn to arbitrary positions on the screen.
     - Removed "removeOverlappedRects" from Woopsi class.
     - Changed Gadget::eraseGadget() so that the parent is responsible for.
       erasing children instead of passing call up to Woopsi instance.
     - Fixed Woopsi constructor parameter order.

  - New Features:
     - Screen and window borders can be enabled/disabled with setBorderless().
     - Gadgets now have a flags bitmask instead of individual bools to control
       properties (request 1826433).
     - Added addGadget() and insertGadget() for more control over children.
     - Added an ID number ("refcon") to the base gadget class (request 1828519).
     - Added getClientRect() function to gadget/window/screen classes.
     - Added GraphicsPort class to handle drawing within gadgets.
     - Gadgets now cache their visible regions to improve drawing speed.
     - Pong demo uses a GraphicsPort instead of a SuperBitmap.
     - Added "removeGadget" function for deleting gadgets from vectors.
     - Added gadget decoration concept to handle borders, etc.
     - Removed all usage of Gadget::getType() to aid subclassing.
     - BitmapButton draws its bitmap using GraphicsPort.
     - Window uses parent screen's GraphicsPort to draw its XOR rectangles.
       (fixes bug in which XOR rectangle overlaps other screens, but no longer
       relevant since screens automatically depth-sort when clicked).
     - Window border gadgets use GraphicsPort for their output.
     - Screen title gadget uses GraphicsPort for its output.
     - Removed most drawing functions from Gadget class.
     - Added hardware-accelerated horizontal line drawing.
     - Improved speed of filled rect by using faster horizontal line routine.
     - Renamed bool getters from "getXXX()" to "isXXX()".
     - Added clip-to-parents into Gadget::cacheVisibleRects and
       Gadget::splitRects.
     - Removed glyph font and added support routines to allow single font.
     - Added font inheritance system.
     - Added Gradient background class.
     - Removed background image from demo and replaced with gradient.

  V0.25 (20071104)

  - Fixes:
     - Added vector to store hidden gadgets, reducing the complexity of
       maintaining gadget lists and focus.
     - Removed all screen dimension magic numbers and replaced with defines.

  - New Features:
     - Split Woopsi library code into separate directory for ease of integration
       in other projects.

  V0.24 (20071103)

  - Fixes:
     - Tidied up a lot of the code.
     - Gadget deletion queue now handles solely in the VBL events.
     - Optimised TextWriter by preventing it from drawing empty glyphs.
     - Changed TextWriter into a static class.
     - Optimised TextViewer so that it uses much less memory.
     - Text font and glyph font now sent around hierarchy instead of each gadget
       creating their own font.
     - Improved Font class.
     - Removed 8-bit code from Bitmap class.
     - General refactoring and code tidying.
     - Made EventHandler methods virtual instead of pure virtual.
     - Split gadget events into "raiseXEvent()" and "x()" functions.
     - Clicking a gadget automatically notifies its parent that it is the new
       clicked gadget.
     - Moved dirty child redraw function into gadget class.
     - Added horizontal clipping to rect splitting functions.
     - Fixed SuperBitmap border.
     - Relevant gadget methods are now virtual for subclassing.
     - Removed all unnecessary all_gfx includes.

  - New features:
     - Added non-draggable screens and windows.
     - Added show/hide gadget functionality.
     - Added ability to hide a window instead of closing it when the close
       button is clicked.
     - Added closed/hidden/shown events.
     - Added monochrome output to Font class and definable text colour.
     - Added drawText() function to SuperBitmap class.
     - Added window depth button.
     - Added enable/disable gadget.
     - Started work on alert requester.
     - Moved text data manipulation out of TextViewer into a separate class.
     - Added Gadget::moveTo method.
     - Added Gadget::resize method.
     - Added resize event.
     - Added move event.
     - Added value change event.
     - Added window resizing (API only).
     - Added radio buttons.
     - Added radio button groups.
     - Added "clicked" glyphs for screen and window depth buttons.
     - Most gadget action methods (click(), moveTo(), etc) return bools to
       indicate success or failure.
     - Added enabled/disabled events.
     - Added checkboxes.
     - Added NDS screen flipping and support for top NDS screen.
     - Added screen flipping gadget.
     - Updated screens to swap to front when clicked.
     - Added a variety of gadget depth manipulation functions.

  V0.23 (20071024)

  - Fixes:
     - Improved event routing.
     - Improved drawing speed when blurring windows.
     - Fixed various null pointer bugs.
     - Tidied up all gadget destructors.
     - Misc other minor fixes.

  - New features:
     - Added window close buttons.
     - Added gadget close functionality.

  V0.22 (20071022)
  
   - Fixes:
     - Screens can now be the active gadget.
     - The system can now only have one active gadget at a time (previously,
       each screen could have an active window).
     - Doubled the speed of active window switching (system was redrawing
       twice).
     - Lid events now sent to all gadgets.
     - Pad input re-enabled.
     - Fixed null pointer crashes if no active gadget was available in some
       events.
     - Replaced Mario picture with Simian Zombie logo in SuperBitmap test.
     - Misc other minor fixes.
     
   - New features:
     - Added handleFocus() and handleBlur() events.
     - Added BitmapButton class.

  V0.21 (20071015)
  
   - Fixes:
     - Deleted setBitmap() in SuperBitmap and added secondary constructor
       instead - fixes a crash.
     - Made Woopsi a gadget.
     - Moved removeOverlappedRects() function from Screen/Window into Gadget.
     - Improved TextViewer clipping.
     - Fixed screen title clipping.
     - Fixed null pointer crash in screen stylus handling.
     - VBL sent to all gadgets on all screens.
     
   - New features:
     - Screen dragging.
     - Added addSuperBitmap() to Screen - allows screen backgrounds.
     - Debug class to aid debugging.

   - Broken:
     - Pad input is disabled.
    
  V0.2a (20070928)
  
   - General:
     - First source code release.
     - Licenced source under BSD licence.
     - Started work on "standard developer" documentation.
     
   - Fixes:
     - Borderless windows fixed.
     - Switched active window colour to closest approximation the DS can make to
       the original WB2.x blue.
     - Made screen depth gadget wider so it is easier to click.
     - TextViewer clips correctly when drawing/scrolling (though it still
       doesn’t clip to the invalid region when redrawing).
     - Moved child gadget vector from Screen and Window into Gadget.
     - Moved drawChildren() from Screen and Window into Gadget.
     - Fixed window border clipping (fixes window title overlap problem).
     - Fixed screen title clipping.
     
   - New features:
     - Added drawHorizLine() to SuperBitmap.
     - Added drawVertLine() to SuperBitmap.
     - Added drawRect() to SuperBitmap.
     - Added allowStylusScroll() to SuperBitmap.
     - Added setShineColour() to Gadget.
     - Added setHighlightColour() to Gadget.
     - Added setShadowColour() to Gadget.
     - Added setBackColour() to Gadget.
     - Added setFillColour() to Gadget.
     - Added events for lid opening and lid closing.

  V0.18 (20070926)
  
   - Eighth WIP demo release.
   - Added intelligent gadget drawing.
   - Improved SuperBitmap init speed.
   - Improved erase speed.
   - Code tidying/refactoring.

  V0.17 (20070925)
  
   - Seventh WIP demo release.
   - Added clipping to the majority of gadgets.
   - Added intelligent gadget removal.
   - Added a bitmap to the SuperBitmap demo.
   - Changed Pong demo to use SuperBitmap as its canvas.
   - Converted window/screen borders into gadgets.

  V0.10 (20070923)
  
   - Sixth WIP demo release.
   - EventArgs and EventHandler system implemented.
   - Added key and VBL events.
   - Added drawFilledRect() function for drawing to gadgets.
   - Added SuperBitmap gadget.
   - Converted from 8-bit display to 16-bit.
   - Added Pong demo.
   - Added SuperBitmap demo.
  
  V0.06 (20070921)
  
   - Fifth WIP demo release.
   - Bugfix for TextViewer crash.
   - Event system work begun.
   - Calculator app added.
   - Textbox gadget added.
   - Button gadget altered to inherit from Textbox.
   - More optimistion in fast filled rectangle code.

  V0.05 (20070920)
  
   - Fourth WIP demo release.
   - Bugfix for fast filled rectange routine.
   - Multiple screen support.
   - Screen depth gadget.
   - Fixed crash caused by uninitialised pointer in handleReleased() window
     function.
   - Begun work on gadget glyphs.
   - Fixed bug in XORed rectangle code - corner pixels were being XORed twice.

  V0.03 (20070920)

   - Third WIP demo release.
   - Renamed from "WindowSystemDS" to "Woopsi".

  V0.02 (20070919)
  
   - Second WIP demo release.

  V0.01 (20070917)
  
   - First WIP demo release.