この変更に関連するバグ追跡レポート:4228939 および 4268962
Java 2 SDK バージョン 1.2 および 1.3 では、Graphics オブジェクトに対する一般操作により、Graphics オブジェクトのキャッシュされたレンダリングデータが無効になることが頻繁にありました。このため、Graphics オブジェクトのレンダリング情報が連続して再作成され、create()、setColor()、translate() など、単純で通常は問題の発生しない操作であっても、レンダリングプロセスが中断されました。Swing 階層のレンダリングはこれらの一般操作に大きく依存しているため、レンダリングデータの無効化および再作成により、多くの Swing アプリケーションでは低パフォーマンスでの再レンダリングしかできませんでした。
新たなパイプラインアーキテクチャーでは、次の実装変更により、パフォーマンスのオーバーヘッドが低減されました。
パイプラインアーキテクチャーに関するその他の変更により、次のパフォーマンスが大幅に改善されました。
この変更に関連するバグ追跡レポート: 4330166
SDK 1.4 は、オフスクリーンイメージ用のハードウェア高速化を提供するため、これらのイメージのレンダリングおよびコピーのパフォーマンスが向上します。ハードウェア高速化処理されたイメージの問題点は、Microsoft Windows などの一部のプラットフォームでは、状況により内容が突然失われる場合があり、しかもアプリケーションからそれを制御できないことです。新しい VolatileImage クラスを使用すると、ハードウェア高速化処理されたオフスクリーンイメージを作成し、そのイメージの内容を管理できます。
新規 API には、次のものが含まれます。
VolatileImage
クラスの使用方法の詳細は、Java チュートリアルの「Full-Screen Exclusive Mode API」レッスンを参照してください。
この変更に関連するバグ追跡レポート: 4101949
Java™ Image I/O API は、さまざまな形式およびプロトコルのイメージの読み取りおよび書き込みをサポートする、プラグインおよび拡張が可能なフレームワークです。この API は、プラグインによって機能を実現しています。プラグインの大半はサードパーティーにより作成されています。主に旧バージョンの Java SDK との互換性を維持するために、最小セットのプラグインを提供する場合には、適合実装のみが必要です。この API を使用するアプリケーションでは、イメージの格納形式や、それをサポートするために使用するプラグインの情報がなくても、イメージの読み取りおよび書き込みを実行できます。
基本的に、すべてのイメージ入出力操作は、1 つ以上のイメージ、各イメージに関連付けられた 1 つ以上のプレビュー (サムネール) イメージ、およびピクセルデータ以外のすべてのデータであるメタデータを含む、ストリームの読み取りまたは書き込みで構成されます。
Java Image I/O API を使用すると、アプリケーションで次の操作が可能になります。
Java Image I/O API の詳細については、「Java Image I/O」を参照してください。
この変更に関連するバグ追跡レポート:
4285177 および 4360752
この API は JSR006 で作成された Unified Printing API です。この API を使用することで、次のさまざまな印刷サービス機能をクライアントアプリケーションから利用できます。
印刷サービスにドキュメントをスプールする機能を、サーバーアプリケーションから利用できます。以前は、印刷ジョブを生成するために Java アプリケーションから使用できたのは、グラフィックス呼び出しだけでした。
詳細については「Java 印刷サービス」を参照してください。
この変更に関連するバグ追跡レポート: 4364491
SDK 1.4 より前では、Java 2D API には、float または double サンプル形式用の DataBuffer サブクラスが存在しませんでした。Java Image I/O API は、float および double イメージ形式の読み取りおよび書き込みにこれらのクラスを必要とします。
float および double イメージ形式をサポートするため、SDK 1.4 に DataBufferFloat および DataBufferDouble という 2 つの新しいクラスが追加されました。DataBufferFloat クラスは、ピクセルの float 配列をラップします。DataBufferDouble クラスは、ピクセルの double 配列をラップします。
既存の ComponentColorModel および ComponentSampleModel クラス実装も更新され、署名付きの short、float、および double 型データがサポートされました。これらのクラスには、新たにサポートされたデータ型に対応する、正規化されたコンポーネント値の範囲の定義が含まれています。
次に、追加された全 API のリストを示します。
java.awt.image.ColorModel に、既存のメソッドに対応する 3 つのメソッドが新たに追加されました。
この変更に関連するバグ追跡レポート: 4285083
Unicode 双方向アルゴリズムは、Unicode 文字プロパティーを使用してテキストを分析して、テキストの方向を判別します。このアルゴリズムは、ヘブライ語やアラビア語などの双方向テキストを正しい順序で適切に表示するために必要です。
現行の実装はすべて Java プログラミング言語で記述されていますが、SDK 1.4 ではネイティブのフォントコードから効率的なアクセスが可能になるため、ヘブライ語やアラビア語のテキストをより効率的にレンダリングできるようになります。SDK 1.4 では、Java Native Interface を使用してネイティブコードにアクセスできます。
新しい public BIDI クラスは、Unicode 3.0 BIDI アルゴリズムを実装し、テキストの双方向並べ替えに関する情報へのアクセスを提供します。このため、混在している双方向テキストが正しく表示されます。
サンプルの BidiSample には、BIDI ルーチンのいくつかが示されています。
このリリースより前は、Java 2D が使用する T2K フォントラスタライザは、TrueType フォント用のフォントヒント機能をサポートしていませんでした。このため、TrueType フォントの表示は、常に一貫した美しいものではありませんでした。このリリースでは、TrueType フォント内に格納されたヒントを使用するように T2K ラスタライザが変更されています。
T2K ラスタライザにこの機能を追加することにより、ネイティブラスタライザへの依存度が大幅に低下しました。ネイティブラスタライザへの依存度低下には、次のようなメリットがあります。
この変更に関連するバグ追跡レポート: 4285089
SDK 1.4 では、Java 2 SDK 内の Lucida フォントがアップグレードされ、ヒント情報が含まれるようになりました。このため、Java 2 SDK で既存のフォントの代用として、またはほかのフォントが利用できない場合に使用されるフォントの品質が向上しました。Lucida フォントにヒント情報を追加することにより、新しいクロスプラットフォームラスタライザが、SDK の Lucida フォント内のヒントを使用することも可能になりました。このため、Lucida フォントがより一貫して美しく表示されるようになります。
この変更に関連するバグ追跡レポート: 4285161
SDK 1.4 に、一般的な OpenType フォントサポートを提供するアーキテクチャーが新たに含まれるようになりました。この新たなアーキテクチャーは、タイ語、インド語派、アラビア語、ヘブライ語などの筆記体活字に対応した、国際的な文字サポートを提供します。また、ローマ字言語の拡張入力サポートも提供します。
この変更に関連するバグ追跡レポート: 4210199
現在のところ、アラビア語のテキストで囲まれた数値を Java 2D でレンダリングすると、数値が大半の西欧諸国で一般に使用されているアラビア数字 (ローマ数字) の形状になります。しかし、ヒンディ語ロケールでは、ヒンディ語の形状で表示されることが期待されます。
新規属性 TextAttribute.NUMERIC_SHAPING、および新規クラス NumericShaper を使用すると、ASCII 数字をほかの Unicode 10 進数の範囲に変更できます。
たとえば、TextLayout インスタンスで、数字をヨーロッパ言語からアラビア語に変換する場合、次の操作を実行します。
Numeric Shaper nS = NumericShaper.getContextualShaper(NumericShaper.ARABIC)
Map map = new HashMap(); map.put(TextAttribute.NUMERIC_SHAPING, nS);
FontRenderContext frc = ...; TextLayout layout = new TextLayout(text, map, frc);
layout.draw(g2d, x, y);
NumericShaper クラスには、種類の異なる Unicode 10 進数を表す定数が 19 個あります。このため、デーバナーガリー文字やタイ語文字を含む 19 個の異なる形状に数字を変換できます。
このリリースより前には、クライアントは、グリフから文字へのマッピング情報に GlyphVector からアクセスすることはできませんでした。この情報は、クライアントが GlyphVector 内のグリフがどの文字に対応するかを確認するために使用できます。このリリースでは、GlyphVector および GlyphVector 内の各グリフの正確な境界を取得する新規メソッドも定義されています。
注:クライアントは GlyphVector およびグリフから文字へのマッピング情報を使用して選択およびヒット判定を実装できますが、大半のクライアントでは、TextLayout および Swing の JTextArea クラスや JTextField クラスを使用する方が便利かつ有用です。
SDK 1.4 では、次の GlyphVector メソッドが新たに追加されました。
GlyphVector
内の x,y に対するオフセットで指定されたグリフの視覚表現に対応する Shape
を返す。FontRenderContext
を使用してレンダリングする際の、この GlyphVector
のピクセル境界を返す。GlyphVector
が、指定された FontRenderContext
を使用して指定された位置で Graphics
にレンダリングされる際、インデックスでのグリフのピクセル境界を返す。この変更に関連するバグ追跡レポート: 4380232
AlphaComposite クラスは、Porter および Duff によって確立されたモードまたは規則に従って、アルファブレンド機能を提供します。SDK バージョン 1.3 の AlphaComposite API で定義および実装されている規則は、Porter と Duff が発見した 12 の規則のうちの 8 つに過ぎません。
SDK 1.4 では、AlphaComposite は残りの 4 つの Porter-Duff 規則を実装します。
この変更に関連するバグ追跡レポート: 4314043
SDK 1.2 以降、Font オブジェクトが保持する変換属性には、Font.getTransform メソッドを使ってアクセスできます。変換属性を設定することにより、Font の回転、変形などの幾何学的変換を実行できます。ただし、大半のアプリケーションでは、変換ではなく Size 属性を使用して文字のサイズや形状を制御します。この場合、変換は単純な恒等変換になります。
現在、変換が恒等変換かどうかを判別する唯一の方法は、getTransform を呼び出して、返される AffineTransform を調べることです。しかし、getTransform を呼び出すには、Font オブジェクトが AffineTransform のクローンを作成することが求められます。これは、変換が可変であるためです。
SDK 1.4 で新たに追加された次の 2 つの新しいメソッドを利用すると、AffineTransform を新たに作成しなくても、Font オブジェクトの変換が恒等変換かどうかをチェックできます。
true
を返します。この変更に関連するバグ追跡レポート: 4328579
FontRenderContext オブジェクトは、グラフィックスコンテキストの状態をカプセル化し、GlyphVector および TextLayout により使用されます。FontRenderContext に新たに追加された次の 3 つのメソッドを利用すると、GlyphVector 内の FontRenderContext を、GlyphVector の描画先グラフィックスコンテキスト内の FontRenderContext と比較できます。
これらの同一性メソッドを利用すると、一致検査を実行するためにクライアントが AffineTransform を作成する必要がないため、パフォーマンス上の利点もあります。* この Web サイトで使用されている用語「Java 仮想マシン」または「JVM」は、Java プラットフォーム用の仮想マシンを表します。