Java™ SE 6.0 での Java 2D の拡張 |
ガイドの索引 |
テキストのレンダリング
- フォントの拡張
java.awt.Font
クラスの次の定数が、論理フォントの正規ファミリ名を表すために導入されました。現在のヒントに従って
DIALOG
DIALOG_INPUT
SANS_SERIF
SERIF
MONOSPACED
FontRenderContext
オブジェクトを作成し、アプリケーション経由でテキストを測定するには、FontMetrics
クラスに追加されたgetFontRenderContext()
メソッドを使用します。
Java SE 6 ではGraphicsEnvironment
クラスの新しいregisterFont(Font font)
メソッドが導入されましたが、これを使えば、Font.createFont(int, java.io.InputStream)
メソッドを使って作成されたフォント、またはFont.deriveFont(int, float)
メソッドを使って作成済みフォントから派生されたフォントを登録できます。登録が成功すると、registerFont
メソッドからtrue
が返されます。このメソッドからfalse
値が返された場合、それは、登録しようとしているフォントが、作成済みのフォントでないか、あるいはこのGraphicsEnvironment
オブジェクトにすでに登録されている非登録フォントと競合していることを意味します。
特定のアンチエイリアス処理描画ヒントまたは部分描画ヒントを指定してFontRenderContext
オブジェクトを作成できるように、java.awt.font.FontRenderContext
クラスの新しいコンストラクタが導入されました。Java SE 6.0 の新機能を反映するために、次のメソッドが追加されました。
isTransformed()
—FontRenderContext
オブジェクトが変換された描画コンテキストでテキストを測定することを示す。getTransformType()
— アフィン変換の整数タイプを取得する。getAntiAliasingHint()
—FontRenderContext
オブジェクトに適用可能なテキストアンチエイリアス処理描画モードヒントを取得する。getFractionalMetricsHint()
—FontRenderContext
オブジェクトに適用可能なテキスト部分メトリックス描画モードヒントを取得する。getPixelBounds()
—TextLayout
オブジェクトのピクセル境界を取得する。このメソッドは、影響のあるピクセル境界を定義するRectangle
オブジェクトを返します。
- 新しいテキストアンチエイリアス処理モード
「テキストアンチエイリアス処理」は、画面上でテキストの端を平滑化するために使用されるテクニックです。Java 2D API には、このテクニックを使用すべきかどうかや使用すべきアルゴリズムを指定する手段として、Graphics
オブジェクトにテキスト描画ヒントを適用する機能が用意されています。LCD ディスプレイに最適化された新しいテキストアンチエイリアス処理方式が追加されました。これらは一部のシステム上でデフォルトで有効化され、RenderingHints
クラス内で定義された対応するキーと値を使って制御できます。
アンチエイリアス処理の詳細については、Java チュートリアルの「Displaying Antialiased Text by Using Rendering Hints」節と「Controlling Rendering Quality」節を参照してください。
- グラフィック属性の拡張
以前のバージョンの JDK から含まれているTextLayout
クラスのgetOutline(AffineTransform)
メソッドとともに、GraphicAttribute
クラスの新しいgetOutline
メソッドを使えば、GraphicAttribute
オブジェクトが描画する領域を表すShape
オブジェクトを取得できます。ShapeGraphicAttribute
クラスのgetOutline
メソッドは、ShapeGraphicAttribute
オブジェクトが描画する領域の輪郭が取得されるように、GraphicsAttribute
クラスの対応するメソッドをオーバーライドします。
- レイアウトパス
新しいLayoutPath
クラスは、ベースラインを基準にしたPoint2D
位置とユーザー空間内のポイントとのマッピングを提供します。このクラスの 2 つのメソッドは、双方向のマッピングを可能にします。つまり、ある位置からユーザー座標内のあるポイントへと、逆にユーザー座標内のあるポイントからある位置へです。TextLayout
オブジェクトのレイアウトパスを取得するためのgetLayoutPath()
メソッドが、TextLayout
クラスに追加されました。
- テキスト属性
フォントの外観を改善するために、TextAttribute
クラスで新しい属性が導入されました。KERNING
属性を使えば、カーニング整数値を要求して文字の外観をより美しくできます。KERNING_ON
定数は、テキスト描画時にフォントによって指定されたカーニングペアに従ってグリフ間の間隔が調整されることを要求します。LIGATURES
属性の定数値LIGATURES_ON
を使用すると、フォントによって指定された省略可能な合字を適用すべきであることが要求されます。TRACKING
属性は、グリフ間の間隔の粗密を制御するために使用されます。たとえば、TRACKING_LOOSE
定数を使用すると、各グリフ間に追加のスペースが割り当てられ、配分されます。イメージング
BufferStrategy
クラスの新しいメソッド
システムリソース管理を改善するために、java.awt.image.BufferStrategy
クラスにdispose()
メソッドが追加されました。この新しいメソッドは、BufferStrategy
オブジェクトによって消費されたシステムリソースを解放します。さらに、このメソッドは、関連付けられたComponent
インスタンスからこのBufferStrategy
オブジェクトを削除します。ジオメトリ
- 簡単な合成
AlphaComposite
クラスに次のメソッドが追加され、指定された合成規則またはalpha
値を使用するAlphaComposite
オブジェクトを取得できるようになりました。
- public AlphaComposite derive(int rule)
- public AlphaComposite derive(float alpha)
この 2 つのメソッドを使えば、開発者はさまざまな合成効果のコーディングを行い、
getInstance
メソッドのより複雑な使用を避けることができます。Composite alpha0 = null, alpha1 = null; alpha0 = AlphaComposite.SrcOver.derive(alpha); alpha1 = AlphaComposite.SrcOver.derive(1-alpha)グラデーションペイント機能
MultipleGradientPaint
クラスを拡張したLinearGradientPaint
クラスとRadialGradientPaint
クラスは、特定のカラーグラデーションパターンを使ってShape
オブジェクトを塗りつぶします。MultipleGradientPaint.CycleMethod
列挙は、無効化 (CycleMethod.NO_CYCLE
)、反射 (CycleMethod.REFLECT
)、または繰り返し (CycleMethod.REPEAT
) ペイントを使ってグラデーション境界の外側のペイントを処理するために使用されます。
Point2D start = new Point2D.Float(0, 0); Point2D end = new Point2D.Float(100, 100); float[] dist = {0.0f, 0.2f, 1.0f}; Color[] colors = {Color.BLACK, Color.WHITE, Color.GRAY}; LinearGradientPaint p = new LinearGradientPaint(start, end, dist, colors, CycleMethod.REFLECT);
- アンカーポイントの周りの回転
Java SE 6.0 では、アンカーポイントを使用する既存の回転方法に加え、グラフィックオブジェクトを回転ベクトルに従って回転させたり、アンカーポイントの周りに回転ベクトルに従って回転させたりすることができます。この新機能をサポートするために、AffineTransform
クラスで次のメソッドが導入されました。
public static AffineTransform getRotateInstance(double vecx, double vecy)
public static AffineTransform getRotateInstance(double vecx, double vecy, double anchorx, double anchory)
public static AffineTransform getQuadrantRotateInstance(int numquadrants)
public static AffineTransform getQuadrantRotateInstance(int numquadrants, double anchorx, double anchory)
public void rotate(double vecx, double vecy)
public void rotate(double vecx, double vecy, double anchorx, double anchory)
public void quadrantRotate(int numquadrants)
public void quadrantRotate(int numquadrants, double anchorx, double anchory)
public void setToRotation(double vecx, double vecy)
public void setToRotation(double vecx, double vecy, double anchorx, double anchory
setToQuadrantRotation(int numquadrants)
メソッドを使えば、指定された数の四分円だけの回転を行えます。その片方は、指定されたアンカーポイントを中心にして指定された数の四分円だけ座標を回転させる変換を返します。
- 逆変換の簡易取得方法
AffineTransform
クラスの新しいメソッドは逆変換機能を改善します。Java SE 1.2 でcreateInverse
メソッドが導入され、これによって形状の座標を元の位置に変換していましたが、新しいinvert()
メソッドを使えば、現在の変換をそれ自体の逆状態に設定できます。
GeneralPath
クラス用の倍精度
Java 2D API には長らく、GeneralPath
クラスの倍精度版が含まれていませんでした。Path2D
クラスはPathIterator
インタフェースで反復可能なパスを表しており、次の 2 つのサブクラスを持っています。Path2D.Float
およびPath2D.Double
。変更後の階層では、GeneralPath
クラスはPath2D.Float
クラスのサブクラスになりました。これらがいずれも単精度で使用できるのに対し、Path2D.Double
クラスは倍精度で適用できます。GeneralPath
クラスではなくPath2D.Float
クラスを使用する理由の 1 つは、アプリケーションで単精度型と倍精度型の両方が採用されている場合の、コードの一貫性と明示性を高めることです。
- 形状クラスの新しい
hashCode()
メソッドとequals()
メソッド
JDK 1.2 以降、Rectangle2D
クラスにはhashCode()
メソッドとequals()
メソッドが含まれていましたが、RectangularShape
クラスのほかのサブクラスにはその同じ機能が含まれていませんでした。JDK 6.0 ではこのギャップを埋めるために、Arc2D
、Ellipse2D
、およびRoundRectangle2D
クラスにhashCode()
メソッドとequals()
メソッドが追加されています。
印刷
PrinterJob
クラスでの拡張
属性によるページ記述からPageFormat
オブジェクトへの変換をより簡単に行うための簡易メソッドとして、getPageFormat
メソッドが JDK 6.0 に追加されました。
6182443 回転されたアンチエイリアス処理済みテキストのグレーが薄すぎる:
このバグは基本的に、非四分円変換のヒントをオフにすることの副作用です。この問題は、4654540 の修正の一部として解決されました。4151279 楕円、弧、および角の丸い矩形の描画中に視覚的なアーティファクトが現れる:
3 次および 2 次のベジェ曲線の描画用として、適応的前進差分が適用されるパイプラインが別個に開発されました。このアプローチを使うと、ベジェ曲線の描画品質と描画速度が顕著に改善されます。
4924220 Microsoft Sans Serif (True Type) フォントが正しく描画されない:
スキャン変換アルゴリズムの現在の実装のため、Microsoft Sans Serif フォントのグリフが破損しているように見えていました。6282527 バグの修正の一部として、スマートドロップアウト機構が追加されています。
6300721 アニメートされた GIF イメージを異なるイメージフレームを使って繰り返し作成すると、VM がクラッシュする:
あたかもコードが配列の末尾より後の領域にアクセスしたかのように Java ヒープ内でメモリーが破壊された結果として、VM のクラッシュが発生していました。この修正は、イメージの最初の部分が取得された時点でイメージ表現コードの寸法をチェックします。寸法が一致しない場合には、内部バッファー内のイメージが作成し直されます。
6279846
ColorConvertOp
インスタンスに指定されたソースとデスティネーションのColorSpace
が同じである場合にピクセル値が異なる:
ColorConvertOp
インスタンスに指定されたソースとデスティネーションのColorSpace
オブジェクトが同じであった場合に、色変換されたデスティネーションと元のソースとの間でピクセル値が異なっていました。このバグを修正するために、sRGB プロファイルが更新され、高速トラックが作成されています (色変換は一切行われない)。4654540 拡大縮小および反転行列によるテキスト描画でのヒントのサポートが必要:
Truetype ヒントは、ピクセルグリッドに関するグリフの方向が固定されるという前提で設計されました。それが、回転、変形、拡大縮小などの複雑なアフィン変換が truetype ヒントでサポートされなかった理由です。その修正として、次のアプローチが実装されています。
- 元の変換を、ビットマップ変換 (四分円回転とミラーを組み合わせたもの) と残りの変換に分解します
- さらに残りの変換を、安全なヒント変換と輪郭補償変換に分解します
- 安全な変換を使ってヒントを実行します
- ヒント実行後の輪郭に補償変換を適用します
- スキャン変換を実行します
- ビットマップ変換を適用します
6397684
PrintService
オブジェクトの設定時に名前を指定しないと JVM がクラッシュする:PrintService
オブジェクトの設定時に名前を指定しなかった場合 (getName()
メソッドがnull
を返す場合)、JVM がクラッシュしていた。この問題の原因は、次のような特定ユーザーの実装でした。PrintService
インタフェースのgetName()
関数から null が返され、この null 値がネイティブ関数setNativePrintService
に渡されていました。6444688 Windows 上で透明ピクセルを含む
IndexColorModel
イメージの印刷が失敗することがある:Windows プラットフォームで、ビットマスク透明度を含むイメージの印刷が正しく行われないことがありました。ビットマスク透明度の場合に問題が存在していました。印刷コードは、ビットマスク透明度を、元のイメージのより小さな複数のサブイメージとして処理していました。この修正には、もっとも単純でリスクの少ない解決方法が含まれています。それは、常にイメージのコピーを作成することです。
6320281
Type1
ヒントのサポートが欠けている:JDK 6 より前に Java のフォントラスタライザがサポートしていたヒントは、Truetype フォントに対するヒントだけでした。しかし、Solaris および Linux プラットフォームでは Type1 フォントが一般的に使用されており、ヒントを使用しない Type1 フォントは通常、あまり自然には見えませんでした。type1 のヒントをサポートするために実装された機能は、次のとおりです。
- hstem および vstem
- dotsection
- BlueValues および OtherBlues
- type1 ヒントの置換
4912220 1.4 リグレッション: 反転と非対称の拡大縮小を組み合わせるとしばしば、フォントが変形してしまう:
Truetype のヒントは、任意の変換のサポートを想定せずに設計されました。この制限を克服するため、重要な変換が要求された場合には、「安全」な単位行列を使ってヒントを適用したあと、ヒント適用後の輪郭を変換します。この問題は、4654540 の修正の一部として解決されました。
5051527 イメージのより高速かつ直接的なソフトウェア変換:
イメージ変換用のコードは、イメージ処理ライブラリを使って処理を実行していました。このアプローチでは、変換処理を行うたびに少なくとも 1 つの中間バッファーを作成する必要がありました。新しいコードでは、任意の内部処理形式の変換と任意の内部処理形式への合成を、1 つの処理内で、スタックで割り当てられた最小の 1 行ピクセルバッファーのみを使って行えます。
Windows Vista では、DirectDraw
によるハードウェア高速化は現時点ではデフォルトで無効になっていますが、これは、Vista のデスクトップウィンドウマネージャーとの互換性に問題があるからです。
-Dsun.java2d.noddraw=false
プロパティーを使えば、DirectDraw
パイプラインの使用を再度有効にできます。ただし、描画アーティファクトやパフォーマンスの問題のため、それはお勧めできません。Direct3D
パイプラインも有効にするには、前述のフラグと -Dsun.java2d.d3d=true
を組み合わせて使用するようにしてください。
Copyright © 1999-2006 Sun Microsystems, Inc. All Rights Reserved. |