
Apache Commons Sanselan Release Notes 
-------------------------------------

Apache Commons Sanselan is a pure-Java image library for reading and writing a variety of image formats.

See the project site for details and sample code.

http://commons.apache.org/sanselan/


Version History:
----------------

Release 0.98
------------
 * SANSELAN-44 - JpegImageMetadata getEXIFThumbnail may raise a null pointer exception
 * Fixed a problem in the metadata example code not using exact matching for GPS values.
 * Fixed a possible NPE in Sanselan.getICCProfile pointed out by Jon Weygandt.
 * Fixed a bug in which gifs have incorrect size information in the the Logical Screen Descriptor.
   This appears to be a bug in how Microsoft Office writes gifs.
   The Image Descriptor has the correct value.
 * Added accessor methods for a number of ImageInfo properties.
 * Applied patch contributed by Nicolas Richeton, adding getEXIFThumbnailSize() and getEXIFThumbnailData() 
 	methods to JpegImageMetadata.
 * Fixed a couple of platform-dependent paths in the tests.
 * Constant-ized the magic numbers used when guessing formats.  
 * Added a test for the format guessing.
 * Improvements to ICO parsing and support for PNG images in ICO files.
 * Added support for the ICNS icon format.
 * Added support for the PCX and DCX image formats.
 * Improvements to BMP parsing.
 * Added support for the WBMP format.
 * Added support for reading simple baseline YCbCr JPEG images.
 * Added support for XBM and XPM images.
 * SANSELAN-54 - TIFF float and double values are written in the wrong byteorder.
 * SANSELAN-52 - fixed PNG transparency in getImageInfo().
 * SANSELAN-13, SANSELAN-47, SANSELAN-55, others - made TIFF tag parsing a lot
   more rigorous, allowing EXIF to be read even from very corrupt files.
 * Added the ability to read comments from a JPEG file using getImageInfo().
 * Added support for compression=2 TIFF images.
 * SANSELAN-46 - allowed all Sanselan tests to pass.
 * SANSELAN-59 - deleted confusing redefinition of some constants.
 * Altered TIFF tag searching to do an exact directory match when possible.
 * SANSELAN-48 - added support for reading and writing CCITT Modified Huffman, Group 3 and Group 4 images.
 * SANSELAN-31 - added a high level type-safe API for reading and writing EXIF fields.
 * SANSELAN-25 - added support for the RGBE (Radiance HDR) image format.

Release 0.97
------------
	
 * Rewrote the info.txt files for many images in the sample image library to clarify contribution to project.
 * Removed the images from the www.wpclipart.com Public Domain library.
 * Improved the examples illustrating how to change EXIF metadata.
 * Applied a patch from Niall Pemberton around jdk1.5 compatibility:
	"""
	Sanselan claims JDK 1.4 compatibility, but a JDK 1.5 method (Class's getSimpleName() [1]) has been used in JpegRewriter
	"""
 * Applied a "Build Improvements" patch from Niall Pemberton:
	"""
	I took a look at the propsed 0.96 relelase and have some suggestions to improve the build:
	 * Add standard manifest entries to jar
	 * Lock down version numbers for maven compiler, surefire and javadoc plugins
	 * generate sources jar for the release
	 * include the RELEASE-NOTES in the binary distribution
	 * include NOTICE/LICENSE files in the javadoc jar
	"""

Release 0.96
------------

 * Updated KEYS file.
 * Added more unit tests around BMP.
 * Added more images to the test image suite.
 * Fixed a bug where errors were being wrongly logged to System.out.
 * Moved the example code into the test source directory, to comply with Maven's standard project layout.
 * Added a couple of images to the sample image library that demonstrate a couple variations on Photoshop/IPTC data.  
 * Fixed a small bug in the IPTC constants introduced while cleaning up the constants.
 * Started shift towards moving field-level parsing into BinaryInputStream and BinaryOutputStream.
 * Fixed a png unit test that used a piece of Java 1.6 syntax.
 * Added unit tests around the new IPTC functionality.
 * Added IPTC remove/update/insert functionality.
 * Rewrote the IPTC parsing support.  
 * Added improved support for reading and writing iTXt, tEXt, zTXt Png chunks.
 	Added a unit test that demonstrates the feature.
 * Found a new regression wherein DeflaterOutputStream needs to be closed.
 * Added the .tar.bz2 distributions back into the maven assembly descriptors.
 * Moved the example/sample code to a new top-level source folder, "example."
 * Replaced dependency on java.util.zip.DeflaterOutputStream, which is only available in Java 1.6.
 * Added a unit test around reading and writing images in every format.
 * We now sort some (but not all) GIF color tables.
 * Applied the BMP "buffer flushing" bug to the PBM reading and writing code.
 * Fixed a regression around flushing the bit buffer when writing BMPs with very small palettes.
 * Removed assumption about DataBuffer type when reading BMPs.
 * When writing a GIF, we now always include a Graphic Control Extension block, even if its not necessary.
 * We are more defensive about missing GCEs.
 * Lastly, we now set a minimum bound on initial code sizes for LZW-compressed Gif image data.
 * Found a regression in writing TIFFs around strip offsets being properly updated.  Not a LZW issue after all.
	Added a few unit tests around this issue.	
	see: https://issues.apache.org/jira/browse/SANSELAN-6
 * Added ability to remove and update XMP XML in existing JPEG files.
 * Added ability to embed XMP XML when writing the following formats: GIF, PNG, TIFF.
 * Improved handling of tEXt and zTXt PNG text blocks.
 * Added XMP XML extraction for the following formats: GIF (untested), JPEG, TIFF, PNG, PSD.
 * Added RELEASE_NOTES file (this file).
 * Added Apache license header to bin.xml and src.xml Maven assembly descriptors.
 * Added Javadocs to the binary distribution
 

Release 0.94
------------

First Apache release of Sanselan

Fixed bugs:
-----------
 * Can't convert PNG image to GIF image
    The PNG reader wasn't handling the 16-bit mode 4 PNGs properly. 
    The PNG reader wasn't gamma-correcting non-palette values properly in PNGs.
	see: https://issues.apache.org/jira/browse/SANSELAN-5
