この変更に関連するバグ追跡レポート: 4228939および4268962
JDK 1.2および1.3では、Graphicsオブジェクトに対する一般操作により、Graphicsオブジェクトのキャッシュされたレンダリング・データが無効になることが頻繁にありました。このため、Graphicsオブジェクトのレンダリング情報が連続して再作成され、create()、setColor()、translate()など、単純で通常は問題の発生しない操作であっても、レンダリング・プロセスが中断されました。Swing階層のレンダリングはこれらの一般操作に大きく依存しているため、レンダリング・データの無効化および再作成により、多くのSwingアプリケーションでは低パフォーマンスでの再レンダリングしかできませんでした。
新たなパイプライン・アーキテクチャでは、次の実装変更により、パフォーマンスのオーバーヘッドが低減されました。
パイプライン・アーキテクチャに関するその他の変更により、次のパフォーマンスが大幅に改善されました。
この変更に関連するバグ追跡レポート: 4330166
JDK 1.4は、オフスクリーン・イメージ用のハードウェア高速化を提供するため、これらのイメージのレンダリングおよびコピーのパフォーマンスが向上します。ハードウェア高速化処理されたイメージの問題点は、Microsoft Windowsなどの一部のプラットフォームでは、状況により内容が突然失われる場合があり、しかもアプリケーションからそれを制御できないことです。新しいVolatileImageクラスを使用すると、ハードウェア高速化処理されたオフスクリーン・イメージを作成し、そのイメージの内容を管理できます。
新規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 SE内のLucidaフォントがアップグレードされ、ヒント情報が含まれるようになりました。このため、Java SEで既存のフォントの代用として、または他のフォントが利用できない場合に使用されるフォントの品質が向上しました。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プラットフォーム用の仮想マシンを表します。