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: