Java SE 1.4でのJava 2Dの機能


新しいパイプライン・アーキテクチャ

この変更に関連するバグ追跡レポート: 4228939および4268962

JDK 1.2および1.3では、Graphicsオブジェクトに対する一般操作により、Graphicsオブジェクトのキャッシュされたレンダリング・データが無効になることが頻繁にありました。このため、Graphicsオブジェクトのレンダリング情報が連続して再作成され、create()setColor()translate()など、単純で通常は問題の発生しない操作であっても、レンダリング・プロセスが中断されました。Swing階層のレンダリングはこれらの一般操作に大きく依存しているため、レンダリング・データの無効化および再作成により、多くのSwingアプリケーションでは低パフォーマンスでの再レンダリングしかできませんでした。

新たなパイプライン・アーキテクチャでは、次の実装変更により、パフォーマンスのオーバーヘッドが低減されました。

次の呼出しをSwingアプリケーション内で頻繁に使用する場合、上記の変更の効果が特に顕著に表れます。 コード共有の向上により、実行時のサイズも改善されます。

パイプライン・アーキテクチャに関するその他の変更により、次のパフォーマンスが大幅に改善されました。

この機能の詳細については、ホワイト・ペーパー「High Performance Graphics」を参照してください。

オフスクリーン・イメージのハードウェア高速化

この変更に関連するバグ追跡レポート: 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」を参照してください。

新しいJava印刷サービス

この変更に関連するバグ追跡レポート:
4285177および4360752

このAPIはJSR006で作成されたUnified Printing APIです。このAPIを使用することで、次のさまざまな印刷サービス機能をクライアント・アプリケーションから利用できます。

すべての機能はこのAPIを介して公開されるため、このAPIを優先的に利用できるのはサーバー・アプリケーションです。

印刷サービスにドキュメントをスプールする機能を、サーバー・アプリケーションから利用できます。以前は、印刷ジョブを生成するためにJavaアプリケーションから使用できたのは、グラフィックス呼び出しだけでした。

詳細については「Java印刷サービス」を参照してください。

floatおよびdoubleイメージ形式のサポート

この変更に関連するバグ追跡レポート: 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型データがサポートされました。これらのクラスには、新たにサポートされたデータ型に対応する、正規化されたコンポーネント値の範囲の定義が含まれています。

ComponentColorModelクラスがピクセル・データの範囲を固定することはありません。アプリケーションは、適切な範囲にスケーリングすることが想定されています。ColorSpaceクラスに、正規化された最小値および最大値をコンポーネントごとに決定するためのメソッドが追加されました。アルファ成分値は、正規化された0.0から1.0までの範囲内になければなりません。

次に、追加された全APIのリストを示します。

java.awt.image.ColorModelに、既存のメソッドに対応する3つのメソッドが新たに追加されました。

java.awt.image.ComponentColorModelに、新規データ型に基づくコンストラクタ、および既存のColorModelメソッドをオーバーライドするメソッドが新たに追加されました。 java.awt.image.SampleModelに、新規データ型の受け入れに使用する2つのメソッドが新たに追加されました。 java.awt.image.ComponentSampleModelに、新規データ型の受け入れに使用する2つのメソッドが新たに追加されました。 java.awt.image.BandedSampleModelでは、新規データ型に対応するため、3つのメソッドが編集されました。 java.awt.color.ColorSpaceに、正規化された最小値および最大値をコンポーネントごとに決定するための2つのメソッドが新たに追加されました。 java.awt.color.ICC_ColorSpaceに、2つの新規ColorSpaceメソッドをオーバーライドするメソッドが新たに追加されました。

public BIDIアルゴリズム

この変更に関連するバグ追跡レポート: 4285083

Unicode双方向アルゴリズムは、Unicode文字プロパティを使用してテキストを分析して、テキストの方向を判別します。このアルゴリズムは、ヘブライ語やアラビア語などの双方向テキストを正しい順序で適切に表示するために必要です。

現行の実装はすべてJavaプログラミング言語で記述されていますが、SDK 1.4ではネイティブのフォント・コードから効率的なアクセスが可能になるため、ヘブライ語やアラビア語のテキストをより効率的にレンダリングできるようになります。SDK 1.4では、Java Native Interfaceを使用してネイティブ・コードにアクセスできます。

新しいpublic BIDIクラスは、Unicode 3.0 BIDIアルゴリズムを実装し、テキストの双方向並べ替えに関する情報へのアクセスを提供します。このため、混在している双方向テキストが正しく表示されます。

サンプルのBidiSampleには、BIDIルーチンのいくつかが示されています。

TrueTypeヒント用フォント・ラスタライザのサポート

このリリースより前は、Java 2Dが使用するT2Kフォント・ラスタライザは、TrueTypeフォント用のフォント・ヒント機能をサポートしていませんでした。このため、TrueTypeフォントの表示は、常に一貫した美しいものではありませんでした。このリリースでは、TrueTypeフォント内に格納されたヒントを使用するようにT2Kラスタライザが変更されています。

T2Kラスタライザにこの機能を追加することにより、ネイティブ・ラスタライザへの依存度が大幅に低下しました。ネイティブ・ラスタライザへの依存度低下には、次のようなメリットがあります。

ヒント情報を含むLucidaフォント

この変更に関連するバグ追跡レポート: 4285089

SDK 1.4では、Java SE内のLucidaフォントがアップグレードされ、ヒント情報が含まれるようになりました。このため、Java SEで既存のフォントの代用として、または他のフォントが利用できない場合に使用されるフォントの品質が向上しました。Lucidaフォントにヒント情報を追加することにより、新しいクロスプラットフォーム・ラスタライザが、SDKのLucidaフォント内のヒントを使用することも可能になりました。このため、Lucidaフォントがより一貫して美しく表示されるようになります。

OpenTypeフォント表のサポート

この変更に関連するバグ追跡レポート: 4285161

SDK 1.4に、一般的なOpenTypeフォント・サポートを提供するアーキテクチャが新たに含まれるようになりました。この新たなアーキテクチャは、タイ語、インド語派、アラビア語、ヘブライ語などの筆記体活字に対応した、国際的な文字サポートを提供します。また、ローマ字言語の拡張入力サポートも提供します。

数値形状のサポート

この変更に関連するバグ追跡レポート: 4210199

現在のところ、アラビア語のテキストで囲まれた数値をJava 2Dでレンダリングすると、数値が大半の西欧諸国で一般に使用されているアラビア数字(ローマ数字)の形状になります。しかし、ヒンディ語ロケールでは、ヒンディ語の形状で表示されることが期待されます。

新規属性TextAttribute.NUMERIC_SHAPING、および新規クラスNumericShaperを使用すると、ASCII数字をほかのUnicode 10進数の範囲に変更できます。

たとえば、TextLayoutインスタンスで、数字をヨーロッパ言語からアラビア語に変換する場合、次の操作を実行します。

  1. ARABIC数字の形状を持つNumericShaperを作成します。
          Numeric Shaper nS 
             = NumericShaper.getContextualShaper(NumericShaper.ARABIC)
    
  2. キー値TextAttribute.NUMERIC_SHAPINGを使用して、NumericShaperMap属性に追加します。
          Map map = new HashMap();
          map.put(TextAttribute.NUMERIC_SHAPING, nS);
    
  3. Map属性を使用してTextLayoutを作成します。
          FontRenderContext frc = ...;
          TextLayout layout = new TextLayout(text, map, frc);
    
  4. テキストをレンダリングします。
          layout.draw(g2d, x, y);
    

NumericShaperクラスには、種類の異なるUnicode 10進数を表す定数が19個あります。このため、デーバナーガリー文字やタイ語文字を含む19個の異なる形状に数字を変換できます。

GlyphVectorでの複雑なレイアウトのサポート改善

このリリースより前には、クライアントは、グリフから文字へのマッピング情報にGlyphVectorからアクセスすることはできませんでした。この情報は、クライアントがGlyphVector内のグリフがどの文字に対応するかを確認するために使用できます。このリリースでは、GlyphVectorおよびGlyphVector内の各グリフの正確な境界を取得する新規メソッドも定義されています。

注: クライアントはGlyphVectorおよびグリフから文字へのマッピング情報を使用して選択およびヒット判定を実装できますが、大半のクライアントでは、TextLayoutおよびSwingのJTextAreaクラスやJTextFieldクラスを使用する方が便利かつ有用です。

SDK 1.4では、次のGlyphVectorメソッドが新たに追加されました。

次の新規GlyphMetricsメソッドは、変換済みのフォントに対して操作を行います。 Porter-Duffの完全なサポート

この変更に関連するバグ追跡レポート: 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オブジェクトの変換が恒等変換かどうかをチェックできます。

FontRenderContextの同一性の新規メソッド

この変更に関連するバグ追跡レポート: 4328579

FontRenderContextオブジェクトは、グラフィックス・コンテキストの状態をカプセル化し、GlyphVectorおよびTextLayoutにより使用されます。FontRenderContextに新たに追加された次の3つのメソッドを利用すると、GlyphVector内のFontRenderContextを、GlyphVectorの描画先グラフィックス・コンテキスト内のFontRenderContextと比較できます。

これらの同一性メソッドを利用すると、一致検査を実行するためにクライアントがAffineTransformを作成する必要がないため、パフォーマンス上の利点もあります。

*このWebサイトで使用されている用語「Java仮想マシン」または「JVM」は、Javaプラットフォーム用の仮想マシンを表します。


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.