Sun Java Solaris Communities My SDN Account Join SDN
 
Documentation

Java Advanced Imaging API v1.1 Readme

 

Java Advanced Imaging API


Contents

Introduction

This 1.1 release of Java Advanced Imaging (JAI) contains numerous API changes from JAI 1.0.2. This reference implementation, called Java Advanced Imaging 1.1, implements the Public Review draft of the JAI 1.1 specification and also contains bug fixes and performance improvements. It represents development pursuant to the Java Advanced Imaging 1.1 JSR.

The unofficial codec classes in the com.sun.media.jai.codec package have been modified to improve support for TIFF.

The changes are described in the "What's New" section of this document.

Some known bugs exist - see the BUGS page for details.

For installation instructions please refer to the INSTALL page.

The Java Advanced Imaging API home page is located at http://java.sun.com/products/java-media/jai/. There you will find binaries, documentation, answers to frequently asked questions, and other information.

System Requirements

Please refer to the appropriate section of the INSTALL page.

Core Functionality

All areas of the JAI specification have been implemented for this release. The com.sun.media.jai.codec package continues to be an uncommitted part of JAI. These classes should continue to be considered provisional and exist only as helper classes for the JAI implementation. In a future release of JAI they will be superseded by the Java Image I/O API. It is likely that the com.sun.media.jai.codec package will be deprecated in the JAI release in which it is superseded by Java Image I/O and will be removed entirely in a subsequent release. The source code for these classes is however available via the JAI home page. This source code bundle will be updated as necessary to remain current with the latest version of JAI which contains these classes.

All operators outlined in the Java Advanced Imaging API specification are implemented.

The major areas of JAI functionality are described below:

  1. Tiling

    Images are made up of tiles. Different images may have different tile sizes. Each tile can be processed and stored in memory separately. Tiles may be stored in a centrally-maintained cache for performance. The use of tiling also facilitates the use of multiple threads for computation.

  2. Deferred execution

    Image operations performed on an image do not take place immediately when they are defined. Calculation of pixels happens only when a portion of the resultant image is requested, and only tiles that are needed are processed. However, operations always appear semantically to be completed immediately.

  3. Threaded Computation

    Requests for tiles are given to several running threads, allowing potential speedups on multi-processor systems or when requesting data over the network.

  4. Object-Oriented Extensibility

    Users can add their own image operators or override existing operators by registering the new operators with the operation registry. Please see the "The Java Advanced Imaging API White Paper," the API documentation, the JAI tutorial, and the sample code for more information.

    Additionally, users may extend a number of non-image classes in order to add functionality to JAI:

    • Border Extension

      Operators may obtain an extended view of their sources using an extensible mechanism for generating pixel values outside of the source image bounds. New subclasses of BorderExtender may be used to obtain customized functionality.

    • Image Warping

      Subclasses of Warp may be written to perform customized image warping.

    • Pixel Interpolation

      Subclasses of Interpolation may be written to perform customized pixel interpolation.

  5. Graphics2D-Style Drawing

    Graphics2D-style drawing may be performed on a TiledImage in a manner analogous to that available for java.awt.image.BufferedImage.

    The RenderableGraphics class provides a way to store a sequence of drawing commands and to "replay" them at an arbitrary output resolution.

  6. Regions of interest (ROIs)

    Non-rectangular portions of an image may be specified using a ROI or ROIShape object. These ROIs may be used as parameters to the Extrema, Mean or Histogram operations and the TiledImage.set() and TiledImage.setData() methods. Operations produce an appropriate ROI property on their output when one exists on their input.

  7. Image file handling

    This release of Java Advanced Imaging supports BMP, FlashPIX, GIF, JPEG, PNG, PNM, and TIFF images as defined in the TIFF 6.0 specification. TIFF G3 (1D and 2D), G4, PackBits, LZW, JPEG, and DEFLATE (Zip) compression types are understood.

    The classes dealing with image file handling (the com.sun.media.jai.codec package and private implementation packages that provide support for it) are provided in a separate jai file, jai_codec.jar. This jar file may be used separately from the jai_core.jar file containing the various javax.media.jai packages and their supporting classes.

    As described in the Core Functionality section of this document, the image codec classes should be considered as temporary helper functions. They will be replaced by a new API for image I/O that has been defined under the Java Community Process.

    • BMP File Handling:

        The BMP reader can read Version 2.x, 3.x and some 4.x BMP images. BMP images with 1, 4, 8, 24 bits can be read with this reader. Support for 16 and 32 bit images has also been implemented, although such images are not very common.

        Reading of compressed BMPs is supported. BI_RGB, BI_RLE8, BI_RLE4 and BI_BITFIELDS compressions are handled.

        The BMP reader emits properties such as type of compression, bits per pixel etc. Use the getPropertyNames() method to get the names of all the properties emitted.

        BMP Limitations:

        • Only the default RGB color space is supported.
        • Alpha channels are not supported.

        BMP Writer:

        • The BMP writer is capable of writing images in the Version 3 format. Images which make use of a IndexColorModel with 2, 16, or 256 palette entries will be written in palette form. Compression is not supported.

    • FlashPIX file handling:

        A limited FlashPIX reader is provided that is capable of extracting a single resolution from a FlashPIX image file. Only simple FlashPix files are decoded properly.

        The image view object is ignored, and image property information is not exported.

        There is no FlashPIX writer.

    • GIF file handling:

        GIF files are read using the JDK's internal reader. There is no GIF writer. Due to a bug in the AWT GIF decoder, GIFs with a transparent background will be decoded as if their background were black.

        GIF files may not be read remotely, i.e., via RemoteImage, on hosts without window system access as the reader uses the AWT toolkit which requires window system access.

    • JPEG file handling:

      • JPEG files are read and written using the classes found in the com.sun.image.codec.jpeg package of the JDK. A set of simple JAI wrapper classes around these classes is provided.
      • The JPEG decoder cannot read abbreviated streams, either tables-only or image-only.

    • PNG file handling:

        All files in the PNGSuite test suite have been read and written successfully. See the documentation in com.sun.media.jai.codec.PNGDecodeParam and PNGEncodeParam for more information.

    • PNM file handling:

        PNM files may be read and written in both ASCII and raw formats. The encoder automatically selects between PBM (bitmap), PGM (grayscale) and PPM (RGB) files according to the number of bands and bit depth of the source image.

        Due to the limitations of the format, only images with 1 or 3 bands may be written.

    • TIFF File Handling:

      TIFF support has the following limitations:

      • Bilevel-specific compressed formats may not be written. This includes CCITT Huffman (G3-1D), CCITT T.4 (G3-2D), and CCITT T.6 (G4).
      • LZW compressed format is not supported for the usual reason.
      • Planar configuration (band sequential data) is not supported.

  8. Image Layouts

    Images with arbitrary pixel layouts may be processed in a uniform manner using the PixelAccessor and RasterAccessor classes.

    Source images with ComponentColorModels and IndexColorModels are supported. DirectColorModel images are not supported.

    PixelAccessor and RasterAccessor provide the most efficient support for the ComponentSampleModel/ComponentColorModel combination.

  9. Image Collections

    The output of a standard image operator on an instance of java.util.Collection is a collection of the same type. Nested collections are supported. Operators may also emit collections of their choice, or take collections as sources and emit a single image.

  10. Remote Imaging

    JAI 1.1 allows operations to be performed remotely to be created in a manner similar to local operations. RemoteJAI.create() and RemoteJAI.createRenderable() can be used to create operations that are performed on remote hosts. Operation chains are created on the client and can contain a mix of local and remote operations by using JAI.create() and RemoteJAI.create(), respectively to create the operations. The "fileload" operation has been modified to allow files that reside only on remote filesystems to be loaded remotely. This can be accomplished by setting the isFileLoadLocal argument to the fileload operation to be false, in which case the presence of the file to be loaded is not checked on the local file system when the "fileload" operation is first created. The "filestore" operation can similarly be used to store an image on a server to a file not visible from the client file system. The "filestore" and other "immediate" operations can be specified to be performed remotely by creating them using RemoteJAI.create(). "immediate" operations are rendered upon creation on the remote server. See sections below for instructions on how to use the JAI 1.0.2 and 1.1 versions of remote imaging.

  11. Iterators

    Optimized Rect and Random iterators exist as well as a non-optimized version of the Rook iterator.

  12. Snapshotting of External Sources

    SnapshotImage provides an arbitrary number of synchronous views of a possibly changing WritableRenderedImage.

  13. Meta-data Handling

    Meta-data handling is provided via a name-value database of properties associated with each JAI image. Mechanisms are provided by which such properties may be generated and processed in the course of image manipulation. The ability to defer computation of such data is also provided in a manner conceptually equivalent to that available for image data. Please refer to the DeferredData and DeferredProperty classes for more information.

  14. Serialization Support

    SerializerFactory provides a framework is provided to assist in serializing instances of classes which do not implement java.io.Serializable. Such objects must be serialized by extracting a serializable version of their state from which the original object may be extracted after deserialization.

Operators

Java Advanced Imaging extends the imaging functionality provided in the Java 2D API by providing a more flexible and scalable architecture targeted for complex, high performance imaging requirements. In this context a large number of imaging operators are provided.

  • Native Acceleration

    Pure Java implementations are provided for all image operators and imaging performance is addressed for some of these by providing C-based native code. Native C-code based acceleration for a certain subset of operators under specific conditions (listed in the table below) is available for the Sun/Solaris, Win32 and Linux (x86 only) platforms. On Sun UltraSPARC-based platforms, additional performance is gained with hardware acceleration via the VIS instructions for most natively supported operators. On Win32 platforms which support MMX instructions, hardware acceleration is gained for a subset of the natively supported operators.

    If a native implementation is present it is, by default, the preferred implementation. But if the nature of the sources and parameters of the operation are incompatible with the native operation then processing will revert to Java code. In general the following minimum requirements must be adhered to for the mediaLib native implementation of an operation to be executed:

    • All sources must be RenderedImages.
    • All sources and destination must have
      • a SampleModel which is a ComponentSampleModel and
      • a ColorModel which is a ComponentColorModel or no ColorModel (i.e., it is null).
    • All sources and destination must NOT have DataBuffer.TYPE_USHORT as their data type.
      • Additional acceleration using VIS or MMX instruction is available for DataBuffer.TYPE_BYTE and DataBuffer.TYPE_SHORT images.
    • All sources and the destination must have at most 4 bands of pixel data.
    • If Interpolation type is one of the arguments to the operator, then native acceleration is available only for Nearest, Bilinear, Bicubic and Bicubic2 cases. Additionally for byte images InterpolationTable is also supported for native acceleration.

    Further restrictions may be imposed by individual operations but the above are the most common requirements.

  • Imaging Operators

    The following image operators are implemented in this release. Only a brief description of each operator is provided here. For detailed information on these operators, refer to their full documentation, available at http://java.sun.com/products/java-media/jai/docs/index.html.

    All operations are performed on a per-band basis, unless specified otherwise. C acceleration applies to all platforms whereas VIS is specific to Sun UltraSPARC and MMX to Windows.

    1. Point and Arithmetic Operators

      Operator Name Description Native Acceleration
      C VIS MMX Notes
      absolute Computes the absolute value of the pixels of an image. X X X  
      add Adds the pixel values of two source images. X X X  
      addcollection Adds a collection of images to one another.        
      addconst Adds a set of constant values to the pixel values of a source image. X X X  
      addconsttocollection Adds a set of constant values to the pixel values of a Collection of source images. X X X  
      and And's the pixel values of two source images. X X X  
      andconst And's the pixel values of a source image with a set of constants. X X    
      bandcombine Computes a linear combination of the bands of an image. X X X 3x4 matrix only.
      bandmerge Creates an image consisting of all bands of all sources concatenated in the order encountered.        
      bandselect Selects a subset of the bands of an image, possibly reordering them. X X   Only if the band selection is monotonically increasing.
      binarize Thresholds a single-band image to two levels to generate a bilevel output. X      
      clamp Set all pixel values below the low value to that low value, set all the pixel values above the high value to that high value. X X    
      colorconvert Converts an image to a given ColorSpace.        
      composite Combines two images based on their alpha values at each pixel. X X   For single band images only.
      constant Creates an image with constant pixel values.        
      divide Divides the pixel values of the first source image by the pixel values of the second source image. X      
      dividebyconst Divides the pixel values of a source image by a set of constants. X      
      divideintoconst Divides a set of constants by the pixel values of a source image. X      
      exp Computes the exponential of the pixel values of an image. X      
      format Performs reformatting on an image, including data type casting, replacing the SampleModel and ColorModel, and restructuring the tile grid.        
      invert Inverts the pixel values of an image. X X    
      log Computes the natural logarithm of the pixel values of an image. X      
      lookup Performs general table lookup on an image. X X   Only if table has less than or equal to 4 bands.
      matchcdf Performs a piecewise linear remapping of pixel values to match a given cumulative distribution function.        
      max Chooses the maximum pixel values between two images. X X    
      min Chooses the minimum pixel values between two images. X X    
      multiply Multiplies the pixel values of two source images. X X    
      multiplyconst Multiplies the pixel values of a source image by a set of constants. X X    
      not Inverts the pixel values of a source image. X X X  
      or Or's the pixel values of two source images. X X X  
      orconst Or's the pixel values of a source image with a set of constants. X X    
      overlay Overlays one image on top of another image.        
      piecewise Performs piecewise linear remapping of the pixel values of an image.        
      rescale Performs a linear remapping of the pixel values of an image. X X    
      subtract Subtracts the pixel values of one image from those of another. X X X  
      subtractconst Subtracts a set of constant values from the pixel values of an image. X X X  
      subtractfromconst Subtracts a set of constant values from the pixel values of an image. X X X  
      threshold Maps the pixel values that fall between a low and high value to a set of constants. X X    
      xor Xor's the pixel values of two source images. X X X  
      xorconst Xor's a source image with a set of constants. X X    
    2. Area and Geometric Operators

      Operator Name Description Native Acceleration
      C VIS MMX Notes
      affine Performs first order geometric image warping. X X X InterpolationTable is not MMX accelerated for even byte images.
      border Adds a border around an image.        
      boxfilter Convolves an image using a two-dimensional box filter.        
      convolve Performs an MxN image convolution. X X X General and separable cases. (3x3 and 5x5 kernels only for MMX)
      crop Extracts a subarea of an image.        
      dilate Performs morphological dilation on an image. X     Only single band, 3x3 kernels centered at 1,1
      erode Performs morphological erosion on an image. X     Only single band, 3x3 kernels centered at 1,1
      filteredsubsample Performs a combined integral subsample and symmetric product-separable filter.        
      gradientmagnitude Performs edge detection using orthogonal gradient masks. X X    
      maxfilter Computes the maximum value of a pixel neighborhood. X X   Only for a SQUARE mask of size 3, 5, or 7
      medianfilter Computes the median value of a pixel neighborhood. X X    
      minfilter Computes the minimum value of a pixel neighborhood. X X   Only for a SQUARE mask of size 3, 5, or 7
      rotate Rotates an image about an arbitrary point. X X X InterpolationTable is not MMX accelerated for even byte images.
      scale Scales and translates an image. X X X InterpolationTable is not MMX accelerated for even byte images.
      shear Shears an image. X X X InterpolationTable is not MMX accelerated for even byte images.
      subsamplebinarytogray Subsamples a bilevel image to a grayscale image. X      
      translate Translates an image by an integral or fractional amount. X X X InterpolationTable is not MMX accelerated for even byte images.
      transpose Reflects an image in a specified direction or rotates an image in multiples of 90 degrees. X X    
      unsharpmask Sharpens an image by supressing the low frequencies. X X X General and separable kernels. (3x3 and 5x5 kernels only for MMX)
      warp Performs geometric warping on an image. X X   polynomial and grid only.
    3. Frequency-domain, Transform, and Complex Operators

      Operator Name Description Native Acceleration
      C VIS MMX Notes
      conjugate Computes the complex conjugate of an image.        
      dct Computes the Discrete Cosine Transform of an image. X      
      dft Computes the Discrete Fourier Transform of an image, possibly resulting in a complex image. X      
      dividecomplex Computes the quotient of two complex images.        
      idct Computes the inverse Discrete Cosine Transform of an image. X      
      idft Computes the inverse Discrete Fourier Transform of an image. X      
      magnitude Computes the magnitude of a complex image.        
      magnitudesquared Computes the squared magnitude of a complex image.        
      multiplycomplex Computes the product of two complex images.        
      periodicshift Shifts an image periodically.        
      phase Computes the phase angle of a complex image.        
      polartocomplex Creates a complex image from two images representing magnitude and phase.        
    4. Statistical Operators

      Operator Name Description Native Acceleration
      C VIS MMX Notes
      extrema Computes the maximum and minimum pixel values of an image. X X   Only if the ROI is null or encloses the entire image.
      histogram Computes the histogram of an image.        
      mean Computes the mean pixel value of a region of an image. X X   Only if the ROI is null or encloses the entire image and the sampling period is 1.
    5. Sourceless Operators

      Operator Name Description
      imagefunction Creates an image by evaluating a function.
      pattern Creates an image consisting of a repeated pattern.
    6. File and Stream Operators

      Operator Name Description
      awtimage Converts a java.awt.Image into a PlanarImage.
      bmp Loads an image in BMP format.
      encode Writes an image to an OutputStream.
      fileload Loads an image from a file.
      filestore Writes an image to a file in a given format.
      fpx Loads an image in FlashPIX format.
      gif Loads an image in GIF format.
      iip Reads an image from a remote IIP server, performing IIP view transforms (affine, colortwist, filter, crop).
      iipresolution Reads a single resolution of an image from a remote IIP server.
      jpeg Loads an image in JPEG format.
      png Loads an image in PNG 1.0 or 1.1 format.
      pnm Loads an image in PBM, PGM, or PPM format.
      stream Loads an image from a stream.
      tiff Loads an image in TIFF 6.0 format.
      url Loads an image from a URL.
    7. Other Operators

      Operator Name Description
      errordiffusion Performs error diffusion color quantization using a specified color map and error filter.
      null Performs no processing. Useful as a placeholder in an operation chain or as a node which emits meta-data.
      ordereddither Performs color quantization using a specified color map and a fixed dither mask.
      renderable Constructs a RenderableImage from a RenderedImage source.

How to Run the JAI 1.1 version of Remote Imaging

1. Create a Security Policy File

If $JAI is the base directory where Java Advanced Imaging is installed, create a text file named $JAI/policy containing the following:

  grant {
    // Allow everything for now
    permission java.security.AllPermission;
  };
Note that this policy file is for testing purposes only, and it is not recommended that full permission be given to all programs.

For more information on policy files and permissions please see:

http://java.sun.com/products/jdk/1.3/docs/guide/security/PolicyFiles.html

http://java.sun.com/products/jdk/1.3/docs/guide/security/permissions.html

2. Start the RMI Registry

Log in to the remote machine where the image server will be running and start the RMI registry. For example, in the Solaris operating environment using a Bourne-compatible shell (e.g., /bin/sh):

  $ unset CLASSPATH
  $ rmiregistry &
Note that the CLASSPATH environment variable is deliberately not set.

3. Start the JAI Remote Image Server

While still logged in to the remote server machine, set the CLASSPATH and LD_LIBRARY_PATH environment variables as required for JAI (see the INSTALL file) and start the remote imaging server:

  $ CLASSPATH=$JAI/lib/jai_core.jar:$JAI/lib/jai_codec.jar:\
              $JAI/lib/mlibwrapper_jai.jar
  $ export CLASSPATH
  $ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAI/lib
  $ export LD_LIBRARY_PATH
  $ java \
  -Djava.rmi.server.codebase=\
  "file:$JAI/lib/jai_core.jar file:$JAI/lib/jai_codec.jar" \
  -Djava.rmi.server.useCodebaseOnly=false \
  -Djava.security.policy=file:$JAI/policy \
  com.sun.media.jai.rmi.JAIRMIImageServer

For example, when the above steps are executed on a machine with IP address 123.456.78.90 the following is printed:

  Server: using host 123.456.78.90 port 1099
  Registering image server as "rmi://123.456.78.90:1099/JAIRMIRemoteServer1.1".
  Server: Bound RemoteImageServer into the registry.
4. Run the Local Application

Run the local application making sure that the serverName parameter of any javax.media.jai.remote.RemoteJAI constructors corresponds to the machine on which the remote image server is running. For example, if the machine with IP address 123.456.78.90 above is named myserver the serverName parameter of any RemoteJAI constructors should be "myserver".

How to Run the JAI 1.0.2 version of Remote Imaging

For more information on RMI (remote method invocation) please refer to: http://java.sun.com/products/jdk/rmi/index.html

1. Create a Security Policy File

If $JAI is the base directory where Java Advanced Imaging is installed, create a text file named $JAI/policy containing the following:

grant {
  // Allow everything for now
  permission java.security.AllPermission;
};
Note that this policy file is for testing purposes only.

For more information on policy files and permissions please see:

http://java.sun.com/products/jdk/1.2/docs/guide/security/PolicyFiles.html

http://java.sun.com/products/jdk/1.2/docs/guide/security/permissions.html

2. Start the RMI Registry

Log in to the remote machine where the image server will be running and start the RMI registry. For example, in the Solaris operating environment using a Bourne-compatible shell (e.g., /bin/sh):

$ unset CLASSPATH
$ rmiregistry &
Note that the CLASSPATH environment variable is deliberately not set.

3. Start the JAI Remote Image Server

While still logged in to the remote server machine, set the CLASSPATH and LD_LIBRARY_PATH environment variables as required for JAI (see the INSTALL file) and start the remote imaging server:

$ CLASSPATH=$JAI/lib/jai_core.jar:$JAI/lib/jai_codec.jar:\
            $JAI/lib/mlibwrapper_jai.jar
$ export CLASSPATH
$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAI/lib
$ export LD_LIBRARY_PATH
$ java \
-Djava.rmi.server.codebase=\
"file:$JAI/lib/jai_core.jar file:$JAI/lib/jai_codec.jar" \
-Djava.rmi.server.useCodebaseOnly=false \
-Djava.security.policy=file:$JAI/policy \
com.sun.media.jai.rmi.RMIImageImpl

For example, when the above steps are executed on a machine with IP address 123.456.78.90 the following is printed:

Server: using host 123.456.78.90 port 1099
Registering image server as
  "rmi://123.456.78.90:1099/RemoteImageServer".
Server: Bound RemoteImageServer into
   the registry.

4. Run the Local Application

Run the local application making sure that the serverName parameter of any RemoteImage constructors corresponds to the machine on which the remote image server is running. For example, if the machine with IP address 123.456.78.90 above is named myserver the serverName parameter of any RemoteImage() constructors should be "myserver".

Documentation

The Java Advanced Imaging API White Paper, the HTML document of the API, and a programmer's guide – "Programming in Java Advanced Imaging" – as well as a quick-reference guide can be found at http://java.sun.com/products/java-media/jai/docs/

What's New

This section describes the significant changes and improvements to the Java Advanced Imaging API and its reference implementation since the previous release.

  • Changes from JAI 1.0.2 to JAI 1.1-beta

      SPECIFICATION CHANGES

    • Network Imaging

      A new architecture has been introduced in JAI 1.1-beta to perform Remote Imaging. The javax.media.jai.RemoteImage class which was used for Remote Imaging in JAI 1.0.x has been deprecated in JAI 1.1-beta. The main classes and interfaces for the new Remote Imaging architecture in JAI 1.1-beta can be found in the javax.media.jai.remote package. For detailed information, please refer to the Javadoc.

      An implementation of the JAI 1.1-beta Remote Imaging architecture is provided using RMI as the communication mechanism. This remote imaging protocol which uses RMI as the communication mechanism and expects instances of JAI to be running on both the client and the server is identified by the protocol name "jairmi". Thus in order to construct an instance of javax.media.jai.remote.RemoteJAI, the arguments that should be passed to the constructor should be the following: "jairmi" should be provided as the protocolName string, and the serverName string should refer to a server that has a server running which implements the "jairmi" protocol. Such a server is also provided in the JAI 1.1-beta release, the server is com.sun.media.jai.rmi.JAIRMIImageServer. Instructions on running Remote Imaging in JAI 1.1 are included above. It may be noted that this server which is compatible with the "jairmi" protocol is different from the server that was included with the JAI 1.0.x distribution (com.sun.media.jai.rmi.RMIImageImpl). The previous version of the server can still be used with a client that uses javax.media.jai.RemoteImage, but this use is discouraged as RemoteImage is deprecated as of JAI 1.1-beta.

    • OperationRegistry

      Numerous changes were made to enhance the OperationRegistry and the capabilities that it provides.

      • JAI Registry File

        The registry file packaged outside the jar files is no longer part of the distribution. JAI 1.1-beta has a new way of adding user defined image operations and other registry information and for the automatic detection of these. Please read the javadoc for the OperationRegistry class for more information.

      • OperationRegistry

        The OperationRegistry has been extended to manage factories of image operation modes other than just "rendered" and "renderable". It has been extended to manage as yet unknown image operation modes as well as non-image operation modes. All mode-specific methods in OperationRegistry have therefore been deprecated. Separate mode-specific wrapper classes have been provided to allow compile-time type-safe access to the image factory management methods. (See RegistryMode, RIFRegistry, CRIFRegistry etc. for more information.)

        The OperationRegistry constructor is no longer thread safe (cf. getThreadSafeOperationRegistry() for more information).

      • OperationDescriptor

        OperationDescriptor and OperationDescriptorImpl have also been extended to manage image operation modes other than just "rendered" and "renderable". Mode-specific methods have therefore been deprecated and equivalent methods where the mode-names are explicitly specified have been added.

        The following new interfaces/classes to allow more flexible handling of parameter lists have been added :

        • ParameterListDescriptor/ParameterListDescriptorImpl
        • ParameterList/ParameterListImpl

        ParameterListDescriptor[Impl] in particular adds support for enumerated parameters as defined by the new EnumeratedParameter class.

        ParameterBlockJAI has also been rewritten to support the ParameterList interface.

        OperationDescriptorImpl now validates class types of paramDefaults against paramClasses (was not done in JAI 1.0.2).

      • Warning

        The user is strongly advised against using both the deprecated and the new API in OperationRegistry and OperationDescriptor. So it is better to either update all or none of the user code with respect to the new API.

    • TileCache

      Design changes in the TileCache have been implemented in order to improve memory usage, performance and tile cache monitoring.

      • The TileCache can be globally enabled or disabled.
      • A new CachedTile interface has been provided.
      • A new cache metric has been added to allow alternate tile removal schemes to be implemented, other than the default "Least Recently Used" algorithm. Support for custom Comparators has been added.
      • Code has been inlined to improve performance.
      • Tiles that are no longer referenced will be properly garbage collected. This includes operators that go out of scope in a method.
      • The setTileCapacity() method has been deprecated.
      • The getTileCapacity() method has been deprecated.
      • New methods have been added to retrieve or set the percentage of memory in the tile cache which will be released if the tile cache becomes full.
      • Improved handling of OutOfMemoryError conditions.
      • New methods have been added to deal with multiple tiles. For example, all the tiles associated with a given operator can be retrieved in a single method call.
      • New diagnostic capabilities to allow monitoring of the tile cache.

    • Improved Property (Meta-data) Management

      The handling of JAI properties (meta-data) has been enhanced and handling of Java Bean-style properties and events has been introduced. General benefits of this include the following:

      • Property names are now handled in a case-retentive as opposed to case-insensitive manner.
      • Property values are now synchronous in the manner of image data and not subject to change as a result of an upstream property having been modified.
      • Some aspects of the specification, including the use of multiple property name spaces, have been clarified.

      Some specific code changes to achieve the above include:

      • A base class PropertyChangeEventJAI of JAI-generated bean-style events was defined.
      • An event class PropertySourceChangeEvent was created to link the concepts of JAI properties and bean-style events.
      • An interface PropertyChangeEmitter was defined to allow simple identification of objects which may emit events.
      • Some modifications of the PropertySource and WritablePropertySource interfaces were made to improve generality.
      • A WritablePropertySource sub-interface was created and ImageJAI was modified to implement it instead of PropertySource. WritablePropertySource also extends PropertyChangeEmitter.
      • All classes which implement ImageJAI including PlanarImage are therefore WritablePropertySources and hence PropertyChangeEmitters.
      • Utility classes PropertySourceImpl and WritablePropertySourceImpl have been provided.
      • An OperationNode interface was created to generalize the commonalities among nodes in different types of operation chains. A helper class OperationNodeSupport was introduced for use by classes which implement OperationNode.
      • PlanarImage, CollectionImage, and RenderableOp have been modified to use helper objects of type WritablePropertySourceImpl and PropertyChangeSupportJAI.
      • RenderedOp, RenderableOp, and CollectionOp have been modified to use a helper object of type OperationNodeSupport.

    • Support for Editing Rendered Op Chains

      The ability to edit chains of RenderedOps has been implemented. In JAI 1.0.2 once a node in a RenderedOp chain had been rendered it could no longer be modified.

      • Add RenderingChangeEvent for forward propagation in the chain from the edited node.
      • Add OperationDescriptor.getInvalidRegion() to determine the area which would be affected by changing the parameters or hints passed to an operation.
      • RenderedOp is made to be a generator and listener of events associated with modifying the parameters and hints of the node as well as of RenderingChangeEvents.
      • A helper object of type OperationNodeSupport is used to manage much of the event, parameter, and hint handling in a centralized manner.

    • Improvements in Multi-tile Processing

      Multi-tile processing has been modified to allow control over the number of processing threads and their priority, and to introduce the concept of notification events to indicate completion of tile computation.

      • The TileScheduler now permits the number of processing threads and their priority to be set for both standard jobs and for prefetch jobs.
      • A listener interface TileComputationListener is defined which can receive notification when tiles are computed or when an error occurs.
      • A cancelTiles() method and a new version of scheduleTiles() which accepts TileComputationListeners were added to the TileScheduler interface.
      • A method queueTiles() was added to PlanarImage. This method is non-blocking and allows for notification when tiles are done. A cancelTiles() method was also added.
      • PlanarImage was modified to allow registration of TileComputationListeners which are to be notified when tiles are computed using queueTiles().
      • The OpImage and RenderedOp subclasses of PlanarImage were modified to override the new queue and cancel methods as needed.

    • Non-image Data in Processing Chains

      The primary change of this nature was to enable deferring the computation of non-image data in processing chains in a manner to that which had already been available for image data.

      • Added an abstract class DeferredData which is the top-level class for data objects the computation of which is to be delayed.
      • Added a concrete DeferredProperty subclass to enable data computation deferral for image properties.
      • Added NullCRIF to simplify creating nodes in operation chains which are present merely to emit non-image data.

    • Image Collection API Modifications

      Numerous changes were made to raise the quality level of the image collection API to be similar to that of the rendered image API and to provide a more general set of specific image collection implementations.

      • AttributedImage and AttributedImageCollection supersede the classes CoordinateImage, SequentialImage, ImageStack, and ImageSequence.
      • Clarified and improved support for renderable imaging in collection chains. Added RenderableCollectionImageFactory interface for use in the renderable collection mode.
      • Added chain editing and event notification analogous to that which is added to rendered chains in this release. In this context added the CollectionChangeEvent class and an update() method to the CollectionImageFactory interface.
      • Added the RenderedImageList class which provides a RenderedImage which is also a CollectionImage. As such this could be used as the class of a rendering of a node in either a collection or a rendered image chain.

    • Serialization Support

      Added several classes to improve the serialization of objects in JAI.

      • Moved the formerly private SerializableRenderedImage class to the public API. This class allows serialization of an instance of any class which implements RenderedImage.
      • Added Serializer and SerializableState interfaces and the SerializerFactory to centralize and thereby simplify the process of serializing objects which are instances of classes which do not implement java.io.Serializable.

    • Miscellaneous Core Modifications

      Numerous minor code modifications were effected. The changes are listed in a subsequent section; new classes are described presently.

      • CRIFImpl

        A utility class to simplify implementing ContextualRenderedImageFactory classes.

      • ColormapOpImage

        A class to be used to implement an operation which may conditionally be accelerated by transforming the colormap of the source image instead of its data.

      • GeometricOpImage

        An abstract base class for image operators that perform a geometric transformation of the source image. The core classes ScaleOpImage and WarpOpImage now extend this class. The former class hierarchy was OpImage > WarpOpImage > ScaleOpImage.

      • ColorSpaceJAI

        Adds some methods to the base ColorSpace class to enable color conversion of a raster of data at a time. This should permit efficient implementation of mathematically defined color spaces for which no ICC profile is available.

      • IHSColorSpace

        A representation of the IHS color space.

      • PixelAccessor

        A utility class that may be used to access the pixel data stored in a RenderedImage's Rasters, as well as performing pixel-to-color data translation based on the image's SampleModel and ColorModel. It also provides several static methods to determine information about the image data. This class uses two other new core classes: PackedImageData and UnpackedImageData which are used to store packed and unpacked data, respectively along with access information.

    • Uncommitted Codecs Specification Modifications

      Changes were made primarily to improve the TIFF codec.

      • SeekableOutputStream:
        This class was added to enable compression in the TIFF encoder.

      • TIFF decoding:
        • Support reading 32-bit integer and floating point data.
        • Support gray-alpha (2-band) image loading.
        • Support N-banded inputs of 8X-bit depth.
        • Read YCbCr and CMYK images.
        • Read DEFLATE-compressed images.
        • Read JPEG-in-TIFF 8-bit images which are 1-band grayscale or 3-band YCbCr or RGB.
        • Support reading from an arbitrary offset to enable decoding a private IFD.

      • TIFF encoding:
        • Support writing tiled images.
        • Support writing 32-bit integer and floating point data.
        • Support writing multiple pages (images) per TIFF file.
        • Write gray-alpha images.
        • Write N-banded inputs of 8X-bit depth.
        • Write PackBits-compressed images.
        • Write DEFLATE-compressed images.
        • Write JPEG-in-TIFF 8-bit images which are 1-band grayscale or 3-band RGB.
        • Write extra user-specified fields.

      GENERAL CHANGES

    • Backward compatibility

      Excluding the JAI operators, backward compatibility should have been preserved for all non-extenders of the API. This is to say that all public fields and methods of all public classes should be backward compatible with the exception of public constructors of abstract classes.

      Concerning the JAI operators, certain changes have been made which are backward incompatible:

      • Border

        • The BORDER_* constants were removed from the OperationDescriptor.
        • The "constants" parameter was deleted from the operation.
        • The "type" parameter changed from an Integer to a BorderExtender.

      • ColorConvert

        The single parameter "colorSpace" was renamed "colorModel" and its type was changed to ColorModel.

      • Histogram

        The parameter set of the operator was changed to the following:

        Parameters
        Name Class Default
        roi ROI null (entire image)
        xPeriod Integer 1 (all pixels across rows)
        yPeriod Integer 1 (all pixels down columns)
        numBins int[] {256}
        lowValue double[] {0}
        highValue double[] {256.0}

      • Composite, DFT, IDFT, MedianFilter, Shear, Transpose

        The integral constants defined in the OperationDescriptor associated with each of these operations have been changed to be subclasses of the new class javax.media.jai.EnumeratedParameter.

    • Deprecations

      This section lists only deprecated interfaces and classes. For more details please refer to the JAI Javadoc.

      • javax.media.jai.CoordinateImage
      • javax.media.jai.ImageSequence
      • javax.media.jai.ImageStack
      • javax.media.jai.RemoteImage
      • javax.media.jai.SequentialImage
      • javax.media.jai.widget package and all classes therein

      CLASS-LEVEL CHANGES

    • New Packages

      The following packages have been added to the specification:

       
      Package Content
      javax.media.jai.registry Registry modes and helper classes
      javax.media.jai.remote JAI network imaging
      javax.media.jai.tilecodec Tile codecs used in JAI network imaging
      javax.media.jai.util Public utility classes

    • New Interfaces

      The following interfaces have been added to the javax.media.jai package:

      CachedTile
      OperationNode
      OperationRegistrySpi
      ParameterList
      ParameterListDescriptor
      PropertyChangeEmitter
      RegistryElementDescriptor
      RenderableCollectionImageFactory
      TileComputationListener
      WritablePropertySource

    • New Classes

      The following classes have been added to the javax.media.jai package:

      AttributedImage
      AttributedImageCollection
      CRIFImpl
      CollectionChangeEvent
      ColorSpaceJAI
      ColormapOpImage
      DeferredData
      DeferredProperty
      EnumeratedParameter
      GeometricOpImage
      IHSColorSpace
      NullCRIF
      OperationNodeSupport
      PackedImageData
      ParameterListDescriptorImpl
      ParameterListImpl
      PixelAccessor
      PropertyChangeEventJAI
      PropertyChangeSupportJAI
      PropertySourceChangeEvent
      PropertySourceImpl
      RegistryMode
      RenderedImageList
      RenderingChangeEvent
      UnpackedImageData
      WritablePropertySourceImpl

    CHANGES TO CORE CLASSES

    Note: These changes are not comprehensive but indicate the major changes which would affect re-tooling an extant product. For complete details please refer to the API specification javadoc which takes precedence in case of discrepancy.

    • Histogram

      • Two new convenience constructors were added.
      • Methods were added to retrieve bin counts over ranges.
      • Added methods to extract derived statistics including the mean, standard deviation, entropy, and arbitrary moments including central, absolute, and absolute central moments.
      • Add methods to derive a histogram using a rectangular, weighted rectangular, or Gaussian moving window.
      • Add methods to compute a band-by-band threshold by the iterative selection, maximum entropy, maximum between class to within class variance, minimum error, minimum fuzziness, mode, and P-tile algorithms.

    • JAI

      • A number of RenderingHints.Key constant fields were added for ColorModel initialization in OpImage, remote imaging and serialization, TileCache metric, and the TileScheduler.
      • A default tile size to be used by OpImage was defined via an accessor and mutator.
      • A getBuildVersion() method was added.
      • Many of the static create() convenience methods were deprecated.

    • ROI

      The getAsImage() method now returns a binarized (bilevel) form of the image used to create the ROI. The binarized image is created using the specified threshold.

    • ROIShape

      The getAsImage() method was modified to return a bilevel (binary) image instead of one which contains byte data.

    • ParameterBlockJAI

      Support for named sources was added.

    • PlanarImage

      • A method getDefaultColorModel() was added.
      • A new constructor was added: PlanarImage(layout,sources,properties).
      • setImageParameters() was replaced with setImageLayout(ImageLayout) which, unlike the method it replaces, verifies that if both a SampleModel and ColorModel are provided they are compatible as follows:
        • The SampleModel satisfies ColorModel.isCompatibleSampleModel(), and
        • If the ColorModel is a ComponentColorModel that:
          • The number of bands of the SampleModel equals the number of components of the ColorModel, and
          • SampleModel.getSampleSize(b) >= ColorModel.getComponentSize(b) for all bands b.
        This verification of SampleModel/ColorModel compatibility is also performed in the PlanarImage constructor which accepts an ImageLayout.
      • getNumBands() was added.
      • getTileIndices(Rectangle) was added to return the indices of all tiles overlapping a given Rectangle.
      • Raster[] getTiles() was added to return all tiles in the image.
      • getSources() was modified to return null if there are no sources instead of returning an empty Vector.

    • RenderedOp, RenderableOp, and CollectionOp

      Formerly the ParameterBlock and RenderingHints of the node were saved by reference. They are now cloned. Consequently code such as

      RenderableOp opNode;
      ParameterBlock pb;
      Vector sources;
      
      opNode.setParameterBlock(pb);
      pb.setSources(sources);
      

      will no longer work as before. In this case the sources on the node will not be updated. Likewise the following code would not change the sources of the node:
      pb = opNode.getParameterBlock();
      pb.setSources(sources);
      

    • RasterAccessor

      • Enhanced support for bilevel data handling.
      • Added methods: isBinary(), copyBinaryDataToRaster(), and getBinaryDataArray().

    • TiledImage

      • Added two constructors:
        • TiledImage(RenderedImage,boolean areBuffersShared)
        • TiledImage(RenderedImage,tileWidth,tileHeight)
      • Added two methods to retrieve a sub-image while specifying its ColorModel.

    • PlanarImage Hierarchy

        Many constructors in the PlanarImage hierarchy were modified. This is likely to be the source of many compilation errors encountered while building a JAI 1.0.2 application against JAI 1.1-beta.

      • OpImage

        • Removed the field "extenders" of type BorderExtender[]. BorderExtenders are not needed by all subclasses and so are pushed down to the top level classes in sub-hierarchies to which they are relevant. Within JAI this includes AreaOpImage and GeometricOpImage.

          Extenders of OpImage which previously utilized BorderExtenders are recommended to either:

          1. Include the BorderExtender in the subclass and override computeTile(), or
          2. Extend AreaOpImage and set the padding values to zero.

        • All previous constructors were deleted and replaced with the single constructor defined in the new version of the class.

      • AreaOpImage

        • Replaced previous constructor with a new definition
        • Added BorderExtender accessor and boolean presence verifier.

      • NullOpImage

        Added a new constructor; deprecated previous one.

      • PointOpImage

        • Replaced previous constructor with a new definition.
        • Modified checking of destination and source image bounds:
          • The intersection of all source bounds must be non-empty.
          • If the destination bounds are specified, the intersection of these bounds and the intersection of all source bounds must also be non-empty.
        • Added isColormapOperation() in support of colormap acceleration.

      • ScaleOpImage

        • Replaced previous constructor with a new definition
        • Deprecate accessor of padding values which are available from the Interpolation object.

      • SourcelessOpImage

        Replaced previous constructor with a new definition

      • UntiledOpImage

        • Added a constructor which permits multiple sources.
        • Changed specification of computeImage().

      • WarpOpImage

        Replaced previous constructor with a new definition

      OPERATOR CHANGES

    • New Operators

      The following operators have been added: bandmerge, binarize, dilate, erode, filteredsubsample, maxfilter, minfilter, null, subsamplebinarytogray, unsharpmask.

    • Changes to operators

      • As outlined above, the operators Border, ColorConvert, Composite, DFT, IDFT, Histogram, MedianFilter, Shear, and Transpose have been modified such that they are backward incompatible with JAI 1.0.2.

      • The "FileLoad" operator now has a "checkFileLocally" parameter which specifies whether the existence of the file to be loaded should be checked on the local file system.

      • The TIFF operator now has a "page" parameter but this change is backward compatible with JAI 1.0/1.0.2. The "TIFF" operator now also sets a property called "tiff_directory" on the RenderedImage generated.
      CHANGES TO CODEC HELPER CLASSES

    • ImageCodec

      Fixed bug wherein createGrayIndexColorModel() was returning a ramp inverted from that which was expected.

    • JPEGEncodeParam

      Implement Cloneable interface.

    • SimpleRenderedImage

      Fixed bug wherein getProperty() was returning null for an undefined property instead of java.awt.Image.UndefinedProperty.

    • SeekableOutputStream

      Added class to support compression in TIFF encoding.

    • TIFFDecodeParam

      Added methods getJPEGDecompressYCbCrToRGB(), getIFDOffset(), setIFDOffset(), and setJPEGDecompressYCbCrToRGB().

    • TIFFDirectory
      • Added "directory" parameter to the constructor which accepts an IFD offset.
      • Added methods getIFDOffset() and getNextIFDOffset().

    • TIFFEncodeParam
      • Added fields COMPRESSION_DEFLATE and COMPRESSION_JPEG_TTN2.
      • Added methods getJPEGCompressRGBToYCbCr(), getJPEGEncodeParam(), getDeflateLevel(), getTileHeight(), getTileWidth(), getExtraImages(), setExtraImages(), setDeflateLevel(), setJPEGCompressRGBToYCbCr(), setJPEGEncodeParam(), setTileSize(), setExtraFields(), getExtraFields().

    • TIFFField

      Implement the Comparable interface: add compareTo() method.

      PERFORMANCE CHANGES

    • Native Acceleration

      • All Platforms

        • Native acceleration has been added to the "Warp" operation for the cases wherein the warp uses a grid or a polynomial for the geometric mapping and the interpolation object is an instance of InterpolationTable.

        • Native acceleration was expected to have been added for the new "FilteredSubsample" operation but was unavailable at the time of JAI 1.1-beta release. This will be made available for the final release of JAI 1.1.

      • Windows

        As described above, MMX hardware acceleration was added for the following operations:

        • arithmetic operators (add, addconst, and subtract only)
        • logical operators (and, not, or, xor)
        • affine (nearest neighbor, bilinear, bicubic)
        • convolve (3x3 and 5x5; general and separable cases)
        • scale (nearest neighbor, bilinear, bicubic)
        • absolute
        • bandcombine
        • transpose

    • Operations on Bilevel (Binary) Data

      Binary images are defined to be those which have a SampleModel which is single-banded, is an instance of MultiPixelPackedSampleModel, and has a pixel bit stride (bits/pixel) of unity (1). Note that the SampleModel may have a transfer type of byte, short, or int and may have a bit offset. The most efficient case will in general be when the transfer type is byte and the bit offset is zero. For non-geometric accelerated operations, more efficiency (in speed and memory usage) should also be obtained by using the same tile size for all source and destination images.

      Some operations can process binary data directly in packed form. These operations are the following:

      • Absolute
      • Add
      • Affine (Nearest Neighbor interpolation only)
      • And
      • Copy
      • Dilate
      • Divide
      • Erode
      • Invert
      • Multiply
      • Not
      • Or
      • Rotate (Nearest Neighbor interpolation only)
      • Shear (Nearest Neighbor interpolation only)
      • Subtract
      • Translate (Nearest Neighbor interpolation only)
      • Xor

      All the above operations are binary accelerated without native code. Additionally the following operations are accelerated for binary data using native code:

      • Binarize
      • Convolve (3x3 kernels only)

    • Operations on Colormapped Data

      When the source and destination images of certain operations are colormapped imagery, i.e., both have an IndexColorModel, processing may be accelerated in one of two ways.

      1. Colormap Modification

        In the first case the operation may be implemented by simply modifying the colormap (IndexColorModel) rather than actually processing the data. The operations for which this type of acceleration is implemented are the following:

        • AddConst
        • AndConst
        • DivideByConst
        • DivideIntoConst
        • Exp
        • Invert
        • Log
        • Lookup
        • MultiplyConst
        • Not
        • OrConst
        • Piecewise
        • Rescale
        • SubtractConst
        • SubtractFromConst
        • Threshold
        • XorConst

        All colormap modification processing is performed without native code.

      2. Geometric Processing

        When the interpolation used for geometric processing is nearest neighbor there is no need to expand the index data into RGB before warping the data. This type of processing should be about three times faster than if RGB data of the same dimensions were processed. All geometric operations support this case: Affine, Rotate, Shear, Transpose, Translate, and Warp. (Most, but not all, of these operations were in fact so accelerated in JAI 1.0.2.)

  • Changes from JAI 1.1-beta to JAI 1.1-beta1

      SPECIFICATION CHANGES

    • TiledImage

      Deleted instance variable src. The source Vector of the PlanarImage superclass is instead used to manage the single source image, if any.

    • Tile Queueing

      Some changes were made to improve the usability of background tile queueing.

      • TileRequest

        A new interface javax.media.jai.TileRequest was added to represent a list of tiles queued for background processing.

      • TileComputationListener

        • The concept of "per tile" as opposed to "block" listeners was removed. Consequently the isPerTileListener() and tilesComputed() methods were removed. All remaining methods are invoked on a per-tile basis only.

        • A method tileCancelled() was added to be invoked on tile cancellation.

        • The parameter lists of all methods were revised to include eventSource and TileRequest[] parameters.

      • TileScheduler

        • The scheduleTiles() method which accepts listeners was modified to accept only a single array of listeners and to return a TileRequest.

        • cancelTiles() was modified to accept a TileRequest parameter instead of a PlanarImage.

      • PlanarImage, OpImage, and RenderedOp

        • queueTiles() was modified to return a TileRequest.

        • cancelTiles() was modified to accept a TileRequest parameter.

    • javax.media.jai.util.Range

      Added overriding of the hashCode() per the specification of java.lang.Object.

    PERFORMANCE CHANGES

    • Native Acceleration

      • All Platforms

        C acceleration was added to support this operation:

        • "FilteredSubsample" Operation

      • Solaris-only

        VIS acceleration was added to support this operation:

        • "FilteredSubsample" Operation

      • Windows-only

        MMX acceleration for byte and short data was added to support these operations:

        • "AndConst"

        • "BandSelect"

        • "Composite"

        • "Dilate" for 4x4 and 8x8 structuring elements and 1-band images.

        • "Erode" for 4x4 and 8x8 structuring elements and 1-band images.

        • "GradientMagnitude" for generic 3x3 masks.

        • "Max"

        • "MaxFilter" for 3x3 kernels and 1-band images.

        • "MedianFilter" for 3x3 kernels.

        • "Min"

        • "MinFilter" for 3x3 kernels and 1-band images.

        • "OrConst"

        • "Transpose" by 180 degrees.

        • "XorConst"
    BUGS FIXED

    • Core Bugs
      • AreaOpImage allows its BorderExtender to be null but if the extender is null and data outside the source image are requested an exception will be thrown.

      • When a rendering is created from a RenderableOp, properties (meta-data) of the rendering may be overwritten by properties of the same name which are copied from the RenderableOp.

      • Renderable CollectionOps may emit CollectionChangeEvents; these should be emitted only in rendered mode.

      • Cannot set ColorModel via RenderingHints passed to JAI.create().

      • OpImage.getFormatTags() dies with a NullPointerException when calling getFormatTags() from (subclasses of) SourcelessOpImage.

    • Operator Bugs

      • "scale" operation: when scaling a RenderedImage which has a non-zero value returned by getMinX() or getMinY(), a zero-valued row or column may occasionally appear at some border if the interpolation type is nearest neighbor. This fix may cause unexpected behavior in certain applications. In particular, when scaling an image with origin (0, 0), it may no longer be assumed that the origin of the destination image will have origin (0, 0) unless the interpolation type is nearest neighbor or a BorderExtender is provided via the RenderingHints

      • "iip" or "iipresolution" operations: the red and blue (first and third) bands of RGB data may be interchanged under certain circumstances.

      • "errordiffusion" operation: an ArrayIndexOutOfBoundsException exception has been observed when applying this operator to certain sources.

      • "mean" operator gives different results when x/y period != 1 when using mediaLib.

      • MinFilter/SQUARE/5x5 operator with mediaLib generates exception when using multi-band data.

      • "Overlay" fails if attempting to overlay a smaller image on a larger image.

    • Remote Imaging Bugs

      • If the "fileload" operation is executed in renderable mode and the image file to be loaded is visible from the client but not from the server executing the operation then an exception will result. A workaround is to ensure that the file to be loaded is visible from both client and server.

    • Codec Bugs

      • The TIFF decoder will fail with an exception if any of the fields StripByteCounts, StripOffsets, TileByteCounts, or TileOffsets contains an array of SHORTs rather than the more common array of LONGs. The Strip* fields apply to untiled (stripped) data and the Tile* fields to tiled data.

      • Using floating point TIFF images in JAI which were loaded by the JAI TIFF decoder causes a ClassCastException.

      • TIFF X,Y Resolution fields have hard-coded values in images encoded by JAI.

      • TIFF decoder cannot read tiled bilevel data with G3 or G4 compression.

      • TIFF encoder has incorrect tile/strip offsets for some integer, float images.

      • Bug in FileSeekableStream prevents reading of images > 2GB.

  • Changes from JAI 1.1-beta1 to JAI 1.1

      SPECIFICATION CHANGES

    • JAI

      • Initial Value of the Default Tile Size

        This value was changed from 1024 to 512. For information on how to retrieve or modify this value see JAI.getDefaultTileSize() and JAI.setDefaultTileSize(), respectively. For information on how it is used refer to the OpImage constructor documentation.

      • Default Size of a RenderableOp Rendering.

        The default rendering of a RenderableOp node is obtained by RenderableOp.createDefaultRendering(). Formerly the default size of this rendering would frequently devolve to an image of height 1. Some changes were made to permit specifying a more reasonable default size. See RenderableOp.createDefaultRendering() for more information.

        • Added public field KEY_DEFAULT_RENDERING_SIZE to be used as a key to set the default size of a rendering created by RenderableOp.createDefaultRendering() via RenderingHints.

        • Added public method setDefaultRenderingSize() to set the global default rendering size.

        • Added public method getDefaultRenderingSize() to retrieve the global default rendering size.

      • Convenience Method Changes

        Some changes were made to the set of convenience create() methods, both static and non-static.

        • Added public RenderableOp createRenderableNS(String,ParameterBlock,RenderingHints) which accepts RenderingHints. These hints are merged with the global hints on the current JAI instance and the result is set on the created node.

        • Added public static RenderableOp createRenderable(String,ParameterBlock,RenderingHints) which accepts RenderingHints. These hints are merged with the global hints on the default JAI instance and the result is set on the created node.

        • Added public Collection createRenderableCollectionNS(String,ParameterBlock,RenderingHints) which accepts RenderingHints. These hints are merged with the global hints on the current JAI instance and the result is set on the created node.

        • Added public static Collection createRenderableCollection(String,ParameterBlock,RenderingHints) which accepts RenderingHints. These hints are merged with the global hints on the default JAI instance and the result is set on the created node.

        • Deprecated method public RenderableOp createRenderableNS(String,ParameterBlock) which is superseded by the version which accepts RenderingHints.

        • Deprecated method public Collection createRenderableCollectionNS(String,ParameterBlock) which is superseded by the version which accepts RenderingHints.

    • PlanarImage/OpImage Hierarchy Constructors

      These constructors and the PlanarImage source Vector mutator methods were modified to disallow null sources and to remove the constraint that all sources must be RenderedImages.

    • OperationNode and OperationNodeSupport

      Modified this interface and associated utility class to clarify how it is determined that an attribute of a node (ParameterBlock, etc.) has changed when updated via the associated mutator (setParameterBlock(), etc.).

    • CollectionOp

      Modified behavior of method createRendering() to merge hints in RenderContext parameter with those set on the node with the argument hints taking precedence.

    • RenderableOp

      • Added public constructor RenderableOp(OperationRegistry,String,ParameterBlock,RenderingHints) which accepts RenderingHints which are set on the node.

      • Modified behavior of public method createDefaultRendering() to use default rendering size set in node RenderingHints or on the JAI class in preference to using an identity transform for conversion from renderable to rendered coordinates.

    • RenderedOp

      • Added method getCurrentRendering() to retrieve the rendering of the node without forcing the node to be rendered.

      • Added method getNewRendering() to force re-rendering of the node and return the new rendering.

    • PerspectiveTransform

      • Deprecated constructors: PerspectiveTransform(float m00,...), PerspectiveTransform(double m00,...), PerspectiveTransform(float[] flatmatrix), PerspectiveTransform(float[][] matrix), PerspectiveTransform(double[] flatmatrix). These constructors had actually been deprecated before but the incorrect tag @Deprecated prevented their being marked as such in the javadoc.

      • Deprecated methods: public void setTransform(float m00,...) and double[] getMatrix(double[] flatmatrix).

      • Added setTransform(double[][] matrix).

    • EnumeratedParameter

      Changed specification of String returned by toString().

    • Property Environment Behavior

      • OperationRegistry

        Modified specification of the sources parameter of

            public PropertySource getPropertySource(String modeName,
                                                    String descriptorName,
        					    Object op,
                                                    Vector sources) {}
        
        to read:
        sources the PropertySources corresponding to the sources of the object representing the named descriptor in the indicated mode. The supplied Vector may be empty to indicate that there are no sources.

      • OperationNodeSupport

        Revised specification of getPropertySource() to indicate that the global property environment managed by the registry will not be included in the returned PropertySource if the mode in use does not support properties.

    • RenderedImageAdapter

      Changed specification of getTiles() to require that the tile index parameters be verified as lying within the wrapped image's tile array before forwarded the call.

    • SerializerFactory

      Clarified specification of getSerializers(), getSerializer(), and isSupportedClass() in particular with respect to the handling of Serializers which permit subclasses.

      PERFORMANCE CHANGES

    • Native Acceleration

      • Windows Acceleration

        MMX acceleration for byte and short data was added to support these operations:

        • "Clamp"

        • "Extrema"

        • "FilteredSubsample"

        • "GradientMagnitude" optimization for Sobel mask.

        • "Invert"

        • "Lookup"

        • "Mean"

        • "Threshold"

        • "Warp" (for a Warp parameter which is an instance of WarpGrid or WarpPolynomial).
    BUGS FIXED

    A number of inconsistencies between the specification and its implementation were identified and fixed. As these were mostly issues of the clarity of the API documentation and of the accord between exceptions stated versus those actually thrown they are not listed here in detail.

    • Core Bugs

      • PlanarImage.getData(Rectangle) may throw a NullPointerException for bilevel image data when the requested Rectangle intersects the bounds of image tiles which do not intersect the bounds of the image. This problem has been observed when using the "FilteredSubsample" operator but may not be limited to this case.

      • When a RenderedOp node is rendered and subsequently edited and very large (1 Gb) images are in the chain, re-rendering of the chain could be very slow. This was determined to be due to the implementation of the determination of which regions of the chain nodes should be invalidated. The slowest part of the implementation was changed to provide much improved performance.

      • The intersection of certain Rectangles with an ROI in some cases could generate ArrayIndexOutOfBoundsExceptions.

      • Once the ROI threshold is set in the constructor, ROI.setThreshold() has no effect.

      • The OperationNodeSupport constructors were not setting the registry to the JAI default registry when the supplied registry parameter was null.

      • The image adapter classes RenderedImageAdapter, WritableRenderedImageAdapter and RenderableImageAdapter property set did not reflect a change in their source image's properties.

    • Codec Bugs

      • The LZW decoder of the TIFF decoder was modified to detect the end of a compressed data strip when the terminating code "257" is missing.