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
が AWT に追加され、次の 3 つの新しいメソッド
	getClip()
	setClip(Shape)
	setClip(int x, int y, int w, int h)
が AWT Graphics クラスに追加されています。

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

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

サンプルコード

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


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

    public class MyApplet 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(offImg, 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 MyApplet 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.