2017-02-01 4 views
0

Cairo Graphics API(GTK + 2.24.10バンドルに含まれています)を呼び出し、Direct3D 9 API(DirectX SDK 2009年3月)を使用する必要があります。IDirect3D9 :: CreateDeviceはGTK + 2カイロレンダリングを防ぎます

は、次のように私は、基本的なカイロの関数呼び出しを行い、テストするには:

#include <cairo\cairo.h> 

... 

cairo_surface_t *surface; 
cairo_t *cr; 
cairo_status_t status; 

surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 390, 60); 
status = cairo_surface_status(surface); 

cr = cairo_create(surface); 
status = cairo_status(cr); 

cairo_set_source_rgba(cr, 0, 0, 0, 1); 
status = cairo_status(cr); 

cairo_rectangle(cr, 175, 10, 40, 40); 
status = cairo_status(cr); 

cairo_fill(cr); 
status = cairo_status(cr); 

cairo_surface_flush(surface); 
status = cairo_surface_write_to_png(surface, "c:\\cairo_test.png"); 

cairo_destroy(cr); 
cairo_surface_destroy(surface); 

... 

これらのカイロのAPI呼び出しがIDirect3D9 :: CreateDeviceの呼び出しの前に行われた場合、次の.PNGが出力されます

PNG of black square created with Cairo API

はIDirect3D9 :: CreateDeviceの呼び出しを行った後、同じカイロAPI呼び出しは空白.PNGを作成します次のようにBlank PNG created with Cairo API when it should contain a black square

IDirect3D9 :: CreateDeviceの呼び出しがパラメータ化されています

オブジェクトパラメータは、以下のメンバ変数を含んでい
Direct3DCreate9(D3D_SDK_VERSION)->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, WindowHandle, D3DCREATE_HARDWARE_VERTEXPROCESSING, &PresentParameters, &PDevice); 

WindowHandle 0x001b07f8 {unused=13111204 } HWND__ * 
    unused 13111204 int 

PresentParameters {BackBufferWidth=0 BackBufferHeight=0 BackBufferFormat=D3DFMT_UNKNOWN (0) ...} _D3DPRESENT_PARAMETERS_ 
     BackBufferWidth 0 unsigned int 
     BackBufferHeight 0 unsigned int 
     BackBufferFormat D3DFMT_UNKNOWN (0) _D3DFORMAT 
     BackBufferCount 1 unsigned int 
     MultiSampleType D3DMULTISAMPLE_NONE (0) _D3DMULTISAMPLE_TYPE 
     MultiSampleQuality 0 unsigned long 
     SwapEffect D3DSWAPEFFECT_DISCARD (1) _D3DSWAPEFFECT 
+  hDeviceWindow 0x001b07f8 {unused=13111204 } HWND__ * 
     Windowed 1 int 
     EnableAutoDepthStencil 0 int 
     AutoDepthStencilFormat D3DFMT_UNKNOWN (0) _D3DFORMAT 
     Flags 1 unsigned long 
     FullScreen_RefreshRateInHz 0 unsigned int 
     PresentationInterval 0 unsigned int 

PDevice 0x00000000 <NULL> IDirect3DDevice9 * 
+  IUnknown <struct at NULL> IUnknown 

質問です:

  • どのようにコードエラーなしでコンパイルし、実行時にエラーステータスを返しませんが、Cairo API呼び出しの動作は大きく異なりますか?
  • これを防ぐためにIDirect3D9 :: CreateDevice呼び出しをパラメータ化する方法がありますか、それ以降の関数呼び出しでCairo APIの予想される動作を回復する方法はありますか?
+0

特に、従来のDirect3D 9 APIを使用する必要があるのはなぜですか? [MSDN](https://msdn.microsoft.com/en-us/library/windows/desktop/ee663275.aspx)と[この記事](https://blogs.msdn.microsoft.com/)を必ず参照してください。 chuckw/2012/11/26/visual-studio-2012-update-1 /)wrt従来のDirectX SDKに転送します。 –

+0

@ChuckWalbourn使用されているプラ​​ットフォームツールセットはv140_xp(VS 2015)です。レガシーD3D9 APIは、Windows XPオペレーティングシステムを実行するクライアントをターゲットにするために、このプロジェクトで常に使用されています。 上記のAPI間に既知の非互換性はありますか? – Jeff

+0

@ChuckWalbournコードベースで多数のD3DX呼び出しが行われるため、スタンドアロンライブラリが使用されています。 "DirectX SDKはどこですか?"(https://msdn.microsoft.com/en-us/library/windows/desktop/ee663275) .aspx) – Jeff

答えて

0

この現象は、Direct3D 9 API(DirectX SDK 2009年3月)とCairo Graphics API(1.10.2)の間に互換性がないために発生します。

のDirect3D 9デバイスを作成するFPU to single-precision modeを変化させる方法2006-10-16詳細から次のメーリングリストのスレッド、およびその色計算を行う際にカイロAPIのこのバージョンは、精度の高いレベルを想定する:

http://cairo.cairographics.narkive.com/L9XYWFkQ/cairo-direct3d-interaction-bug-and-fix-x86-fpu-precision

このバグの修正がすぐに導入されました:

https://bugs.freedesktop.org/show_bug.cgi?id=7497

カイロv1.10.2向けは、2010年12月25日にリリースされたWHI chはこのフィックスを4年後に更新しますが、誤った動作はまだ存在します。バグの証拠はHexChatプロジェクトからダウンロードすることができるカイロv1.14.6、ではありませんよう

ただし、この修正は、いくつかの点で、カイロのコードベースにそれを作っている必要があります。

https://github.com/hexchat/gtk-win32

NBこのプロジェクトのディストリビューションのライブラリはWindows XPと互換性がありません。 Windows XPをターゲットにしている場合は、バイナリの独自のバージョンをビルドする必要があります。

カイロのバグに関するオリジナルのスレッドを見つけるためにサーチフを使用した謎の友人に大変感謝します。

+0

GTKとcairoのような依存関係は、MSYS2プロジェクトを通じてWindows用に提供されています。あなたはカイロ1.15.4(2016-12-08にリリースされています)があります:http://repo.msys2.org/mingw/x86_64/ – liberforce

関連する問題