logo
 
WebChain/2 Previous Ramdom Jump WebChain/2 Home Next
 メインメニュー
 サイト内検索

検索オプション
 ログイン
ユーザID または e-mail:

パスワード:

IDとパスワードを記憶

パスワード紛失

新規登録
 IRC(チャット)
#OS/2:*.jp
楽しみ方はこの辺参照.
フォーラム一覧   -   トピック一覧
   アプリ
     Cairo support for OS/2
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
orca
投稿日時: 05/08/17 08:47
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Cairo support for OS/2
ニュースから。

Cairo for OS/2がDoodle氏によって提供されています。

中身は dllとライブラリー, それとサンプルプログラムで, あとはソレらを使うためのヘッダーファイルくらい。
んで, clock.exeはそのまま動いたけど, font.exe svg.exeのふたつは, σ(^^) の環境では動かないよーです。

cairoそのもののソースは含まれていないので詳しいトコまでは分からないけど, font.exe (font.c)では, cairo_arc()を呼び出した直後の cairo_fill() で失敗するよーれす。 その部分の cairo_fill() をコメントにして再コンパイルすると動いたです。
svg.exe (svg.c) は svg_cairo_render() で失敗するよーです。コレはどーしよーもなかったりして。
orca
投稿日時: 05/08/19 22:02
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
その後, 同じ /incoming/ の下に cairo.dllのソースも見つかったです。今はないけど。
調べてみると, svg.exe (svg.c)では 浮動小数点数のオーバーフローのよーな感じで異常終了してたです。割り算の分母が 0に近づくとダメだったので。それに, ホントに 0と見なされているのなら 0除算エラーになるのかなと思うし。
参考: cairo-traps.c の _line_segs_intersect_ceil関数 (変数 y_intersectを除き, すべて浮動小数点数)

if (m1 == m2)
	return 0;
y_intersect = _cairo_fixed_from_double ((b2 - b1) / (m1 - m2));


んで, 作者に知らせたいのはやまやまだけど ・・・
(1)実際に, どのよーにソレを回避したらよいのか分からない (適当な閾値でごまかすことは可能だけど)
(2)cairoそのものなのか, OS/2用に加工した部分なのか不明 (どこに知らせたらよいのか)
(3)つか, そもそも英語だし

(3)は, 最悪, コードと overflow/underflow? みたいな単語を組み合わせると分かってもらえるかもだけど, (1)についてはさっぱりです。
知恵を貸してください。
achain
投稿日時: 05/08/19 22:24
Webmaster
登録日: 03/01/26
居住地: とーきょー じゃぺーん
投稿: 2597
Re: Cairo support for OS/2
Carioスタッフはここ↓に移されたようです.
ftp://ftp.netlabs.org/pub/Cairo/

>(1)実際に, どのよーにソレを回避したらよいのか分からない

isfinite()とかisnan()とかで検出できませんかね?
orca
投稿日時: 05/08/19 23:25
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
もう少し詳しいトコまで分かったです。
cairoは, たぶん高速化のためだと思うけど, doubleとかは使わずに cairo_fixed_16_16_tとか使ってます。
浮動小数点数をソレに変換する部分でこのエラーが発生してるけど, このとき 65536を掛けてるです。
で, 浮動小数点数の演算そのものは大丈夫のようで, その乗算らしきトコでエラーになってるよーです。 (← ホントは乗算のあとの cast)

isfinite()とかは使ったことなかったので参考になったです。watcom Cにはソレが見つからず, 代わりに _finiteがありました。
でもここによると finiteは廃止っぽいけど。
参考: http://www.linux.or.jp/JM/html/LDP_man-pages/man3/finite.3.html

追記: 多少間違いはあるけど動いたです。

//y_intersect = _cairo_fixed_from_double ((b2 - b1) / (m1 - m2));
{ double tmp = ((b2 - b1) / (m1 - m2))*65536;
  if (fabs(tmp) > INT32_MAX) tmp = /*copysign*/ INT32_MAX;
  y_intersect = (cairo_fixed_t)tmp;
}
orca
投稿日時: 05/08/20 21:24
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
調べてくうち疑問がフツフツと ・・・
単純なプログラムでは, doubleの値を longに代入/cast するとき, オーバーしそうなら (-)の最大の値が入ってたです (異常終了ではなく)。 コレは gccでも watcom C (wcl386)でも同じ。
だけど, svg.cではそこで異常終了してしまう訳で, その原因を知りたいトコです。 何が考えられるでしょー。
(1) DLL の場合だとエラーになってしまう?
(2) signalハンドラーのよーなものがどこかで登録されている?
(3) あるいはそれ以外?

もうひとつは, この svg.exeを動かしてみた人は他にいるのかってことです。 ホントに異常終了するのかどーか, ソレを知りたい, と。
てゆーのも, 問題の箇所は cairoのオリジナルのようで, だったら他のプラットフォームでは大丈夫なのか, だとしたら OS/2だけの問題なのか, それとも σ(^^) の環境だけ? ・・・ みたいな。

chagrin
投稿日時: 05/08/21 03:08
Not too shy to talk
登録日: 03/01/27
居住地: yokohama, japan
投稿: 39
Re: Cairo support for OS/2
コプロセッサのコントロール/ステータス・ワードを調べてみるのが基本でしょうか?
コプロの事ってどうもよく判らないし,どうやったら調べられるのか判らない...
inline assembler ですかね?

こちらの手元では,確かに,負の最大値になりますね.


(DOS窓,symbeb での実行結果)
-u 100 l9
0F81:0100 8CC8 MOV AX,CS
0F81:0102 8ED8 MOV DS,AX
0F81:0104 66C706000200000000 MOV DWord Ptr [0200],00000000
0F81:010D 66C706040201000000 MOV DWord Ptr [0204],00000001
0F81:0116 DF2E0002 FILD QWord Ptr [0200]
0F81:011A DB1E0802 FISTP DWord Ptr [0208]
0F81:011E DD3E0C02 FSTSW [020C]
0F81:0122 D93E0E02 FSTCW [020E]
0F81:0126 CC INT 3
-d 200 l10
0F81:0200 00 00 00 00 01 00 00 00-00 00 00 80 41 10 7F 03 ............A...


Invalid Operation (bit 0)が立つのかな.これがマスクされてなくて,
例外が発生しているのでしょうかねぇ.
C compiler が DLL 初期化コードで変なコプロ設定にする,って奴でしょうか.
sava
投稿日時: 05/08/21 23:01
Quite a regular
登録日: 03/01/27
居住地: ちば…たぶん
投稿: 41
Re: Cairo support for OS/2
とりあえずアーカイブだけ落としてきて中身をぼーっと見ただけ(OS/2 上で動作未確認)なのですが、

・dll が(たぶん LxLite で)圧縮されているので、念のため圧縮解除してためしたほうがいいかもしれない。
・Cairo-OS2-src.zip 内の makefile 見てみた限りでは、リンカスクリプトに initinstance(と terminstance)が指定されていないので、dll 内のランタイムライブラリが正しく初期化されていない可能性がある。

というようなことが気になりました。

#しかし OpenWatcom...ライセンス的にはいいのか?
orca
投稿日時: 05/08/21 23:35
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
まとめてアレします。
まず, コンパイルオプションには -fpi (inline 80x87 instructions with emulation) が指定されてて, コプロではないのかもです。

んで, doubleを longに変換してオーバーするよーなテストプログラムを用意し, 同じオプションでテストしてみたけど, 相変わらず (-)の最大値。その部分を DLLに変換して テストしてみたけど変わらず (その記述に間違いがなければ)。
今度は cairo.dll と cairo.libを使って, 直接呼び出してみようとしたものの, 公開されておらずリンクで失敗。
・・・ 今のトコこんな感じれす。

> 念のため圧縮解除してためしたほうがいいかも
dllは, ソレを調べてる時点で再コンパイルしてるので, 未圧縮です。

> initinstance(と terminstance)が指定されていないので、dll 内のランタイムライブラリが正しく初期化されていない可能性がある。

wlinkの directiveにはソレらしきものはなさそげです。
sava
投稿日時: 05/08/22 00:49
Quite a regular
登録日: 03/01/27
居住地: ちば…たぶん
投稿: 41
Re: Cairo support for OS/2

orcaさんは書きました:

> initinstance(と terminstance)が指定されていないので、dll 内のランタイムライブラリが正しく初期化されていない可能性がある。

wlinkの directiveにはソレらしきものはなさそげです。


initinstance と terminstance については、プログラマーズガイドの "OS/2: OS/2 2.x Dynamic Link Libraries"→"OS/2:Creating a Sample Dynamic Link Library" のあたりに一応説明があります。
リンカのドキュメントだと非常に見つけづらくて困りものです(FORMAT directive のところ)。

Cairo の makefile でいうと、
 @echo SYSTEM os2v2_dll >>$^@

の行を
 @echo SYSTEM os2v2_dll initinstance terminstance >>$^@


という感じではなかろうかと…(でもこれが原因かはわからないですが)
orca
投稿日時: 05/08/22 14:58
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
initinstance と terminstanceを cairo.lnkに指定してみたけど, 動作はかわらかなったです。
てゆーか, たぶん 違うカモ。
この部分は何度も呼び出されていて, デバッグ表示でずっとスクロールしてった後に, 特定の値(の範囲?) のトコで異常終了するです。


double  m1 = _compute_inverse_slope (l1);
double  b1 = _compute_x_intercept (l1, m1);
double  m2 = _compute_inverse_slope (l2);
double  b2 = _compute_x_intercept (l2, m2);
double tmp = (b2 - b1) / (m1 - m2);

printf("%d %f ", (long)tmp, tmp*65536);
printf("%d ", (long)(tmp*65536));   // ← 何度も通過後, 異常終了
printf("%d ", (long)(384.090087 / 0.010140 *65536));

表示項目の最後のものは, 異常なときの値を(表示させたものをそのまま) 使った計算です。
だけど丸めが入り, そしてそのばーいだと (-)の最大値が表示されるだけです。

てことで, l1, l2の, 異常なときの値を取り出してみたです。
(↓) の値を元に浮動小数点数を取り出したときの計算だと, 異常終了が可能って感じ。

cairo_line_t ln1 = {{12091084, 8127346}, {12088491, 9281989}};
cairo_line_t ln2 = {{37176333, 8455717}, {37166807, 9224825}};

SofiyaCat
投稿日時: 05/08/22 20:44
Quite a regular
登録日: 05/08/01
居住地: 東京都
投稿: 47
Re: Cairo support for OS/2
よくわかんにゃいけど
割り算で0に近いときにゃは、単純に0で返っちゃえばいいのでわにゃ?

だめにゃのかにゃ?
(Cairo自体をしらにゃい猫でしたにゃ。)


----------------
Sofiya猫

orca
投稿日時: 05/08/22 23:50
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
「分母が 0なら」という処理が直前にあって, でも「0に近ければ」ではなかったので最初はどーかと思ってたです。

SofiyaCatさんは書きました:
よくわかんにゃいけど
割り算で0に近いときにゃは、単純に0で返っちゃえばいいのでわにゃ?

だめにゃのかにゃ?
(Cairo自体をしらにゃい猫でしたにゃ。)
調べていくうち, double → longのキャストで異常終了してたことが分かったです。
でも ホントは, long → shortのキャストでオーバーしてもエラーにはならないように, double → longでもエラーになるはずがないのに (たぶん)。
orca
投稿日時: 05/08/23 00:02
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
先ほどの処理を, 関数を呼び出さず直接計算するようにしたです。

typedef struct { int32_t x, y; } point_t;
typedef struct { point_t p1, p2; } line_t;

{
    line_t ln1 = {{12091084, 8127346}, {12088491, 9281989}};
    line_t ln2 = {{37176333, 8455717}, {37166807, 9224825}};
    double m1 = (double)(ln1.p2.x -ln1.p1.x) / (double)(ln1.p2.y -ln1.p1.y);
    double m2 = (double)(ln2.p2.x -ln2.p1.x) / (double)(ln2.p2.y -ln2.p1.y);
    double b1 = (double)ln1.p1.x /65536.0 - m1 * ((double)ln1.p1.y /65536.0);
    double b2 = (double)ln2.p1.x /65536.0 - m2 * ((double)ln2.p1.y /65536.0);
    double tmp = (b2 - b1) / (m1 - m2) *65536;
    printf("y_intersect = \n");
    printf("%d \n", (long)tmp);   // ← ここで異常終了
}

んで, この処理で異常終了することを確認して, コレをあっちこっちに移動させてみたです。
(1) DLLから svg.cに移しても異常終了 ・・・ DLLの問題ではなさそげ
(2) svg.cでの記述場所によっては, (-)の最大値として正しく扱うこともできる
(3) で, その場所は hmq = WinCreateMsgQueue(hab, 0); のトコ
… てことが分かったです。

hmq = WinCreateMsgQueue(hab, 0) の呼び出し以降, 上記の処理は異常として捉えられるっぽいです。
具体的には

void
main(int argc, char *argv[], char *envp[])
{
  HAB hab;
  HMQ hmq;
  QMSG msg;
  ULONG flCreaFlags, flFrameStyle, flClientStyle;
  SWP swap;
  PFNWP pOldFrameProc;
  HWND hwndFrame;
  HWND hwndClient;

  DosGetInfoBlocks(&tib, &pib);
  // Change flag from VIO to PM:
  if (pib->pib_ultype==2) pib->pib_ultype = 3;

  hab = WinInitialize(0);
  hmq = WinCreateMsgQueue(hab, 0);
  // ここからは異常終了。(↑)の位置での計算であれば, 異常終了しない

… はっきしゆってコレ以上は追いきれないかも。
sava
投稿日時: 05/08/23 21:50
Quite a regular
登録日: 03/01/27
居住地: ちば…たぶん
投稿: 41
Re: Cairo support for OS/2
とりあえず qemu 内の OS/2 環境 (FX00505, SVGA GENGRADD) で Cairo のサンプルを実行してみました。
速度はともかくとして、3つともバイナリ無修正で動作するようです。

clock
font
SVG

なのですが、その後、CL-GD5446 用のドライバ突っ込んでもういちど試したら TestApp のウィンドウの中身がひとっつも表示されませんでした。

とりあえず SVG だけ

…ディスプレイドライバの作りによっては…というか GRADD 系以外ではまともに動かないんじゃねえのかという悪寒。(なんか非公開 API で無理やりトップダウン DIB の設定してるし…)
orca
投稿日時: 05/08/23 23:38
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
実行してもらうと参考になるです。
異常さ具合から, σ(^^) のマシンに問題があるのでは? とか思うので。 てゆーか, CPUの問題?とか考えてたです。
けど, ディスプレイドライバーかもってことれすね。 σ(^^) の環境のも, あの計算+PMモード でダメになるっぽいし。


(なんか非公開 API で無理やりトップダウン DIB の設定してるし…)

"Change flag from VIO to PM" とかコメントが付いてるトコでしょーか?
でも svg.lnk の内容 "system os2v2_pm" に書き替えて PMだけにしても, 結局内部でエラーが発生してるよーでした。
orca
投稿日時: 05/08/24 07:49
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
もしかすると, 原因が同じで症状が違うだけなのかも ・・・ 異常終了と。
その後、CL-GD5446 用のドライバ突っ込んでもういちど試したら TestApp のウィンドウの中身がひとっつも表示されませんでした。

ftp.serina.org に, σ(^^) が使ってる cairo.dllを uploadしたです。ソレで試してみるってのはどーでしょー?
achain
投稿日時: 05/08/25 00:09
Webmaster
登録日: 03/01/26
居住地: とーきょー じゃぺーん
投稿: 2597
Re: Cairo support for OS/2
実行してもらうと参考になるです。

とのことなので遅まきながら試してみました.
(昨日までOS/2マシンの電源が死んでたもので…<言い訳)
残念ながら(?)当方の環境ではオリジナルパッケージそのままのファイルで動作しました.font.exeのウィンドウサイズをぐりぐり動かしていたら一度だけSYS3175りましたが,あとはいたってふつうに.

ちなみにRadeon 9600+SNAP 3.0.8です.

ftp.serina.org に, σ(^^) が使ってる cairo.dllを uploadしたです。ソレで試してみるってのはどーでしょー?

# httpの方に移しておきました.

で,当方この織華さん版cairo.dllに入れ替えてもみましたが,コンソールにいっぱいアスタリスクが出力される以外は特に変化は見られませんでした.
sava
投稿日時: 05/08/25 07:07
Quite a regular
登録日: 03/01/27
居住地: ちば…たぶん
投稿: 41
Re: Cairo support for OS/2
先ほど cairo.dll を入れかえて試してみました。結果は同じで、やはり 5446 では表示されませんでした。

非公開 API というのは cairo-os2-surface.c 中で使われている GpiEnableYInversion とかそのへんです。
ただこれは浮動小数点の例外とはあまり関係ないと思えるので…(あとは WinCreateMsgQueue の直後に _fpreset() とか _controlfp あたりを置いてみるとかしか思いつきません)
orca
投稿日時: 05/08/25 07:19
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
やはり正しく動く環境もあるんですね。
てゆーか, 異常終了のアレからすると, そんなことで止まる方がどーかしてるって感じだけど。
で, σ(^^) の環境は snapse218 … なのかな? SNAPなのは分かるけど, バージョンの確認方法分からなかったりして。
そんな訳で, なるべく最新のものを探しだしてもいちど試してみるです。

加工した cairo.dllは, 異常のときにしかあまり意味がないかもです。
んで, "**" は変換を行ったときに表示してるです。


追記: VGAモードで起動しても, σ(^^) の環境では同じ現象でした。
で, snap-os2-3.0.8.exe S3 SuperSavage/IXC の VGAサイズ, 1024×768 (256色), 16M色 それぞれ同じ現象。
graddbb_a.097.exe の VESAでも同じ。
snapse218 に戻して, やっぱり同じ現象れす。

もいちど現象をまとめてみると …
PMのモードを持つプログラムで, (ある特定の?)浮動小数点数を longにキャストすると異常終了してしまう, です。
ついでに, 単純にソレだけを行うプログラムを用意してみたです。(shapes.zip)
KAMUI
投稿日時: 05/08/25 22:29
Home away from home
登録日: 03/01/28
居住地: 名古屋だがね。
投稿: 714
Re: Cairo support for OS/2
cairo.dll 差し替えて見ました。
これまでは clock しか動きませんでしたが
font と svg も動く様になりました m(__)m

ウチは SNAP/se build 446 に S3 Savage4 (APG/16MB)環境。
(1) 2 3 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Powered by IBM OS/2 Warp, Apache, PHP, MySQL and XOOPS Cube