じゃっば〜んとっぷ
How to set up pja

eTeks

PJA Toolkit

  待ち合わせ?だったらみんなでネットメザマシ

What is PJA ?
PJA contents
Tested platforms

FAQ
History
What's next ?

Copyright and license

PJA documentation
PJA feedback


What is PJA ?

PJA (Pure Java AWT) ToolkitはeTeksが開発したグラフィクス描画用JavaTM ライブラリです。 PJA Toolkitは100% Pure Java でJVMが稼動するシステムのネイティブなグラフィクス資源を使用しません。
デフォルトのJVMにおけるdrawLine (), fillOval (), drawString (),..などのjava.awt.Graphicsのメソッドは、ネイティブなグラフィクス機能を使用して実装されています。 (Java2Dのような一部の例外を除く) : つまり、java.awt.Imageを使ってオフスクリーンの画像に描画する場合でさえ、drawLine () を呼び出せば、Windowsや、UNIXのX11などのGDIシステムコールを使用してしまうのです。 これは、Javaを使用したグラフィクス描画処理のパフォーマンスを最大限に引き出すためです。
しかし、このデフォルトの振る舞いは、問題となることもあり、PJAライブラリは、その問題点を解決してくれるでしょう。

PJA contents

PJAライブラリは以下の内容を構成として配布しています:

サーブレットの動作環境を持つホストプロバイダ も、版権情報を提示の上、WEBサイトと文書にhttp://www.eteks.comへのリンクをはることで、利用者のためにこのライブラリを導入して使用することができます。

Tested platforms

eTeksでは以下のシステム環境でPJAの動作確認をしました。

JDK version
Windows
MacOS
UNIX
1.0
Win 98/SunJDK 1.0.2    
1.1
Win 98/SunJDK 1.1.8 MacOS 9/MRJ 2.2

Linux/JDK 1.1.7 (without DISPLAY)

1.2
Win 98/SunJDK 1.2.2  

Linux/JDK 1.2.2 (with and without DISPLAY)

1.3
Win 98/SunJDK 1.3.0    

ユーザの方々から以下の環境で使用できたとのご報告をいただいています。

FAQ

どのような場合にPJAを使えばよいのでしょうか?

対象
課題
開発/運用時
サーバ上でグラフィクス処理をするようなサーブレットやアプリケーションが動作するか不明。 com.eteks.servlet.DefaultToolkitTestサーブレットやPJAToolkitDemoアプリケーションが動作するか試してみましょう。
運用時
グラフィクス処理をするサーブレットをサーバ上で動作させようとしたところ問題が発生。

java起動時のコマンドラインオプションを変更できない場合

com.eteks.servlet.PJAServletTestを動かしてみてください。正常に動作するのであれば、
com.eteks.awt.servlet.PJARedirectServlet を使用して、グラフィクス処理サーブレットを実行させます。そうでなければ、サーブレットを動作させるサーバのシステム管理者に依頼して、javaコマンドラインオプションに、オプション を追加してもらいましょう。(最低限 -Xbootclasspath/a:pja.jarが必要です。)

java起動時のコマンドラインオプションを変更できる場合 See which options to use.
これから開発
グラフィクス処理をするサーブレットをどこでも動作するように作りたい。 com.eteks.awt.servlet.PJAServletを継承しましょう(例:com.eteks.servlet.TeksSurveyPie)。そうすれば、Xディスプレイにアクセスできる環境での運用者へのサポートを最低限にすることができます。また、単純にPJAの画像処理系メソッドだけを使うという方法もあります。

 

UNIXプラットフォーム上でサーブレットを動作させるためにPJAを使う場合、どんなオプションを追加すればよいでしょう?

(JDK のバージョンはjava -versionで確認できます。)

参考:, JDK 1.4以降では、JDK自身がヘッドレスサポートシステムを持っています(JDK1.4ドキュメント「 Java 2 SDK, v1.4 での AWT の拡張」 の「ヘッドレスサポート」をご覧ください)。システムプロパティ java.awt.headlessをtrueにセットするか、 javaコマンドラインオプション-Djava.awt.headless=true を追加するだけで利用可能です。

JDK1.2以降でJServのbootclasspathpja.jarを追加するには?

jserv.propertiesファイルに以下の様にpja.jarの適切なパスを追加しましょう。

wrapper.bin.parameter = -Xbootclasspath/a:/path/pja.jar

com.eteks.awt.PJAToolkitのインスタンスを生成できるのに、まだjava.awt.AWTError : Toolkit not Found in a java.awt.Toolkit.getDefaultToolkit () call という例外が出るのは?

getDefaultToolkit ()はシステムプロパティawt.toolkitで示されるクラスのインスタンスを生成しようとします。 このメソッドはtoolkitクラスの検索に、デフォルトクラスローダのシステムクラスパスを適用します。com.eteks.awt.PJAToolkitがユーザクラスパスや、サーブレットクラスパスに見つかる場合、あなたのプログラムからはこのクラスのインスタンスを生成できるかも知れないませんが、getDefaultToolkit ()では失敗します。
だから、pja.jarはjavaのコマンドラインオプション -classpath (JDK <= 1.1) または -Xbootclasspath (JDK >= 1.2)で指定しなければならない。コマンドラインオプションを直接変更できない場合は、「どのような場合にPJAを使えばよいのでしょうか?」と「サーブレットの中で問題なく使用できるToolkitメソッドは何でしょうか?」をご覧ください。

UNIXプラットフォームのフォントを使用するとなぜ、JVMはクラッシュするのでしょうか?

JDK1.2以降のいくつかの実装(特にSolaris上)において、sun.java2d.SunGraphicsEnvironmentクラスは private static native boolean validPropertiesFile (java.lang.String, java.lang.String)メソッドを使用しています。 このスタティックメソッドは適切なディスプレィのない状態で呼ばれた場合に、JVMをクラッシュさせるというバグがあると思われます。以下のようなパッチは美しくありませんが、役に立ちます:

このパッチの作業を行う際に、sun.java2d.SunGraphicsEnvironmentのインナークラス(SunGraphicsEnvironment$*.classという名前の全てのファイル)をrtgraphics.jarに含める必要があるという報告を受けています。(JDKのバージョンによります。)
このバグは、JDK1.3の最新版では存在しないようです。

サーブレットの中で問題なく使用できるToolkitメソッドは何でしょうか?

グラフィクス処理を行うサーブレットの問題は、UNIXプラットフォームでグラフィクスディスプレイを利用できない環境でデフォルトのAWT Toolkitにアクセスできないことにより発生します。この場合、java.awt.Toolkit や java.awt.Font のインスタンスを生成することができないため、Toolkitのインスタンスを必要とするjava.awt.Componentのメソッドを呼び出すことができません。
この様な場合、サーバ管理者でないなどの理由でJVMの オプション を変更できないというわけでなければ、デフォルトのToolkitの代わりにPJA Toolkit を使うことで解決できます。

com.eteks.awt.servlet.PJAServlet クラスを利用することで、このクラスパスの問題を解決することができます。但し、セキュリティマネージャの設定によっては、今度はセキュリティ上の問題が発生する可能性があります。 このクラスはクラスパスや他のシステムプロパティにアクセスしたり、クラスローダのインスタンス化を行える権限が必要です。。。
PJA では、デフォルトのtoolkitをインスタンス化されていない状態でもグラフィクス処理を行うための方法も提供しています。以下に、java.awt.Toolkit.getDefaultToolkit()を呼ぶことによるAWT Toolkitのインスタンス化なしで使用できるメソッドを示します :

Default AWT toolkit
 
PJA toolkit (package com.eteks.awt)
Toolkit getImage (URL url)   PJAToolkit getImage (URL url)
Toolkit getImage (String file)   PJAToolkit getImage (String file)
Toolkit createImage (ImageProducer producer)   PJAToolkit createImage (ImageProducer producer)
Toolkit createImage (byte[] imagedata, int imageoffset, int imagelength)   PJAToolkit createImage (byte[] imagedata, int imageoffset, int imagelength)
Toolkit prepareImage (Image image, int width, int height, ImageObserver observer)   PJAToolkit prepareImage (Image image, int width, int height, ImageObserver observer)
Toolkit checkImage (Image image, int width, int height, ImageObserver observer)   PJAToolkit checkImage (Image image, int width, int height, ImageObserver observer)
Toolkit getColorModel ()   PJAToolkit getColorModel ()
Component createImage (int width, int height)     new PJAImage (int width, int height)
Component createImage (ImageProducer producer)   PJAToolkit createImage (ImageProducer producer)
Graphics

getFont ()

  PJAGraphicsExtension

getFontName ()
getFontStyle ()
getFontSize ()

Graphics

setFont (Font font)

  PJAGraphicsExtension

setFont (String fontName, int fontStyle, int fontSize)

PJAToolkitは"new PJAToolkit ()"でインスタンス化可能です。
PJAImage のインスタンス上への描画に使用する PJAGraphicクラスはPJAGraphicsExtension を実装しています。つまり、new PJAImage (width, height).getGraphics()の返値のGraphicsインスタンスはPJAGraphicsExtension のオブジェクトとしてキャストすることができます。

com.eteks.awt.PJAImageはJava2Dを実装していないため、この場合、Java2D やGraphics2D の機能は使用しないことになります。
また、文字列の描画では.pjaf フォントファイルを使用することになります。

JDK1.3以上ではjava.awt.Component クラスのshow()やsetVisible()はなぜClassCastExceptionをスローするのでしょうか?

これらのメソッドは、sun.awt.GlobalCursorManagerを使用していますが、このクラスでは、 java.awt.ToolkitクラスのgetDefaultToolKit()で返されるAWT toolkitがsun.awt.SunToolkitを継承していると想定しているからです!com.eteks.awt.PJAToolkitはjava.awt.Toolkitを直接継承しているため、ClassCastExceptionがスローされます。
これらのメソッドの代わりに、 java.awt.FrameインスタンスのaddNotify()を使用すれば、java.awt.FrameクラスのcreateImage ()でオフスクリーンイメージを生成することができ、さらに、show()メソッドが呼ばれた時に、どこにフレームが現れてしまうのだろうなどということを気にする必要もありません。

PJAではどんなフォントを使って文字を描画できますか?

JDK1.2以降では通常のTrue Typeフォントを使用します。
JDK1.1以前または、JDK1.2以降でシステムプロパティcom.eteks.awt.nojava2dの値がtrueの場合、 .pjaf フォントファイルが使用されます。このファイルはPJAFontCaptureユーィリティで既存のフォントから生成することができます。

.pjafファイルは何のためにあるのですか?

JDK1.1以前のデフォルトのtoolkitの場合、文字列描画の際、JVM稼働環境のプラットフォーム(UNIX, Windowsなど)のネイティブなメソッドとフォントを使用します。 PJA Toolkitではpure javaで文字列の描画を行えるようにするためにフォントに関して多少別の情報が必要になります。XやTrue Typeフォーマットのデコーダを実装する代わりに、.pjaf という拡張子を持つファイルに保存された新しい形式の情報の使用を採用しました。このファイルは、ポータブルで、各フォントの文字を描画するためのビットマップ情報を保持しています。PJAFontCapture ユーティリティを利用してネイティブフォントから.pjaf ファイルを生成することができます。
Java2Dは独自のTrue Typeフォントファイルのデコーダを持っているため、JDK1.2以降では.pjaf ファイルを利用する意味がありません。代わりに、既にあるTrue Typeフォントを使用します。

なぜPJAFontCapture (java com.eteks.tools.fontcapture.PJAFontCapture) が正常に動作しないのでしょう?

PJAFontCapture は、動作時に、JVMデフォルトのtoolkitを使用します。そのため、グラフィクス表示環境を利用できないUNIX環境では動作しません。
グラフィクス表示環境を利用できないUNIX環境で.pjaf フォントが必要な場合は、デフォルトのtoolkitを実行可能な環境(Windows, MacOS, X11 Displayを使えるUNIX) でPJAFontCapture を実行して下さい。その後 ftp (もちろんバイナリモード) などでコピーして.pjaf ファイルを使用したいUNIX環境に導入します。

生成した画像はどのようにして保存したらよいのでしょう?

PJA Toolkitやそれ以外のJavaのクラスで生成したオフスクリーンイメージは、様々な形式で画像ファイルやストリームを生成するエンコーダを使用して保存することができます。エンコーディングの処理はほんの数行の簡単なプログラムで処理することができます。ToolkitDemo.javaのソースコードはACMEのGIF エンコーダを使用する1つの例ですのでご覧ください。
PJA Toolkitで正常に動作確認できたフリーのエンコーダを3つご紹介します。(テストは ToolkitDemo.java に多少の修正を加えることで行いました。):

Encoder
format
JDK version
supported
Link
GIF 1.1 http://www.acme.com/java/
JDK1.0でも動作するAcme.JPM.Encoders.GifEncoder クラスの修正版がPJAの配布で提供されています。
JPEG 1.1 http://www.obrador.com/essentialjpeg/
PNG 1.1 http://catcode.com/pngencoder/

Sun Microsystemsからもデコーダとエンコーダを含む以下の2つのライブラリが提供されています。

FYI: JDK1.2以上ではcom.sun.image.codec.jpeg.JPEGImageEncoderクラスが提供されており、java.awt.image.BufferedImageのインスタンスの画像をJPEG形式で円コードすることができます。

PJAを利用した描画処理が遅すぎます。どうすればパフォーマンスを改善できますか?

JDK1.2以降でPJA Toolkitをお使いの場合、画像ファイルの読み込みを除く大部分のAWTのメソッドはJavaの標準ライブラリの既存のクラスによって実装されています。これらのメソッドの多くは、SunがCのライブラリを使用して実装しており、今後、速度の向上を期待することは困難でしょう。
JDK1.1以前であるか、システムプロパティcom.eteks.awt.nojava2dがtrueにセットされているか、または、com.eteks.awt.PJAImagecom.eteks.awt.PJAGraphicsクラスを直接使用する場合、PJA描画メソッドが使用されます。この場合、com.eteks.awt.PJAGraphicsの描画メソッドは、昔ながらの描画アルゴリズムを使用していてまだ改善の余地がある実装になっているため、PJA ToolkitはデフォルトのToolkitよりも処理が遅くなります。これはPJAがフリーであることの理由の一つです。PJAのパフォーマンスを改善できるアルゴリズムをご存知の方は、是非お知らせください。そうすれば我々がそれを実装して、他のPJAユーザの方々の環境を改善することができるでしょう。
いずれの場合でも、JIT (Just In Time)かHotSpotコンパイラがオンになっていることを確認してください。

PJA Toolkitは100%Pure Javaですか?

SunのJavaPureCheck ツールによるテストでは、PJAは100% Pure Javaではありません。
PJAはJDKのインターナルクラスであるsun.awt.image.ByteArrayImageSource sun.java2d.SunGraphicsEnvironment を使用しているため、以下の2つのエラーがリストアップされます。

 

History

Version 2.4 03/14/2002

Version 2.3.1 07/05/2001

Version 2.3 03/23/2001

Version 2.2 11/02/2000

Version 2.1 07/30/2000

Version 2.0 06/23/2000

The result of this research told roughly :

All the native classes of java.awt package and sub packages are named initIDs (). The implementation of initIDs () is only used by native objects to initialize their struct data and don't use any X11 Display but requires the awt library to be loaded.
Almost all the methods of the class java.awt.image.BufferedImage used to render Java2D are implemented in common Java classes or C programs, except a few ones that are corrected by the following classes.

The following new classes belong to the package com.eteks.java2d. The classes of com.eteks.awt package don't require them if you wish to work with JDK 1.1 or if a DISPLAY is available.

Version 1.2 06/08/2000

Version 1.1 05/30/2000

Version 1.0 05/17/2000

First version. JDK 1.1 compliant.

What's next

Javadoc documentation should be clearer and more consistent. Meanwhile, if you have problems using PJA library, please read first the FAQ.

Features that may be interesting to implement in PJA :

Copyright and license

Copyright © 2000-2001 Emmanuel PUYBARET / eTeks. All Rights Reserved.

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

Visit eTeks web site for up-to-date versions of PJA and other Java tools and tutorials : http://www.eteks.com/


Copyright © 1996,1998 by Jef Poskanzer. All rights reserved. (for the use of Acme.JPM.Encoders.GifEncoder class)

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Visit the ACME Labs Java page for up-to-date versions of this and other fine Java utilities : http://www.acme.com/java/



PJA version 2.4
Last update : 03/14/2002

日本語駄訳:つ∞たん佐藤@ngMAT
Last Update : 2002/12/01


eTeks
© 2000-2002
eTeks - All rights reserved