The bugtraq reports that correspond to this change are:
4228939 and
4268962
In the Java 2 SDK, version 1.2 and 1.3, common operations on a Graphics
object often invalidated the rendering data cached for this Graphics
object. This invalidation interrupted the rendering process by causing
continuous re-creation of rendering information for the Graphics object,
even for such simple and benign operations as create(), setColor(),
and translate(). Because the rendering of Swing hierarchies relies heavily
on these common operations, the invalidation and re-creation of rendering data
caused poor repaint performance for many Swing applications.
The new pipeline architecture reduces this performance overhead with several
implementation changes that:
Improve the way that data is shared by the various rendering pipelines.
Reduce the amount of code executed and garbage created when responding
to changes in the rendering attributes.
Improve the way that various graphics routines are chosen such as the
routines that copy pixels from one format and location to another.
These changes are especially noticeable when the following calls are
used frequently, as they are in Swing applications:
getGraphics, Graphics.create() and Graphics.dispose()
Graphics.setColor(), Graphics.translate
Graphics.copyArea, especially when the source and destination
regions overlap.
The runtime footprint should also be improved through better code sharing.
Other changes in the pipeline architecture have greatly improved the
performance of:
draw(Shape) and fill(Shape), especially when the
Shape is a GeneralPath
scaled drawImage.
Blitting from an offscreen image created with createImage()
multiple times without any intervening rendering or
modifications to that image
Remote X11 display over the network of applications that use
createImage() to create an image buffer for double buffering.
Rendering non-opaque text.
Systems, such as the SGI Visual 320 workstation, which have
display cards that use an RGBx format for pixel storage.
Rendering coordinates outside of the range -32768 to 32767 with
antialiasing turned off.
The bugtraq report that corresponds to this change is:
4330166
The SDK 1.4 provides access to hardware acceleration for offscreen images,
resulting in better performance of rendering to and copying from these images.
One problem with hardware-accelerated images is that, on some platforms such as
Microsoft Windows, their contents can be lost at any time due to circumstances beyond
the application's control. The new
VolatileImage
class allows you to create a hardware-accelerated offscreen image and manage
the contents of that image.
This new API includes:
java.awt.image.VolatileImage:
This class represents an image whose content can be lost at any time,
but provides performance benefits. For example, on Microsoft Windows this image can
be stored in VRAM and can benefit from hardware acceleration. The class
includes methods that you can call to find out if the contents of the
image need to be restored.
createVolatileImage(w,h) in Component.
This method creates a VolatileImage that is compatible with the
Component.
The bugtraq report that corresponds to this change is:
4101949
The JavaTM Image I/O API is an pluggable,
extensible framework that supports reading and writing images of various
formats and protocols. The API provides this support through plug-ins, most
of which will be written by third parties. A conforming implementation
will only be required to provide a minimal set of plug-ins, principally for
compatibility with previous versions of the Java SDK. An application using
this API should be able to read and write images without knowing the image's
storage format or the plug-in used to support the format.
Fundamentally, all image I/O operations consist of reading or writing streams that
contain one or more images, one or more preview (thumbnail) images associated with each
image, and metadata, which is everything other than pixel data.
The Java Image I/O API allows applications to:
Auto-detect installed plug-ins
Choose plug-ins based on format name, file suffix, file contents, or MIME type
Access individual images in multi-image files
Monitor reading and writing progress
Provide progressive updates of images being loaded
Read or write only a region of interest of an image
Read only selected bands of an image
Choose the output size of resolution-independent imagery
Retrieve detailed image and stream metadata
Work with unknown formats using generic interfaces
Work efficiently with both random-access and streaming data sources
Transcode between different formats
See Java Image I/O
for more information on the Java Image I/O API.
The bugtraq reports that corresponds to this change are:
4285177 and
4360752
This API is the product of
JSR006, Unified Printing API, and will allow
client applications to provide rich access to the capablities of print
services available including:
Printer browsing and selection
Discovery of the capablities of printers
Selection of printers for a printer job
Specification of a printer job.
Since all capabilities will be exposed through the API, server applications
become first class citizens of this API.
Server applications can be beneficiaries of the capabilities for spooling
documents to print services, whereas previously only graphics calls
could be used to generate printer jobs from Java applications.
The bugtraq report that corresponds to this change is:
4364491
Prior to the SDK 1.4, the Java 2D API did not have DataBuffer
subclasses for float or double sample types. The Java Image I/O API needs
these classes to read and write float and double image types.
The SDK 1.4 contains two new classes to provide float and double
image type support:
DataBufferFloat and
DataBufferDouble. The DataBufferFloat class
wraps float arrays of pixels. The DataBufferDouble class
wraps double arrays of pixels.
The existing
ComponentColorModel and
ComponentSampleModel class implementations have also been
updated to support signed short,float, and double data. These
classes include definitions of the normalized ranges of
component values for the newly-supported data types:
For the existing data types, the range remains 0.0 to 1.0.
For short data, the values are scaled to between -1.0 and 1.0.
For float data, the range is the full range of the float primitive type.
For double data, the range is also the range of the float primitive type,
since values must be cast to float to interact with the ColorSpace class.
The ComponentColorModel class will not clamp the pixel data.
Applications are expected to scale to the appropriate range.
Methods are added to the
ColorSpace
class to determine per component minimum and maximum normalized values.
Alpha component values must still range from 0.0 to 1.0 normalized.
The bugtraq report that corresponds to this change is:
4285083
The Unicode Bidirectional Algorithm analyzes text using the Unicode
character properties and determines the direction of runs of the
text. The algorithm is necessary to properly display bidirectional text,
such as Hebrew and Arabic text, in the correct order.
The current implementation is all written in the Java programming language,
but the SDK 1.4 will include
efficient access from native font code so that Hebrew and Arabic text
can be more efficiently rendered. The SDK 1.4 will provide access to the
native code through the Java Native Interface.
The new public Bidi class
implements the Unicode 3.0 Bidi Algorithm
and allows access to information on the bidirectional reordering of text
so that the mixed, bidirectional text is properly displayed.
The example BidiSample demonstrates
some of the Bidi routines.
Before this release, the T2K font rasterizer used by Java 2D did
not support font-hinting for TrueType fonts. As a result, when TrueType
fonts did not always display with a consistent,
attractive appearance. For this release, the T2K
rasterizer has been modified to use the hints stored in the TrueType fonts.
By adding this functionality to the T2K rasterizer, dependency on native
rasterizers has been greatly reduced. Reducing this dependency results in:
Greater portability because hinting of TrueType fonts is performed by the
cross-platform T2K rasterizer, not the native rasterizer.
More consistent metrics display of TrueType fonts because the same
rasterizer is being used for on-screen and off-screen drawing.
The bugtraq report that corresponds to this change is:
4285089
For the SDK 1.4, the Lucida fonts that are in the Java 2 SDK will be upgraded
to contain hints. This will give the Java 2 SDK higher quality
fonts that could be used in place of existing fonts or if no other fonts are available.
Adding hints to the Lucida fonts also allows the new cross-platform rasterizer
to hint the Lucida fonts contained in the SDK, which causes the Lucida fonts to
be displayed in a more consistent and attractive manner.
The bugtraq report that corresponds to this change is:
4285161
The SDK 1.4 includes a new architecture for providing general
OpenType font support. This new architecture provides international
character support for contextual scripts like Thai,
Indic, Arabic, and Hebrew. It also provides enhanced typographical
support for Roman languages.
The bugtraq report that corresponds to this change is:
4210199
Currently, when Java 2D renders numerals surrounded
by Arabic text, the numerals have Arabic (roman) shapes,
which are the commonly expected numeral shapes in
most western countries. However, people in a Hindi
locale expect to see Hindi shapes.
The NumericShaper class includes 19 constants representing
different Unicode decimal ranges, allowing you to convert to
19 different digit shapes, including Devanagari and Thai.
Prior to this release, clients could not access glyph-to-character mapping
information from
GlyphVector.
Clients can use this information to find out which glyphs in the
GlyphVector correspond to which characters. This
release also defines new methods to get the precise bounds of the
GlyphVector and of individual glyphs within a GlyphVector.
Note: Although clients can use GlyphVector and the glyph-to-character
mapping information to implement selection and hit testing, most clients
will find TextLayout and the Swing JTextArea and JTextField classes to be
more useful and convenient.
These GlyphVector methods are new in the SDK 1.4:
getGlyphCharIndex(int glyphIndex)
Returns the character index of the specified glyph. The character index
is the index of the first logical character represented by the glyph.
The bugtraq report that corresponds to this change is:
4380232
The AlphaComposite
class provides alpha blending
capabilities according to modes or rules established by
Porter and Duff. Out of the 12 rules that Porter and Duff
identified, the AlphaComposite API for
the SDK, version 1.3 defines and implements
only 8 of them:
Clear
A (Src)
A over B (SrcOver)
B over A (DstOver)
A in B (SrcIn)
B in A (DstIn)
A held out by B (SrcOut)
B held out by A (DstOut)
For the SDK 1.4, AlphaComposite implements the
remaining 4 Porter-Duff rules:
The bugtraq report that corresponds to this change is:
4314043
As of the SDK 1.2 the Font
object has a transform attribute that can be accessed with the
Font.getTransform method.
You can perform geometric transformations, such as rotating and
shearing, on the Font by setting the transform attribute.
However, most applications use the Size attribute rather than the
transform to control the size and shape of characters. In this case, the
transform is a simple identity transform.
Currently, the only way to determine if the transform is an
identity transform is to call getTransform and inspect
the returned AffineTransform. Unfortunately, calling
getTransform requires the Font object to clone the
AffineTransform because the transform is mutable.
Two new methods in the SDK 1.4 allow you to check if a Font object's
transform is an identity tranform without creating a new
AffineTransform:
The bugtraq report that corresponds to this change is:
4328579
A FontRenderContext
object encapsulates state about the
graphics context and is used by GlyphVector and TextLayout.
Three new methods in FontRenderContext
allow you to compare the FontRenderContext
in the GlyphVector against the one in the graphics context
into which the GlyphVector draws: