2016年12月25日

LazarusとCairoとGkt2

まぁそもそもWindowsにCairoを組み込むってところから始まってるので、逆にソレが普通なLinuxのGtk環境下でCairoのAPIとLazarusをどう連携させるのかという資料が集まりにくかったという話。Lazarusは基本クロスプラットフォームな開発環境を提供しているので、OSがソレ独自で行ってるような部分はカプセル化して均質化した開発用インターフェースを提供するというのを主眼に開発されてるんだよね。だもんだから普通に使えば例えば「Canvas.LineTo(a,b);」とか「Canvas.Draw(0,0,FBitmap);」みたいに普通に済ませればなんともないものも掘り下げようとすると結構苦労するハメになるw

今回Win7上でSVGを加工使用する為にCairoを使って描画を行っていた業務用ソフトをWin嫌いな私がw「xubuntu」に移植しようとLazarusのあちこちを調べまわった結果、なかなか 「cairo_win32_surface_get_dc」への対応策が見当たらずに悩んでいたのだった。Winだとハンドル探して転送掛けてやれば済むわけだがGtkの場合ソレをどうやってるのかまだ理解していなかったのだwwww

で、とにかく英語のメーリングリストとかあちこち読み漁った挙句でてきたじゃぁないですかww

Qtの場合どうするかなんてのはまだわからないんだけど、ひとまずGtk2(一応Gtk2.8までいけそうな感じ)の場合、glib2、gdk2、gtk2def、gtk2procの各ユニットをusesして、必要描画部分のCanvasからHandleをゲット、で、ソレが一応WinでのDCとほぼ等価になるようで、まぁバックグラウンド用ビットマップとか使うなら

var
ADrawable:PGdkDrawable;
ACairo:Pcairo_t;
begin
ADrawable:=TGkt2DeviceContext(FBackBmp.Canvas.Handle).Drawable;
ACairo:=gdk_cairo_create(ADrawable);
  ・
  ・
  ・
cairo_destroy(ACairo);
end;

こんな感じでPcairo_tを取り出してやれば、そいつ使ってcairoのAPIを回せるといった要領のようだ。
一応TGtk2DeviceContextは移植性の問題からか「非推奨」になってるので、あまり使わない方が良いとは思うけど、今回は移植性などの問題が発生したんだから仕方ないよねwww

つーか、Gtk内部のことも少しは勉強しないとなぁ・・・・めんどうだけど。
posted by MCI_Error at 18:11| Comment(0) | cairo api
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: