2017-02-01 14 views
0

Direct3D 9 API (DirectX SDK 2009 년 3 월)를 사용하면서 Cairo Graphics API (GTK + 2.24.10 번들에 포함)를 호출해야합니다.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) 간의 비 호환성으로 발생합니다.

2006-10-16 세부 사항의 다음 메일 링리스트 스레드 (9) 장치가 FPU to single-precision mode을 변경하는 Direct3D를을 만드는 방법과 카이로 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를 대상으로한다면 바이너리 버전을 직접 빌드해야합니다.

카이로 버그와 관련된 원본 스레드를 찾기 위해 검색 fu를 사용했던 신비한 친구에게 감사드립니다.

+0

GTK 및 cairo와 같은 종속성은 MSYS2 프로젝트를 통해 Windows 용으로 제공됩니다. 다음 위치에서 카이로 1.15.4 (2016-12-08에 릴리스 됨)를 찾을 수 있습니다. http://repo.msys2.org/mingw/x86_64/ – liberforce