torutkのブログ

ソフトウェア・エンジニアのブログ

Javaグラフィックス描画の裏側

Java SE 6(Mustang)をソース入手してビルドしているので、JDKの裏側を少しのぞいてみます。いきなりHotSpotでは敷居が高いので、グラフィックス描画の裏側にしてみます。
AWT/Swingでは、アプリケーション側は、paintComponent(Graphics g)メソッドで描画処理を記述します。このとき渡されるGraphicsインスタンスは、sun.java2d.SunGraphics2Dクラスです。このクラスの継承関係は、

java.lang.Object 
    +--- java.awt.Graphics
            +--- java.awt.Graphics2D 
                    +--- sun.java2d.SunGraphics2D

となっています。Graphicsクラスのメソッドはほとんどがabstractとなっており、実装はSunGraphics2Dクラスで定義されています。ここで、

drawLine(int,int,int,int)メソッド

について追ってみます。
SunGraphics2Dの中で、sun.java2d.pipe.ValidatePipeクラスのdrawLineメソッドを呼んでいます。ValidatePipeのdrawLineメソッドから、SunGraphics2DクラスのフィールドdrawpipeのdrawLineメソッドを呼び出しています。フィールドdrawpipeの中身はValidatePaneクラスになっており、ごにょごにょ処理が進むとSurfaceDataクラスのvalidatePipeメソッドの中で描画モードによって使用するShapeを切り替えるようになっています。単純な線(太さ1、座標変換なし)の場合は、LoopPipeクラスが適用されます。
この後、DrawLineクラスのnativeメソッドDrawLineが呼ばれます。

いったんここまで