Changelog v1.0


- Added a new field, currentSelection (of type java.awt.geom.Rectangle2D) to
  the BrushManager class to track the bounding rect of the bristles currently
  selected in the Bristles list. Prior, when using the rotation field in the
  status bar located in the BrushDesigner, it was using successive iterations
  of the "current" bounding rect (which would change each time individual
  bristles were rotated), thereby producing incorrect results. 

- Removed getSelectionCenter()/setSelectionCenter() methods from the
  BrushDesigner class, as well as the selectionCenter (of type
  java.awt.geom.Point2D). They were not being utilized for anything, and if
  needed, this value can be derived from the currentSelection (see above).

- Added a new Listener and Event type - BrushDesignerStateChangeListener, and
  BrushDesignerStateChangeEvent. The purpose of these lies in being able to
  listen for modifications to the state of objects, such as scaling, rotating,
  moving, etc. 

- Added stateChangeListenerList field (type Vector), and
  addStateChangeListener(), removeStateChangeListener, and
  fireStateChangeEvent() methods to core/ 

- Modified the code in core/ so that the BrushManager class is
  registered with BrushDesigner as a BrushDesignerStateChangeListener.

- Added a brushDesignerStateChanged() method to core/ to
  respond to BrushDesignerStateChange events. This response updates the
  currentBounds field with the new bounding rectangle associated with the
  selected bristles.

- Modified the modifyStatus method in core/BrushManager to correct the method
  of calculation when the selected bristles were modified by manually entering
  values into the w and h fields in the Brush Designer status bar. 

 - Added code to trap out-of-memory conditions, so that the user is informed
   when this happens. 

 - Refined the handling of null pointer conditions (which occur when memory
   cannot be allocated (for a request to create a new image, for example). 
   Users will now see a dialog warning of any out-of-memory conditions 
   related to the creation of new images.

 - Added a field to the Bristle class to contain a reference to its parent
   Brush, as well as the code to populate that reference when a new bristle is
 - Added a field to the BristleModel to contain a reference to a Shape that will
   serve as the target for a new (yet to be implemented) "Follow path" feature.
   The intent is to have this shape define a series of points at which the
   bristle will be rendered.

  - Fixed a bug related to the Threshold setting under the Alpha tab- it wasn't
	being udpated correctly when switching between bristles.

  - New feature - when holding the CTRL key down while rotating a bristle in the
	Brush Designer, it will rotate the selected bristles around their respective
	anchor points, rather than the center of the bounding rectangle. 

  - Fixed a bug that caused the brush files in the users ._semicuro_ directory
	on a Windows machine to be rendered unusable when a file modification
	process was run at startup right after a new version of the software
	was installed. 

  - Eliminated the dialog that appears (repeatedly) on startup when non-XML
	files are encountered while loading any brushes that may exist in the
	user's ._semicuro_ directory. Now these files are simply ignored. If
	they are .temp files on a Windows machine, these will be cleared out the
	next time the workspace is saved.

  - Fixed a bug that caused the PaintWrap option to produce wrapped images that
	were off by one pixel. If the wrap occurred along the x axis, the wrapped
	portion of the image would appear one pixel off along the y axis. If the
	wrap occurred along the y axis, the wrapped portion of the image would
	appear one pixel off along the x axis. 

  - Ran into a problem with ImageIcon recognizing and handling jpg images, so
	the only jpg image that was currently being used (imagenotfound.jpg), was
	converted to a png format. This seems to have solved the problem, which 
	manifested itself as a sudden halt during loading (due to a 
	NullPointerException) when the app encountered a bristle with an image 
	file that did not exist at the specified location.

  - Added rudimentary support for preferences, via the semicuro.config file.
     The configuration directory has been changed from ~/._semicuro_ to 
	~/.semicuro. This new configuration location will contain two items:
	the a directory for brushes (the user's workspace), and a new
	configuration file, semicuro.config. Any brushes that exist in the old
	location (~/._semicuro_) will be copied to the new location the 
	first time 1.0 is loaded. 

	The new preferences file contains two property so far: lookandfeel and 
	paintcursor. The "default" value for lookandfeel can changed to the
	fully-qualified class name of any LookAndFeel that has been included with
	the build. There is one LookAndFeel available at this point:
	However, this LookAndFeel currently has issues with menu items that have
	icons. There are also some minor issues with object placement (the
	components that make up the various panels in the PaintManager). underwent some additions to handle this
	new functionality. 
	The default value for paintcursor can be changed to "crosshair" if you
	need more precision while painting. 

  - The build file (build.xml) was modified to handle the process in a more 
  	flexible manner. You can now initiate the build process by typing
	"ant" without having to specify which platform - it will make that
	determination on its own. The result of the build process will be a 
	"build" directory populated with the appropriate files, as well as
	compressed archive (zip for windows, tgz for linux) in a "dist" 
	directory. Producing a source archive still requires using 
	"ant src_dist". 

  - Added a new Preview function to the canvas window
	(org.semicuro.core.SCCanvas). To faciliate this, a new interface was
	created (, and an implementation
	( When this button is activated, it
	opens a window containing a 3 x 3 matrix of tiled images. The
	preview is automatically updated each time the mouse is released, or 
	when the image is altered using any of the filters/dialogs, etc. 

  - Moved the non-static getCompositeImage() methods from the 
	org.semicuro.ui.LayerManager class to a new, more specialized class
	(org.semicuro.core.ImageUtils) as static methods.  This was done to
	facilitate greater clarity and more flexible access. Other image-related
	utility functions that currently reside in the Utils class should also
	be relocated to this ImageUtils class at some point in order to maintain
	semantic consistency. 

  - Added accessor methods to the org.semicuro.ui.CanvasTools class for each of
	the buttons that appear in the toolbar, allowing the addition of listeners
	to these components if needed. The construction of an SCCanvas now includes
	adding a listener to the toolbar's Preview button.

  - Completely reworked the Paint Wrap code, eliminating the ImageReflector
	class. The rewrite allowed the elimination of two bugs: one which prevented
	wrapping strokes to a diagonally oposite corner, and another which failed
	to include any scale settings in the wrapped portion of a stroke.

  - Changed the manner in which the application is initialized. Instead of
	creating a new instance using the new() method, the Semicuro class has been
	turned into a singleton. Creating a new instance now requires a call to
	Semicuro.getInstance(). This was done to accommodate access to the
	configuration properties, which are stored as name/value pairs in the
	semicuro.config file. 

  - Added a new configuration property called 'paintcursor'. This property is
	used to specify a crosshair cursor instead of the default sprayer cursor
	that is visible while painting in the texture window.