目次 | 前へ | 次へ

第 1 章

Java 2DTM API の概要

Java 2D™ API では、Abstract Windowing Toolkit (AWT) のグラフィックス、テキスト、およびイメージングの機能が強化されて、充実したユーザーインタフェースと新しいタイプの Java™ アプリケーションを開発できるようになっています。

グラフィックス、フォント、およびイメージに関する豊富な API に加えて、Java 2D API では、拡張された色の定義と合成、任意の幾何学図形とテキストのヒット検出、およびプリンタと表示装置のための統一されたレンダリングモデルがサポートされています。

Java 2D API では、CAD-CAM ライブラリ、グラフィックス、イメージングの特殊効果ライブラリなどの高度なグラフィックスライブラリだけでなく、イメージファイルやグラフィックファイルの入出力フィルタも作成できます。

Java Media Framework およびほかの Java Media API とともに Java 2D API を使うと、アニメーションやほかのマルチメディア表現を作成したり表示したりできます。Java Animation および Java Media Framework の API は、Java 2D API を使ってレンダリングをサポートします。

1.1 グラフィックス、テキスト、およびイメージングの拡張

以前のバージョンの AWT では、通常の HTML ページのレンダリングに適した簡単なレンダリングパッケージが提供されましたが、複雑なグラフィックス、テキスト、またはイメージングのレンダリングには機能が不足していました。このため、以前の AWT では、汎用的なレンダリングのコンセプトのうち、特定の場合のみが簡単なレンダリングパッケージとして具体化されていました。Java 2D™ API では、AWT を拡張して、より柔軟で機能が充実したレンダリングパッケージが提供されるため、より汎用的なグラフィックスおよびレンダリング操作を行うことができるようになりました。

たとえば、Graphics クラスを使用すると、矩形、楕円、および多角形を描画できます。Graphics2D では、実質上あらゆる幾何学図形をレンダリングできるメカニズムが提供されているため、幾何学的レンダリングのコンセプトが拡張されています。同様に、Java 2D API では、任意の幅の形状付き線を描画し、実質上あらゆるテクスチャーで幾何学図形を塗りつぶすことができます。

幾何学的な形状は、Rectangle2D および Ellipse2D などの Shape インタフェースの実装から提供されます。たとえば、曲線および弧も Shape の特定の実装です。

塗りつぶしおよびペンスタイルは、BasicStrokeGradientPaintTexturePaintColor などの、Paint および Stroke インタフェースの実装から提供されます。

AffineTransform には、スケーリング、平行移動、回転、変形など、2D 座標の線形変換を定義します。

クリッピング領域は、Rectangle2DGeneralPath などの汎用クリッピング領域の定義に使用される Shape インタフェースの実装によって定義されます。

色の合成は、AlphaComposite などの Composite インタフェースの実装によって提供されます。

Font は、各 Shapes によって定義される Glyphs のコレクションによって定義されます。

1.2 レンダリングモデル

基本的なグラフィックスレンダリングモデルについては、Java 2D™ API の追加に伴う変更はありません。グラフィックをレンダリングするには、グラフィックスコンテキストを設定し、Graphics オブジェクトのレンダリングメソッドを呼び出します。

Java 2D API の Graphics2D クラスは、Graphics を継承することで、多くのグラフィックス属性をサポートし、新しいレンダリングメソッドを提供します。Graphics2D コンテキストの設定については「Graphics2D を使ったレンダリング」を参照してください。

Java 2D API は、レンダリング装置の違いを自動的に補正し、異なるタイプの装置の間で統一されたレンダリングモデルを提供します。レンダリング先の装置がディスプレイでもプリンタでも、アプリケーションレベルでのレンダリングプロセスは同じです。

JavaTM 2 SDK バージョン 1.3 のリリースにより、Java 2D API はマルチスクリーン環境をサポートします。詳細については、セクション 1.2.1 の「座標系」と「マルチスクリーン環境でのレンダリング」を参照してください。

1.2.1 座標系

Java 2D API では、2 種類の座標系が使われています。

Java 2D システムは、ユーザー空間と使用するレンダリング装置のデバイス空間との間で必要な変換を、自動的に行います。モニターの座標系はプリンタの座標系と大きく異なりますが、アプリケーションからこの違いが見えることはありません。

1.2.1.1 ユーザー空間

図 1-1 に示すように、ユーザー空間の原点は領域の左上隅にあり、x 座標の値は左から右に、y 座標は上から下に、それぞれ大きくなります。

前の文で、グラフィックスを説明しています。

図 1-1 ユーザー空間の座標系

ユーザー空間は、使用可能なすべての装置の座標系を統一する抽象表現です。特定の装置のデバイス空間の原点と向きは、ユーザー空間と同じ場合も異なる場合もあります。どちらの場合も、グラフィックオブジェクトがレンダリングされるときに、ユーザー空間の座標は適切なデバイス空間に自動的に変換されます。多くの場合、この変換は、基になっているプラットフォームのデバイスドライバを使って行われます。

1.2.1.2 デバイス空間

Java 2D API では、ユーザー空間からデバイス空間への変換をサポートするために維持される、3 つのレベルの構成情報が定義されています。この情報は、3 つのクラスにカプセル化されています。

GraphicsEnvironmentGraphicsDeviceGraphicsConfiguration の 3 つのクラスを使って、Java プラットフォーム上でのレンダリング装置とフォントの特定と、ユーザー空間からデバイス空間への座標変換に必要な情報がすべて表されます。アプリケーションはこの情報にアクセスできますが、ユーザー空間とデバイス空間の間の変換を行う必要はありません。

GraphicsEnvironment では、特定のプラットフォームの Java アプリケーションが認識できるレンダリング装置の集合が記述されています。レンダリング装置としては、画面、プリンタ、イメージバッファーなどがあります。GraphicsEnvironment には、プラットフォームで利用可能なフォントの一覧も含まれています。

GraphicsDevice では、画面やプリンタなど、アプリケーションが認識できるレンダリング装置が記述されています。装置で使用可能な構成は、それぞれ GraphicsConfiguration で表されます。たとえば、SVGA ディスプレイ装置は、640x480x16 色、640x480x256 色、800x600x256 色など、さまざまなモードで動作できます。SVGA ディスプレイは GraphicsDevice オブジェクトで表されて、個々のモードは GraphicsConfiguration オブジェクトで表されます。

1 つの GraphicsEnvironment には 1 つ以上の GraphicsDevices を含めることができ、個々の GraphicsDevice には 1 つ以上の GraphicsConfigurations を含めることができます。

1.2.2 変換

Java 2D API では、統一された座標変換モデルが使われています。ユーザー空間からデバイス空間への変換を含むすべての座標変換は、AffineTransform オブジェクトで表されます。AffineTransform では、座標操作の規則が行列で定義されています。

グラフィックスコンテキストに AffineTransform を追加すれば、幾何学図形、テキスト、またはイメージをレンダリングするときに、回転、拡大縮小、平行移動、変形などを実行できます。追加した変換は、そのコンテキストでレンダリングされるすべてのグラフィックオブジェクトに適用されます。変換は、ユーザー空間の座標がデバイス空間の座標に変換されるときに行われます。

1.2.3 フォント

文字列は、一般に、文字列を構成する文字という観点から考えられます。文字列を描画するとき、その体裁は、選択されているフォントで決まります。ただし、文字列を表示するためにフォントで使われている形状は、個々の文字と一致しない場合もあります。たとえば、出版業界などでは、2 つ以上の文字の特定の組み合わせを、合字と呼ばれる単一の形状に置き換えることがよく行われます。

文字列の中の文字を表すためにフォントで使われる形状を、グリフと呼びます。フォントでは、鋭アクセントが付いた小文字の a のような文字を複数のグリフで表したり、final の fi のような特定の文字の組み合わせを最終的に 1 つのグリフで表したりすることがあります。Java 2D API の場合、グリフは単なる Shape で、ほかの Shape と同じように操作したりレンダリングしたりできます。

フォントはグリフの集合と考えることができます。1 つのフォントには、heavy、medium、oblique、gothic、regular など多くの派生形がある場合があります。このような異なる派生形を、フェースと呼びます。同じフォントから作られるフェースはすべて似た文字体裁のデザインになっており、同じファミリのメンバーと考えることができます。つまり、特定のスタイルを持つグリフの集合がフォントフェースを形成し、フォントフェースの集合がフォントファミリを形成し、フォントファミリの集合が特定の GraphicsEnvironment で利用できるフォントのセットを形成しています。

Java 2D API では、Helvetica Bold のように特定のフォントフェースを示す名前を使ってフォントを指定します。これは JDK 1.1 と異なる点です。JDK 1.1 では、フォントは論理名で記述されており、特定のプラットフォームで利用可能なフォントフェースの種類によっては、同じ論理名が異なるフォントフェースにマッピングされます。旧バージョンとの互換性を保つため、Java 2D API では、フォントフェース名だけでなく論理名によるフォントの指定もサポートされています。

Java 2D API を使うと、ファミリ、フェース、サイズ、さらには言語まで異なる複数のフォントを含む文字列を、構成したりレンダリングしたりできます。テキストの体裁は、テキストのレイアウトとは論理的に切り離されて保持されます。フォントの体裁は Font オブジェクトを使って記述されて、レイアウトの情報は TextLayout オブジェクトと TextAttributeSet オブジェクトに格納されます。フォントの情報とレイアウトの情報を別に持つことで、同じフォントを別のレイアウト構成で簡単に使えるようになります。

1.2.4 イメージ

イメージは、空間に組織的に配置されたピクセルの集合です。ピクセルは、1 つの表示位置におけるイメージの体裁を定義しています。ピクセルの 2 次元配列をラスタと呼びます。

ピクセルの表現方法は、直接定義することも、イメージのカラーテーブルに対するインデックスとして定義することもできます。

多くの (256 色より多い) 色を使うイメージの場合は、通常、スクリーンの個々の位置に対する色、アルファ、およびそのほかの表示特性を、ピクセルで直接表します。このようなイメージは、インデックスで色を指定したイメージよりかなり大きくなりますが、より実物に近い表現になります。

インデックスカラーイメージの場合、イメージの色は、カラーテーブルで指定されている色だけに制限されます。その結果、イメージで使用できる色数が少なくなることがよくあります。ただし、一般に、色の値よりインデックスの方が必要な記憶領域が少なくて済むので、インデックス指定の色のセットとして格納されたイメージの方が小さくなります。このピクセル形式は、16 色または 256 色だけで表現されたイメージによく使われています。

Java 2D API のイメージには、2 つの重要な要素があります。

ピクセルを解釈するときの規則は、ColorModel オブジェクトでカプセル化されています。たとえば、値を色として直接解釈するのか、それともインデックスで表された色として解釈するのか、などの情報です。ピクセルを表示するときは、ピクセルとカラーモデルをあわせて扱う必要があります。

バンドは、イメージに対する色空間の 1 つの成分です。たとえば、赤、緑、青の各成分は、RGB イメージのバンドです。直接カラーモデルのイメージで使われるピクセルは、スクリーン上の 1 地点に対するバンド値の集合として考えることができます。

java.awt.image パッケージには、ColorModel の複数の実装が含まれています。これには、パックドピクセルと成分ピクセルの表現も含まれます。

ColorSpace オブジェクトは、測定した数値の集合と特定の色の間の対応方法を管理する規則をカプセル化しています。java.awt.color での ColorSpace の実装は、RGB やグレースケールを含む大部分の一般的な色空間を表しています。色空間は色の集合ではないことに注意してください。色空間は、個々の色の値を解釈する方法についての規則を定義するものです。

色空間とカラーモデルを切り離すことで、色の表現方法と、異なる表現の間での色の変換方法が、より柔軟になります。

1.2.5 塗りつぶしとストローク

Java 2D API では、さまざまなペンスタイルと塗りつぶしパターンを使って Shapes をレンダリングできます。テキストは最終的にグリフの集合で表されるので、文字列にもストロークによる描画や塗りつぶしを適用できます。

ペンスタイルは、Stroke インタフェースを実装するオブジェクトで定義されます。Stroke を使うと、直線や曲線に、さまざまな幅や破線パターンを指定できます。

塗りつぶしのパターンは、Paint インタフェースを実装するオブジェクトで定義されます。旧バージョンの AWT で利用できた Color クラスは、単純な型の Paint オブジェクトであり、1 色の塗りつぶしを定義するために使います。Java 2D API では、Paint インタフェースの新しい実装として、TexturePaintGradientPaint の 2 つが提供されています。TexturePaint は、規則的に繰り返される単純なイメージ片を使った塗りつぶしパターンを定義します。GradientPaint は、2 種類の色の間のグラデーションとして塗りつぶしパターンを定義します。

Java 2D では、図形の輪郭線のレンダリングと、パターンを使った図形の塗りつぶしは、2 種類の異なる操作です。

文字列のレンダリングでは、そのときの Paint 属性が、文字列を形成するグリフに適用されます。ただし、レンダリングされるグリフを実際に塗りつぶすのは drawString です。テキスト文字列のグリフの輪郭線をレンダリングするには、輪郭線を取得し、draw メソッドを使って輪郭線を図形としてレンダリングする必要があります。

1.2.6 重ね合わせ

既存のオブジェクトと重なるオブジェクトをレンダリングするときは、レンダリングしようとする領域の現在の色と新しいオブジェクトの色を混合する方法を決める必要があります。Java 2D API では、色を混合する際の規則は、Composite オブジェクトにカプセル化されています。

簡単なレンダリングシステムでは、基本的なブール演算だけで色の混合が行われます。たとえば、ブール演算による合成規則では、ソース色の値とデスティネーション色の値の論理積 (AND)、論理和 (OR)、または排他的論理和 (XOR) を求めることが可能です。このような方法には、いくつか問題があります。

Java 2D API では、色を合成するときにカラーモデルの情報を考慮するアルファブレンディング 1 規則を実装することで、これらの欠点を回避しています。AlphaComposite オブジェクトには、ソース色とデスティネーション色の両方のカラーモデルが含まれています。

1.3 下位互換性とプラットフォームからの独立性

Java 2D™ API では、JDK 1.1 に対する下位互換性が維持されています。また、アプリケーションのプラットフォームからの独立性が保たれるように設計されています。

1.3.1 下位互換性

下位互換性を保証するため、グラフィックスとイメージングに関する JDK の既存のクラスとインタフェースの機能は残されています。既存の機能は削除されておらず、既存のクラスについてのパッケージの指定は変更されていません。Java 2D API は、既存のクラスでの新しいメソッドの実装、既存のクラスの継承、従来の API に影響を与えない新しいクラスとインタフェースの追加などで AWT の機能を拡張しています。

たとえば、Java 2D API の機能の多くは、拡張されたグラフィックスコンテキストである Graphics2D を通して実現されています。下位互換性を保ったままこの拡張グラフィックスコンテキストを提供するため、Graphics2D は JDK 1.1 の Graphics クラスを継承しています。

グラフィックスコンテキストの使用モデルも、変更されていません。AWT は、次のメソッドを使って、AWT の Component にグラフィックスコンテキストを渡します。

  • paint
  • paintAll
  • update
  • print
  • printAll
  • getGraphics

JDK 1.1 のアプレットは、渡されたグラフィックスコンテキストを Graphics のインスタンスとして解釈します。Java 2D API と互換性のあるアプレットが、Graphics2D で実装されている新しい機能にアクセスするには、グラフィックスコンテキストを Graphics2D オブジェクトにキャストします。

public void Paint (Graphics g) { 
 
        Graphics2D g2 = (Graphics2D) g; 
        ... 
        ... 
        g2.setTransform (t); 
} 

従来のクラスを継承するのではなく、Java 2D API が従来のクラスを一般化している場合もあります。従来のクラスの一般化には、次の 2 種類の方法が使われています。

  • 1 つ以上の親クラスを階層に挿入し、新しい親クラスを継承するように従来のクラスを変更する。この方法は、汎用的に実装されたメソッドとインスタンスデータを従来のクラスに追加する場合に使われる。
  • 1 つ以上のインタフェースの実装を、従来のクラスに追加する。この方法は、汎用的な抽象メソッドを従来のクラスに追加する場合に使われる。

たとえば、Java 2D API による AWT の Rectangle クラスの一般化には、両方の方法が使われています。Rectangle クラスの階層は次のように変更されています。

 
java.lang.object 
| 
+-------java.awt.geom.RectangularShape 
             | 
             +---------java.awt.geom.Rectangle2D 
                               | 
                               +-------java.awt.Rectangle 

JDK 1.1 では、RectangleObject を単純に継承していました。現在の Rectangle は新しい Rectangle2D クラスを継承し、ShapeSerializable の両方を実装しています。Rectangle の階層には、2 つの親クラス RectangularShape および Rectangle2D が追加されました。JDK 1.1 用に作成されたアプレットは、新しい親クラスとインタフェースの実装に対応していませんが、旧バージョンにあったメソッドとメンバーはまだ Rectangle に含まれているので、アプレットが影響を受けることはありません。

Java 2D API では、従来の API と「直交する」新しいクラスとインタフェースがいくつか追加されています。追加されたクラスとインタフェースは、既存のクラスを継承または一般化するものではなく、まったく新しい別のものです。これらの新しいクラスとインタフェースは、従来の API では明示的に示されていない概念を具体化しています。

たとえば、Java 2D API では、Arc2DCubicCurve2DQuadCurve2D など、新しい Shape クラスがいくつか実装されています。旧バージョンの AWT でも drawArc メソッドと fillArc メソッドを使って円弧をレンダリングできましたが、円弧の汎用的な抽象表現はなく、円弧を具体化する独立したクラスもありませんでした。このような独立したクラスを Java 2D API に追加できます。ただし、Graphics クラスを通して drawArcfillArc はまだサポートされているので、従来のアプレットには影響ありません。

1.3.2 プラットフォームからの独立性

プラットフォームに依存しないアプリケーションを開発できるよう、レンダリング先の装置の解像度、色空間、およびカラーモデルについて、Java 2D API ではどのような前提もありません。また、Java 2D API ではイメージファイルについても特定の形式は想定されていません。

本当の意味でプラットフォームに依存しないフォントは、組み込みのフォント (JDK の一部として提供されている) の場合、あるいは数学的またはプログラム的にフォントが生成される場合にだけ可能です。現在、Java 2D API では、組み込みフォントまたは数学的に生成されたフォントはサポートされていませんが、グリフのセットを使って、フォント全体をプログラムで定義することは可能です。この場合、それぞれのグリフは、線分と曲線で構成される Shape で定義されます。固有のスタイルとサイズを持つ多数のフォントを、単一のグリフセットから派生できます。

1.4 Java 2D™ API のパッケージ

Java 2D API のクラスは、次のパッケージで編成されています。

  • java.awt
  • java.awt.geom
  • java.awt.font
  • java.awt.color
  • java.awt.image
  • java.awt.image.renderable
  • java.awt.print

パッケージ java.awt には、Java 2D API のクラスとインタフェースのなかでも一般的な性質のもの、および従来のクラスを拡張するものが含まれています。したがって、java.awt には、Java 2D 以外のクラスも含まれています。

パッケージ java.awt.geom には、幾何学的プリミティブの定義に関するクラスとインタフェースが含まれています。

幾何学的プリミティブの多くには、対応する .Float.Double の実装があります。これは、単精度と倍精度の浮動小数点表現の実装を可能にするために行われました。倍精度の実装を使うとレンダリングの精度は高くなりますが、プラットフォームによってはパフォーマンスが低下します。

パッケージ java.awt.font には、テキストのレイアウトとフォントの定義に使うクラスとインタフェースが含まれています。

パッケージ java.awt.color には、色空間とカラープロファイルの定義のためのクラスとインタフェースが含まれています。

パッケージ java.awt.image>java.awt.image.renderable には、イメージの定義とレンダリングに関するクラスとインタフェースが含まれています。

パッケージ java.awt.print には、Java 2D ベースのすべてのテキスト、グラフィック、およびイメージを印刷可能にするためのクラスとインタフェースが含まれています。

1アルファブレンディングについての詳細は、『Computer Graphics: Principles and Practice』第 2 版 (J.D. Foley, A. van Dam, S.K. Feiner, J.F. Hughes. Addison- Wesley, 1990) のセクション 17.6 を参照してください。

 


目次 | 前へ | 次へ

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