目次 | 前の項目 | 次の項目 JavaTM 2D API プログラマーズガイド

第 1 章

Java 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 を使ってレンダリングをサポートします。

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 は、各 Shape によって定義される Glyph によって定義されます。

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 ディスプレイ装置は、640×480×16 色、640×480×256 色、800×600×256 色など、さまざまなモードで動作できます。SVGA ディスプレイは GraphicsDevice オブジェクトで表されて、個々のモードは GraphicsConfiguration オブジェクトで表されます。

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

1.2.2 変換

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

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

1.2.3 フォント

文字列は、一般に、文字列を構成する文字という観点から考えられます。文字列を描画するとき、その体裁は、選択されているフォントで決まります。ただし、文字列を表示するためにフォントで使われている形状は、個々の文字と一致しない場合もあります。たとえば、出版業界などでは、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.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 では、さまざまなペンスタイルと塗りつぶしパターンを使って Shape をレンダリングできます。テキストは最終的にグリフの集合で表されるので、文字列にもペンスタイルや塗りつぶしを適用できます。

ペンのスタイルは、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 の既存のクラスとインタフェースの機能は残されています。既存の機能は削除されておらず、既存のクラスについてのパッケージの定義は変更されていません。AWT の機能の拡張は、既存のクラスでの新しいメソッドの実装、既存のクラスの拡張、従来の API に影響を与えない新しいクラスとインタフェースの追加などで行われています。

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

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

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 種類の方法が使われています。

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

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

JDK 1.1 では、RectangleObject を直接継承していました。JDK 1.2 では、Rectangle は 新しい Rectangle2D クラスを継承し、ShapeSerializable の両方を実装しています。Rectangle の階層には、2 つの親クラス RectangularShapeRectangle2D が追加されました。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 ではどのような前提もありません。また、イメージファイルについても特定の形式は想定されていません。

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

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

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

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

AlphaComposite
BasicStroke
Color
Composite
CompositeContext
Font
GradientPaint
Graphics2D
GraphicsConfiguration
GraphicsDevice
GraphicsEnvironment
Paint
PaintContext
Rectangle
Shape
Stroke
TexturePaint
Transparency

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

AffineTransform
Arc2D
Arc2D.Double
Arc2D.Float
Area
CubicCurve2D
CubicCurve2D.Double
CubicCurve2D.Float
Dimension2D
Ellipse2D
Ellipse2D.Double
Ellipse2D.Float
FlatteningPathIterator
GeneralPath
Line2D
Line2D.Double
Line2D.Float
PathIterator
Point2D
Point2D.Double
Point2D.Float
QuadCurve2D
QuadCurve2D.Double
QuadCurve2D.Float
Rectangle2D
Rectangle2D.Double
Rectangle2D.Float
RectangularShape
RoundRectangle2D
RoundRectangle2D.Double
RoundRectangle2D.Float
 
 

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

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

FontRenderContext
GlyphJustificationInfo
GlyphMetrics
GlyphVector
GraphicAttribute
ImageGraphicAttribute
LineBreakMeasurer
LineMetrics
MultipleMaster
OpenType
ShapeGrapicAttribute
TextAttribute
TextHitInfo
TextLayout
TransformAttribute

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

ColorSpace
ICC_ColorSpace
ICC_Profile
ICC_ProfileGray
ICC_ProfileRGB
 

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

AffineTransformOp
BandCombineOp
BandedSampleModel
BufferedImage
BufferedImageFilter
BufferedImageOp
ByteLookupTable
ColorConvertOp
ColorModel
ComponentColorModel
ComponentSampleModel
ConvolveOp
ContextualRenderedImageFactory
DataBuffer
DataBufferByte
DataBufferInt
DataBufferShort
DataBufferUShort
DirectColorModel
IndexColorModel
Kernel
LookupOp
LookupTable
MultiPixelPackedSampleModel
PackedColorModel
ParameterBlock
PixelInterleavedSampleModel
Raster
RasterOp
RenderableImage
RenderableImageOp
RenderableImageProducer
RenderContext
RenderedImageFactory
RenderedImage
RescaleOp
SampleModel
ShortLookupTable
SinglePixelPackedSampleModel
TileObserver
WritableRaster
WritableRenderedImage
 

パッケージ java.awt.image は、旧バージョンの AWT にもありました。Java 2D API では、次の従来の AWT イメージクラスが拡張されています。

これらのカラーモデルクラスは、旧バージョンとの互換性を保つため java.awt.image パッケージに残されています。一貫性を保つため、新しいカラーモデルのクラスも、java.awt.image パッケージに置かれています。

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

Book
Pageable
PageFormat
Paper
Printable
PrinterGraphics
PrinterJob
 
 

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

 


目次 | 前の項目 | 次の項目 JavaTM 2D API プログラマーズガイド
JavaTM 2 SDK, Standard Edition, 1.4 Version