AWT グラフィックスクリップ API


最終更新日: 1996 年 10 月 30 日

問題

現在 AWT Graphics オブジェクトには、減少するだけのクリップ領域を実装するメソッドがあります。クリップ領域を操作するための単一の clipRect() メソッドがあります。このメソッドは現在のクリップ領域と指示された矩形とを交差させ、2 つの共通部分を新しいクリップ領域として設定します。この操作は、レンダリングを、コンテキストの「再描画領域」に固定するために設定された Graphics オブジェクト内で操作する間に、クリッピングを使用してペイント配布を制御しようとする、多くのグラフィックスアルゴリズムにとって便利なものです。クリッピングがレンダリングプロセスで使用されている場合、通常これは少数のレンダリング操作のためにだけ使用されます。クリップ領域を、再描画プロセスによって確立される元のコンテキストクリップに拡大する機能がなければ、レンダリングを目的としたクリッピングは、一時のプロセスになります。

プログラマが、一時的に 1 つまたは 2 つのレンダリング操作に対して小さな領域にクリップを設定し、それをあとで復元したい場合、別の機構を使用する必要があります。現在使用可能な方法は、create() メソッドの 1 つを使用して Graphics オブジェクトをコピーし、clipRect メソッドを使用して、一時的なクリップを新しい Graphics オブジェクトに設定し、それが終わったときに処理することです。元の Graphics オブジェクトは、修正前の状態の元のクリップを持っており、それを次回のレンダリングに使用することができます。

さらに、Graphics オブジェクトの他のすべての属性は問い合わせ、変更および元の値への復元ができます。レンダリング属性として表示されるとき、クリップ領域は部分的にしかこの設計モデルに従いません。クリップ領域を Rectangle オブジェクトとして問い合わせるためのメソッドには、getClipRect() がありますが、このメソッドは将来、矩形以外のクリップが提供されるときには、拡張することができません。加えて、現在のクリップ領域を問い合わせした場合でも、さらに限定されたクリップをインストールしたあとで、このクリップを明示的にこの値に設定する方法はありませんでした。

新しいクリップ API

この問題を解決するために、次の新しいクラスが AWT に 1 つ追加されています。
	java.awt.Shape
次の 3 つの新しいメソッドが AWT Graphics クラスに追加されています。
	getClip()
	setClip(Shape)
	setClip(int x, int y, int w, int h)

また、getClipRect() メソッドは、前述したより一般的な getClip() メソッドと次の新しいメソッドがあるので、現在は推奨されていません。

	getClipBounds()
このメソッドは、現在のクリップ領域のバウンディングボックスを、その形にかかわらず Rectangle として返します。また、このメソッドには、AWT のクラスに渡って行われた用語の更新と整合性のある名前が付けられています。

サンプルコード

一時的なクリッピングを実行するために古い API の使用方法を示すサンプルコードを、次に示します。


    import java.awt.*;
    import java.applet.*;

    public class TempClipExample extends Applet {
	Image bgimg, img2;
	public void paint(Graphics g) {
	    // Draw a background image
	    g.drawImage(bgimg, 0, 0, this);
	    // Draw the upper left 100x100 portion of another image at 10,10
	    Graphics g2 = g.create();
	    g2.clipRect(10, 10, 100, 100);
	    g2.drawImage(img2, 10, 10, this);
	    g2.dispose();	// reclaims resources more quickly
	    // Now continue drawing with original clip area
	    g.fillRect(0, 0, 10, 10);
	}
    }

一時的なクリッピングを実行するために新しい API の使用方法を示すサンプルコードを、次に示します。


    import java.awt.*;
    import java.applet.*;

    public class TempClipExample extends Applet {
	Image bgimg, img2;
	public void paint(Graphics g) {
	    // Draw a background image
	    g.drawImage(bgimg, 0, 0, this);
	    // Draw the upper left 100x100 portion of another image at 10,10
	    Shape oldclip = g.getClip();
	    g.clipRect(10, 10, 100, 100);
	    g.drawImage(img2, 10, 10, this);
	    g.setClip(oldclip);
	    // Now continue drawing with original clip area
	    g.fillRect(0, 0, 10, 10);
	}
    }


コメントの送付先: java-awt@java.sun.com
Copyright © 1996, Sun Microsystems, Inc. All rights reserved.