目次 | 前の項目 | 次の項目 | JavaTM 2D 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 を使ってレンダリングをサポートします。
以前のバージョンの AWT では、通常の HTML ページのレンダリングに適した簡単なレンダリングパッケージが提供されましたが、複雑なグラフィックス、テキスト、またはイメージングのレンダリングには機能が不足していました。このため、以前の AWT では、汎用的なレンダリングのうち、特定の概念だけがサポートされていました。Java 2D™ API の AWT では、より柔軟で機能が充実したレンダリングパッケージが提供されるため、より汎用的なグラフィックスおよびレンダリング操作を行うことができるようになりました。
たとえば、Graphics
クラスを使用して、矩形、楕円、および多角形を描画することができます。Graphics2D
では、あらゆる幾何学図形を実質上レンダリングできる機構が提供されているため、ジオメトリックレンダリングの概念が拡張されています。同様に、Java 2D API では、任意の幅の形状付き線を描画し、実質上あらゆるテクスチャでジオメトリック図形を塗りつぶすことができます。
幾何学的な形状は、Rectangle2D
および Ellipse2D
などの Shape
インタフェースの実装から提供されます。たとえば、曲線および弧も Shape
の実装です。
塗りつぶしおよびペンスタイルは、BasicStroke
、GradientPaint
、TexturePaint
、Color
などの、Paint
および Stroke
インタフェースから提供されます。
AffineTransform
には、スケーリング、平行移動、回転、変形など、2D 座標の線形変換を定義します。
クリッピング領域は、Rectangle2D
、GeneralPath
などの汎用クリッピング領域の定義に使用される Shape
インタフェースと同じ実装によって定義されます。
色の合成は、AlphaComposite
などの Composite
インタフェースの実装から提供されます。
Font
は、各 Shape
によって定義される Glyph
によって定義されます。
基本的なグラフィックスレンダリングモデルについては、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 座標系 および 「マルチスクリーン環境でのレンダリング」を参照してください。
Java 2D API では、2 種類の座標系が使われています。
Java 2D システムは、ユーザ空間と使用するレンダリング装置のデバイス空間との間で必要な変換を、自動的に行います。モニタの座標系はプリンタの座標系と大きく異なりますが、アプリケーションからこの違いが見えることはありません。
図 1-1 に示すように、ユーザ空間の原点は領域の左上隅にあり、x 座標の値は左から右に、y 座標は上から下に、それぞれ大きくなります。
ユーザ空間は、使用可能なすべての装置の座標系を統一する抽象表現です。個々の装置のデバイス空間の原点と向きは、ユーザ空間と同じ場合も異なる場合もあります。どちらの場合も、グラフィックオブジェクトがレンダリングされるときに、ユーザ空間の座標は適切なデバイス空間に自動的に変換されます。多くの場合、この変換は、基になっているプラットフォームのデバイスドライバを使って行われます。
Java 2D API では、ユーザ空間からデバイス空間への変換をサポートするために、3 つのレベルの構成情報が定義されています。この情報は、3 つのクラスにカプセル化されています
GraphicsEnvironment
GraphicsDevice
GraphicsConfiguration
GraphicsEnvironment
と GraphicsDevice
と GraphicsConfiguration
の 3 つのクラスを使って、Java プラットフォーム上でのレンダリング装置とフォントの特定と、ユーザ空間からデバイス空間への座標変換に必要な情報がすべて表されます。アプリケーションはこの情報にアクセスできますが、ユーザ空間とデバイス空間の間の変換を行う必要はありません。
GraphicsEnvironment
では、特定のプラットフォームの Java アプリケーションが認識できるレンダリング装置の集合が記述されています。レンダリング装置としては、画面、プリンタ、イメージバッファなどがあります。GraphicsEnvironment
には、プラットフォームで利用可能なフォントの一覧も含まれています。
GraphicsDevice
では、画面やプリンタなど、アプリケーションが認識できるレンダリング装置が記述されています。装置で使用可能な構成は、それぞれ GraphicsConfiguration
で表されます。たとえば、SVGA ディスプレイ装置は、640×480×16 色、640×480×256 色、800×600×256 色など、さまざまなモードで動作できます。SVGA ディスプレイは GraphicsDevice
オブジェクトで表されて、個々のモードは GraphicsConfiguration
オブジェクトで表されます。
1 つの GraphicsEnvironment
には 1 つ以上の GraphicsDevice
を含めることができ、個々の GraphicsDevice
には 1 つ以上の GraphicsConfigurations
を含めることができます。
Java 2D API では、統一された座標変換モデルが使われています。ユーザ空間からデバイス空間への変換を含むすべての座標変換は、AffineTransform
オブジェクトで表されます。AffineTransform
では、変換操作の規則が行列で定義されています。
グラフィックスコンテキストに AffineTransform
を追加すれば、図形、テキスト、またはイメージをレンダリングするときに、回転、拡大縮小、平行移動、変形などを実行できます。追加した変換は、そのコンテキストでレンダリングされるすべてのグラフィックオブジェクトに適用されます。変換は、ユーザ空間の座標がデバイス空間の座標に変換されるときに行われます。
文字列は、一般に、文字列を構成する文字という観点から考えられます。文字列を描画するとき、その体裁は、選択されているフォントで決まります。ただし、文字列を表示するためにフォントで使われている形状は、個々の文字と一致しない場合もあります。たとえば、出版業界などでは、2 つ以上の文字の特定の組み合わせを、「合字」と呼ばれる単一の形状に置き換えることがよく行われます。
文字列の中の文字を表すためにフォントで使われる形状を、「グリフ」と呼びます。フォントでは、a のような斜体文字を複数のグリフで表したり、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 次元配列を「ラスタ」と呼びます。
ピクセルの表現方法は、直接定義することも、イメージのカラーテーブルに対するインデックスとして定義することもできます。
多くの (256 色より多い) 色を使うイメージの場合は、通常、スクリーンの個々の位置に対する色、アルファ、およびそのほかの表示特性を、ピクセルで直接表します。このようなイメージは、インデックスで色を指定したイメージよりかなり大きくなりますが、より実物に近い表現になります。
インデックスカラーイメージの場合、イメージの色は、カラーテーブルで指定されている色だけに制限されます。 その結果、イメージで使用できる色数が少なくなることがよくあります。ただし、一般に、色の値よりインデックスの方が必要な記憶領域が少なくて済むので、インデックス指定の色の集まりとして格納されたイメージの方が小さくなります。このピクセル形式は、16 色または 256 色だけで表現されたイメージによく使われています。
Java 2D API のイメージには、2 つの重要な要素があります。
ピクセルを解釈するときの規則は、ColorModel
オブジェクトでカプセル化されています。 たとえば、値を色として直接解釈するのか、それともインデックスで表された色として解釈するのか、などの情報です。ピクセルを表示するときは、ピクセルとカラーモデルをあわせて扱う必要があります。
バンドは、イメージに対するカラー領域の 1 つの成分です。たとえば、赤、緑、青の各成分は、RGB イメージのバンドです。直接カラーモデルのイメージで使われるピクセルは、スクリーン上の 1 地点に対するバンド値の集合として考えることができます。
java.awt.image
パッケージには、ColorModel
の複数の実装が含まれています。 これには、パックドピクセルと成分ピクセルの表現も含まれます。
ColorSpace
オブジェクトは、測定した数値の集合と特定の色の間の対応方法を管理する規則をカプセル化しています。java.awt.color
での ColorSpace
の実装は、RGB や グレースケールを含む大部分の一般的なカラー領域を表しています。色空間は色の集合ではないことに注意してください。色空間は、具体的な色の値を解釈する方法についての規則を定義するものです。
色空間とカラーモデルを切り離すことで、色の表現方法と、異なる表現の間での色の変換方法が、より柔軟になります。
Java 2D API では、さまざまなペンスタイルと塗りつぶしパターンを使って Shape
をレンダリングできます。テキストは最終的にグリフの集合で表されるので、文字列にもペンスタイルや塗りつぶしを適用できます。
ペンのスタイルは、Stroke
インタフェースを実装するオブジェクトで定義されます。Stroke を使うと、直線や曲線に、さまざまな幅や破線パターンを指定できます。
塗りつぶしのパターンは、Paint
インタフェースを実装するオブジェクトで定義されます。旧バージョンの AWT で利用できた Color
クラスは、単純な型の Paint
オブジェクトで、1 色の塗りつぶしを定義するために使います。Java 2D API では、Paint
インタフェースの新しい実装として、TexturePaint
と GradientPaint
の 2 つが提供されています。TexturePaint
は、規則的に繰り返される単純なイメージ片を使った塗りつぶしパターンを定義しています。GradientPaint
は、2 種類の色の間のグラデーションとして塗りつぶしパターンを定義します。
Java 2D では、図形の輪郭線のレンダリングと、パターンを使った図形の塗りつぶしは、2 種類の異なる操作です。
Stroke
属性で指定したペンのスタイルと Paint
属性で指定した塗りつぶしパターンで図形の輪郭をレンダリングするには、draw
系メソッドのどれかを使うPaint
属性で指定したパターンで図形の内部を塗りつぶすには、fill
メソッドを使う
文字列のレンダリングでは、そのときの Paint
属性が、文字列を形成するグリフに適用されます。ただし、レンダリングされるグリフを実際に塗りつぶすのは drawString
です。テキスト文字列のグリフの輪郭線を描画するには、輪郭線を取得し、draw
メソッドを使って輪郭線を図形としてレンダリングする必要があります。
既存のオブジェクトと重なるオブジェクトをレンダリングするときは、描画しようとする領域の現在の色と新しいオブジェクトの色を混合する方法を決める必要があります。Java 2D API では、色を混合する際の規則は、Composite
オブジェクトにカプセル化されています。
簡単なレンダリングシステムでは、基本的なブール演算だけで色の混合が行われます。たとえば、ブール演算による合成規則では、ソース色の値とデスティネーション色の値の論理積 (AND)、論理和 (OR)、または排他的論理和 (XOR) を求めることが可能です。このような方法には、いくつか問題があります。
Java 2D API では、色を合成するときにカラーモデルの情報を考慮するアルファブレンディング1規則を実装することで、これらの欠点を回避しています。AlphaComposite
オブジェクトには、ソース色とデスティネーション色のカラーモデルが含まれています。
Java 2D™ API では、JDK 1.1 に対する下位互換性が維持されています。また、プラットフォームからの独立性が保たれるように設計されています。
下位互換性を保証するため、グラフィックスとイメージングに関する JDK の既存のクラスとインタフェースの機能は残されています。既存の機能は削除されておらず、既存のクラスについてのパッケージの定義は変更されていません。AWT の機能の拡張は、既存のクラスでの新しいメソッドの実装、既存のクラスの拡張、従来の API に影響を与えない新しいクラスとインタフェースの追加などで行われています。
たとえば、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
オブジェクトにキャストします。
従来のクラスを継承するのではなく、Java 2D API が従来のクラスを一般化している場合もあります。従来のクラスの一般化には、次の 2 種類の方法が使われています。
たとえば、AWT の Rectangle
クラスの一般化には、両方の方法が使われています。Rectangle クラスの階層は次のように変更されています。
java.lang.object | +-------java.awt.geom.RectangularShape | +---------java.awt.geom.Rectangle2D | +-------java.awt.Rectangle
JDK 1.1 では、Rectangle
は Object
を直接継承していました。JDK 1.2 では、Rectangle
は 新しい Rectangle2D
クラスを継承し、Shape
と Serializable の両方を実装しています。Rectangle
の階層には、2 つの親クラス RectangularShape と Rectangle2D が追加されました。JDK 1.1 用に作成されたアプレットは、新しい親クラスとインタフェースの実装に対応していませんが、旧バージョンにあったメソッドとメンバはまだ Rectangle
に含まれているので、アプレットが影響を受けることはありません。
Java 2D API では、従来の API と「直交する」新しいクラスとインタフェースがいくつか追加されています。追加されたクラスとインタフェースは、既存のクラスを継承または一般化するものではなく、まったく新しい別のものです。これらの新しいクラスとインタフェースは、従来の API では明示的に示されていない概念を具体化しています。
たとえば、Java 2D API では、Arc2D
、CubicCurve2D
、QuadCurve2D
など、新しい Shape
クラスがいくつか実装されています。旧バージョンの AWT でも drawArc
メソッドと fillArc
メソッドを使って円弧をレンダリングできましたが、円弧の汎用的な抽象表現はなく、円弧を具体化する独立したクラスもありませんでした。このような独立したクラスが、Java 2D API では追加されています。 ただし、Graphics
クラスを通して drawArc
と fillArc
はまだサポートされているので、従来のアプレットには影響ありません。
プラットフォームに依存しないアプリケーションを開発できるよう、レンダリング先の装置の解像度、色空間、およびカラーモデルについて、Java 2D API ではどのような前提もありません。また、イメージファイルについても特定の形式は想定されていません。
本当の意味でプラットフォームに依存しないフォントは、組み込みのフォント (JDK の一部として提供されている) の場合、あるいは数学的またはプログラム的にフォントが生成される場合にだけ可能です。現在、Java 2D API では、組み込みフォントまたは数学的なフォントの生成はサポートされていませんが、グリフのセットを使って、フォント全体をプログラムで定義することは可能です。この場合、それぞれのグリフは、線分と曲線で構成される Shape
で定義されます。固有のスタイルとサイズを持つさまざまなフォントを、単一のグリフセットから生成できます。
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.image
は、旧バージョンの AWT にもありました。Java 2D API では、次の従来の AWT イメージクラスが拡張されています。
ColorModel
DirectColorModel
IndexColorModel
これらのカラーモデルクラスは、旧バージョンとの互換性を保つため java.awt.image
パッケージに残されています。一貫性を保つため、新しいカラーモデルのクラスも、java.awt.image
パッケージに置かれています。
パッケージ java.awt.print
には、Java 2D ベースのすべてのテキスト、グラフィック、およびイメージを印刷できるようにするためのクラスとインタフェースが含まれています。
目次 | 前の項目 | 次の項目 |
JavaTM 2D API プログラマーズガイド JavaTM 2 SDK, Standard Edition, 1.4 Version |
Copyright © 2003 Sun Microsystems, Inc. All rights reserved.