| /* |
| * Implementation of IDirect3DRMViewport Interface |
| * |
| * Copyright 2012 André Hentschel |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library 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 |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #include "config.h" |
| #include "wine/port.h" |
| |
| #include "d3drm_private.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(d3drm); |
| |
| static inline struct d3drm_viewport *impl_from_IDirect3DRMViewport(IDirect3DRMViewport *iface) |
| { |
| return CONTAINING_RECORD(iface, struct d3drm_viewport, IDirect3DRMViewport_iface); |
| } |
| |
| static inline struct d3drm_viewport *impl_from_IDirect3DRMViewport2(IDirect3DRMViewport2 *iface) |
| { |
| return CONTAINING_RECORD(iface, struct d3drm_viewport, IDirect3DRMViewport2_iface); |
| } |
| |
| static inline void d3drm_normalize_d3d_color(D3DCOLORVALUE *color_value, D3DCOLOR color) |
| { |
| color_value->u1.r = RGBA_GETRED(color) / 255.0f; |
| color_value->u2.g = RGBA_GETGREEN(color) / 255.0f; |
| color_value->u3.b = RGBA_GETBLUE(color) / 255.0f; |
| color_value->u4.a = RGBA_GETALPHA(color) / 255.0f; |
| } |
| |
| static HRESULT d3drm_update_background_material(struct d3drm_viewport *viewport) |
| { |
| IDirect3DRMFrame *root_frame; |
| D3DCOLOR color; |
| D3DMATERIAL mat; |
| HRESULT hr; |
| |
| if (FAILED(hr = IDirect3DRMFrame_GetScene(viewport->camera, &root_frame))) |
| return hr; |
| color = IDirect3DRMFrame_GetSceneBackground(root_frame); |
| |
| memset(&mat, 0, sizeof(mat)); |
| mat.dwSize = sizeof(mat); |
| d3drm_normalize_d3d_color(&mat.u.diffuse, color); |
| |
| return IDirect3DMaterial_SetMaterial(viewport->material, &mat); |
| } |
| |
| static void d3drm_viewport_destroy(struct d3drm_viewport *viewport) |
| { |
| TRACE("viewport %p releasing attached interfaces.\n", viewport); |
| |
| d3drm_object_cleanup((IDirect3DRMObject *)&viewport->IDirect3DRMViewport_iface, &viewport->obj); |
| |
| if (viewport->d3d_viewport) |
| { |
| IDirect3DViewport_Release(viewport->d3d_viewport); |
| IDirect3DMaterial_Release(viewport->material); |
| IDirect3DRMFrame_Release(viewport->camera); |
| IDirect3DRM_Release(viewport->d3drm); |
| } |
| |
| HeapFree(GetProcessHeap(), 0, viewport); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_QueryInterface(IDirect3DRMViewport2 *iface, REFIID riid, void **out) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); |
| |
| if (IsEqualGUID(riid, &IID_IDirect3DRMViewport) |
| || IsEqualGUID(riid, &IID_IDirect3DRMObject) |
| || IsEqualGUID(riid, &IID_IUnknown)) |
| { |
| *out = &viewport->IDirect3DRMViewport_iface; |
| } |
| else if (IsEqualGUID(riid, &IID_IDirect3DRMViewport2)) |
| { |
| *out = &viewport->IDirect3DRMViewport2_iface; |
| } |
| else |
| { |
| *out = NULL; |
| WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid)); |
| return CLASS_E_CLASSNOTAVAILABLE; |
| } |
| |
| IUnknown_AddRef((IUnknown *)*out); |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_QueryInterface(IDirect3DRMViewport *iface, REFIID riid, void **out) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); |
| |
| return d3drm_viewport2_QueryInterface(&viewport->IDirect3DRMViewport2_iface, riid, out); |
| } |
| |
| static ULONG WINAPI d3drm_viewport2_AddRef(IDirect3DRMViewport2 *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| ULONG refcount = InterlockedIncrement(&viewport->obj.ref); |
| |
| TRACE("%p increasing refcount to %u.\n", iface, refcount); |
| |
| return refcount; |
| } |
| |
| static ULONG WINAPI d3drm_viewport1_AddRef(IDirect3DRMViewport *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return d3drm_viewport2_AddRef(&viewport->IDirect3DRMViewport2_iface); |
| } |
| |
| static ULONG WINAPI d3drm_viewport2_Release(IDirect3DRMViewport2 *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| ULONG refcount = InterlockedDecrement(&viewport->obj.ref); |
| |
| TRACE("%p decreasing refcount to %u.\n", iface, refcount); |
| |
| if (!refcount) |
| d3drm_viewport_destroy(viewport); |
| |
| return refcount; |
| } |
| |
| static ULONG WINAPI d3drm_viewport1_Release(IDirect3DRMViewport *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return d3drm_viewport2_Release(&viewport->IDirect3DRMViewport2_iface); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_Clone(IDirect3DRMViewport2 *iface, |
| IUnknown *outer, REFIID iid, void **out) |
| { |
| FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_Clone(IDirect3DRMViewport *iface, |
| IUnknown *outer, REFIID iid, void **out) |
| { |
| FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_AddDestroyCallback(IDirect3DRMViewport2 *iface, |
| D3DRMOBJECTCALLBACK cb, void *ctx) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx); |
| |
| return d3drm_object_add_destroy_callback(&viewport->obj, cb, ctx); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_AddDestroyCallback(IDirect3DRMViewport *iface, |
| D3DRMOBJECTCALLBACK cb, void *ctx) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx); |
| |
| return d3drm_viewport2_AddDestroyCallback(&viewport->IDirect3DRMViewport2_iface, cb, ctx); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_DeleteDestroyCallback(IDirect3DRMViewport2 *iface, |
| D3DRMOBJECTCALLBACK cb, void *ctx) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx); |
| |
| return d3drm_object_delete_destroy_callback(&viewport->obj, cb, ctx); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_DeleteDestroyCallback(IDirect3DRMViewport *iface, |
| D3DRMOBJECTCALLBACK cb, void *ctx) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx); |
| |
| return d3drm_viewport2_DeleteDestroyCallback(&viewport->IDirect3DRMViewport2_iface, cb, ctx); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_SetAppData(IDirect3DRMViewport2 *iface, DWORD data) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, data %#x\n", iface, data); |
| |
| viewport->obj.appdata = data; |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_SetAppData(IDirect3DRMViewport *iface, DWORD data) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, data %#x\n", iface, data); |
| |
| return d3drm_viewport2_SetAppData(&viewport->IDirect3DRMViewport2_iface, data); |
| } |
| |
| static DWORD WINAPI d3drm_viewport2_GetAppData(IDirect3DRMViewport2 *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p\n", iface); |
| |
| return viewport->obj.appdata; |
| } |
| |
| static DWORD WINAPI d3drm_viewport1_GetAppData(IDirect3DRMViewport *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return d3drm_viewport2_GetAppData(&viewport->IDirect3DRMViewport2_iface); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_SetName(IDirect3DRMViewport2 *iface, const char *name) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, name %s.\n", iface, debugstr_a(name)); |
| |
| return d3drm_object_set_name(&viewport->obj, name); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_SetName(IDirect3DRMViewport *iface, const char *name) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, name %s.\n", iface, debugstr_a(name)); |
| |
| return d3drm_viewport2_SetName(&viewport->IDirect3DRMViewport2_iface, name); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_GetName(IDirect3DRMViewport2 *iface, DWORD *size, char *name) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, size %p, name %p.\n", iface, size, name); |
| |
| return d3drm_object_get_name(&viewport->obj, size, name); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_GetName(IDirect3DRMViewport *iface, DWORD *size, char *name) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, size %p, name %p.\n", iface, size, name); |
| |
| return d3drm_viewport2_GetName(&viewport->IDirect3DRMViewport2_iface, size, name); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_GetClassName(IDirect3DRMViewport2 *iface, DWORD *size, char *name) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, size %p, name %p.\n", iface, size, name); |
| |
| return d3drm_object_get_class_name(&viewport->obj, size, name); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_GetClassName(IDirect3DRMViewport *iface, DWORD *size, char *name) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, size %p, name %p.\n", iface, size, name); |
| |
| return d3drm_viewport2_GetClassName(&viewport->IDirect3DRMViewport2_iface, size, name); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_Init(IDirect3DRMViewport2 *iface, IDirect3DRMDevice3 *device, |
| IDirect3DRMFrame3 *camera, DWORD x, DWORD y, DWORD width, DWORD height) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| struct d3drm_device *device_obj = unsafe_impl_from_IDirect3DRMDevice3(device); |
| D3DVIEWPORT vp; |
| D3DVALUE scale; |
| IDirect3D *d3d1 = NULL; |
| IDirect3DDevice *d3d_device = NULL; |
| IDirect3DMaterial *material = NULL; |
| D3DMATERIALHANDLE hmat; |
| HRESULT hr = D3DRM_OK; |
| |
| TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u.\n", |
| iface, device, camera, x, y, width, height); |
| |
| if (!device_obj || !camera |
| || width > device_obj->width |
| || height > device_obj->height) |
| { |
| return D3DRMERR_BADOBJECT; |
| } |
| |
| if (viewport->d3d_viewport) |
| return D3DRMERR_BADOBJECT; |
| |
| IDirect3DRM_AddRef(viewport->d3drm); |
| |
| if (FAILED(hr = IDirect3DRMDevice3_GetDirect3DDevice(device, &d3d_device))) |
| goto cleanup; |
| |
| if (FAILED(hr = IDirect3DDevice_GetDirect3D(d3d_device, &d3d1))) |
| goto cleanup; |
| |
| if (FAILED(hr = IDirect3D_CreateViewport(d3d1, &viewport->d3d_viewport, NULL))) |
| goto cleanup; |
| |
| vp.dwSize = sizeof(vp); |
| vp.dwWidth = width; |
| vp.dwHeight = height; |
| vp.dwX = x; |
| vp.dwY = y; |
| scale = width > height ? (float)width / 2.0f : (float)height / 2.0f; |
| vp.dvScaleX = scale; |
| vp.dvScaleY = scale; |
| vp.dvMaxX = vp.dwWidth / (2.0f * vp.dvScaleX); |
| vp.dvMaxY = vp.dwHeight / (2.0f * vp.dvScaleY); |
| vp.dvMinZ = 0.0f; |
| vp.dvMaxZ = 1.0f; |
| |
| if (FAILED(hr = IDirect3DViewport_SetViewport(viewport->d3d_viewport, &vp))) |
| goto cleanup; |
| |
| if (FAILED(hr = IDirect3DDevice_AddViewport(d3d_device, viewport->d3d_viewport))) |
| goto cleanup; |
| |
| if (FAILED(hr = IDirect3DRMFrame3_QueryInterface(camera, &IID_IDirect3DRMFrame, (void **)&viewport->camera))) |
| goto cleanup; |
| |
| if (FAILED(hr = IDirect3D_CreateMaterial(d3d1, &material, NULL))) |
| goto cleanup; |
| |
| if (FAILED(hr = IDirect3DMaterial_GetHandle(material, d3d_device, &hmat))) |
| goto cleanup; |
| |
| hr = IDirect3DViewport_SetBackground(viewport->d3d_viewport, hmat); |
| viewport->material = material; |
| viewport->device = device_obj; |
| |
| cleanup: |
| |
| if (FAILED(hr)) |
| { |
| if (viewport->d3d_viewport) |
| { |
| IDirect3DViewport_Release(viewport->d3d_viewport); |
| viewport->d3d_viewport = NULL; |
| } |
| if (viewport->camera) |
| IDirect3DRMFrame_Release(viewport->camera); |
| if (material) |
| IDirect3DMaterial_Release(material); |
| IDirect3DRM_Release(viewport->d3drm); |
| } |
| if (d3d_device) |
| IDirect3DDevice_Release(d3d_device); |
| if (d3d1) |
| IDirect3D_Release(d3d1); |
| |
| return hr; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_Init(IDirect3DRMViewport *iface, IDirect3DRMDevice *device, |
| IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| struct d3drm_frame *frame = unsafe_impl_from_IDirect3DRMFrame(camera); |
| IDirect3DRMDevice3 *device3; |
| HRESULT hr; |
| |
| TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u.\n", |
| iface, device, camera, x, y, width, height); |
| |
| if (!device || !frame) |
| return D3DRMERR_BADOBJECT; |
| |
| if (FAILED(hr = IDirect3DRMDevice_QueryInterface(device, &IID_IDirect3DRMDevice3, (void **)&device3))) |
| return hr; |
| |
| hr = d3drm_viewport2_Init(&viewport->IDirect3DRMViewport2_iface, device3, &frame->IDirect3DRMFrame3_iface, |
| x, y, width, height); |
| IDirect3DRMDevice3_Release(device3); |
| |
| return hr; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_Clear(IDirect3DRMViewport2 *iface, DWORD flags) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| DDSCAPS caps = { DDSCAPS_ZBUFFER }; |
| HRESULT hr; |
| D3DRECT clear_rect; |
| IDirectDrawSurface *ds; |
| DWORD clear_flags = 0; |
| |
| TRACE("iface %p, flags %#x.\n", iface, flags); |
| |
| clear_rect.u1.x1 = clear_rect.u2.y1 = 0; |
| clear_rect.u3.x2 = viewport->device->width; |
| clear_rect.u4.y2 = viewport->device->height; |
| |
| if (flags & D3DRMCLEAR_TARGET) |
| { |
| clear_flags |= D3DCLEAR_TARGET; |
| d3drm_update_background_material(viewport); |
| } |
| if (flags & D3DRMCLEAR_ZBUFFER) |
| { |
| hr = IDirectDrawSurface_GetAttachedSurface(viewport->device->render_target, &caps, &ds); |
| if (SUCCEEDED(hr)) |
| { |
| clear_flags |= D3DCLEAR_ZBUFFER; |
| IDirectDrawSurface_Release(ds); |
| } |
| } |
| if (flags & D3DRMCLEAR_DIRTYRECTS) |
| FIXME("Flag D3DRMCLEAR_DIRTYRECT not implemented yet.\n"); |
| |
| if (FAILED(hr = IDirect3DViewport_Clear(viewport->d3d_viewport, 1, &clear_rect, clear_flags))) |
| return hr; |
| |
| return D3DRM_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_Clear(IDirect3DRMViewport *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return d3drm_viewport2_Clear(&viewport->IDirect3DRMViewport2_iface, D3DRMCLEAR_ALL); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_Render(IDirect3DRMViewport2 *iface, IDirect3DRMFrame3 *frame) |
| { |
| FIXME("iface %p, frame %p stub!\n", iface, frame); |
| |
| return D3DRM_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_Render(IDirect3DRMViewport *iface, IDirect3DRMFrame *frame) |
| { |
| FIXME("iface %p, frame %p stub!\n", iface, frame); |
| |
| return D3DRM_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_SetFront(IDirect3DRMViewport2 *iface, D3DVALUE front) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, front %.8e.\n", iface, front); |
| |
| viewport->front = front; |
| |
| return D3DRM_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_SetFront(IDirect3DRMViewport *iface, D3DVALUE front) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, front %.8e.\n", iface, front); |
| |
| return d3drm_viewport2_SetFront(&viewport->IDirect3DRMViewport2_iface, front); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_SetBack(IDirect3DRMViewport2 *iface, D3DVALUE back) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, back %.8e.\n", iface, back); |
| |
| viewport->back = back; |
| |
| return D3DRM_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_SetBack(IDirect3DRMViewport *iface, D3DVALUE back) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, back %.8e.\n", iface, back); |
| |
| return d3drm_viewport2_SetBack(&viewport->IDirect3DRMViewport2_iface, back); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_SetField(IDirect3DRMViewport2 *iface, D3DVALUE field) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, field %.8e.\n", iface, field); |
| |
| viewport->field = field; |
| |
| return D3DRM_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_SetField(IDirect3DRMViewport *iface, D3DVALUE field) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, field %.8e.\n", iface, field); |
| |
| return d3drm_viewport2_SetField(&viewport->IDirect3DRMViewport2_iface, field); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_SetUniformScaling(IDirect3DRMViewport2 *iface, BOOL b) |
| { |
| FIXME("iface %p, b %#x stub!\n", iface, b); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_SetUniformScaling(IDirect3DRMViewport *iface, BOOL b) |
| { |
| FIXME("iface %p, b %#x stub!\n", iface, b); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_SetCamera(IDirect3DRMViewport2 *iface, IDirect3DRMFrame3 *camera) |
| { |
| FIXME("iface %p, camera %p stub!\n", iface, camera); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_SetCamera(IDirect3DRMViewport *iface, IDirect3DRMFrame *camera) |
| { |
| FIXME("iface %p, camera %p stub!\n", iface, camera); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_SetProjection(IDirect3DRMViewport2 *iface, D3DRMPROJECTIONTYPE type) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, type %#x.\n", iface, type); |
| |
| viewport->projection = type; |
| |
| return D3DRM_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_SetProjection(IDirect3DRMViewport *iface, D3DRMPROJECTIONTYPE type) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, type %#x.\n", iface, type); |
| |
| return d3drm_viewport2_SetProjection(&viewport->IDirect3DRMViewport2_iface, type); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_Transform(IDirect3DRMViewport2 *iface, D3DRMVECTOR4D *d, D3DVECTOR *s) |
| { |
| FIXME("iface %p, d %p, s %p stub!\n", iface, d, s); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_Transform(IDirect3DRMViewport *iface, D3DRMVECTOR4D *d, D3DVECTOR *s) |
| { |
| FIXME("iface %p, d %p, s %p stub!\n", iface, d, s); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_InverseTransform(IDirect3DRMViewport2 *iface, D3DVECTOR *d, D3DRMVECTOR4D *s) |
| { |
| FIXME("iface %p, d %p, s %p stub!\n", iface, d, s); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_InverseTransform(IDirect3DRMViewport *iface, D3DVECTOR *d, D3DRMVECTOR4D *s) |
| { |
| FIXME("iface %p, d %p, s %p stub!\n", iface, d, s); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_Configure(IDirect3DRMViewport2 *iface, |
| LONG x, LONG y, DWORD width, DWORD height) |
| { |
| FIXME("iface %p, x %d, y %d, width %u, height %u stub!\n", iface, x, y, width, height); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_Configure(IDirect3DRMViewport *iface, |
| LONG x, LONG y, DWORD width, DWORD height) |
| { |
| FIXME("iface %p, x %d, y %d, width %u, height %u stub!\n", iface, x, y, width, height); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_ForceUpdate(IDirect3DRMViewport2* iface, |
| DWORD x1, DWORD y1, DWORD x2, DWORD y2) |
| { |
| FIXME("iface %p, x1 %u, y1 %u, x2 %u, y2 %u stub!\n", iface, x1, y1, x2, y2); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_ForceUpdate(IDirect3DRMViewport *iface, |
| DWORD x1, DWORD y1, DWORD x2, DWORD y2) |
| { |
| FIXME("iface %p, x1 %u, y1 %u, x2 %u, y2 %u stub!\n", iface, x1, y1, x2, y2); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_SetPlane(IDirect3DRMViewport2 *iface, |
| D3DVALUE left, D3DVALUE right, D3DVALUE bottom, D3DVALUE top) |
| { |
| FIXME("iface %p, left %.8e, right %.8e, bottom %.8e, top %.8e stub!\n", |
| iface, left, right, bottom, top); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_SetPlane(IDirect3DRMViewport *iface, |
| D3DVALUE left, D3DVALUE right, D3DVALUE bottom, D3DVALUE top) |
| { |
| FIXME("iface %p, left %.8e, right %.8e, bottom %.8e, top %.8e stub!\n", |
| iface, left, right, bottom, top); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_GetCamera(IDirect3DRMViewport2 *iface, IDirect3DRMFrame3 **camera) |
| { |
| FIXME("iface %p, camera %p stub!\n", iface, camera); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_GetCamera(IDirect3DRMViewport *iface, IDirect3DRMFrame **camera) |
| { |
| FIXME("iface %p, camera %p stub!\n", iface, camera); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_GetDevice(IDirect3DRMViewport2 *iface, IDirect3DRMDevice3 **device) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, device %p.\n", iface, device); |
| |
| if (!viewport->device) |
| return D3DRMERR_BADOBJECT; |
| |
| *device = &viewport->device->IDirect3DRMDevice3_iface; |
| IDirect3DRMDevice3_AddRef(*device); |
| |
| return D3DRM_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_GetDevice(IDirect3DRMViewport *iface, IDirect3DRMDevice **device) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, device %p.\n\n", iface, device); |
| |
| if (!viewport->device) |
| return D3DRMERR_BADOBJECT; |
| |
| *device = &viewport->device->IDirect3DRMDevice_iface; |
| IDirect3DRMDevice_AddRef(*device); |
| |
| return D3DRM_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_GetPlane(IDirect3DRMViewport2 *iface, |
| D3DVALUE *left, D3DVALUE *right, D3DVALUE *bottom, D3DVALUE *top) |
| { |
| FIXME("iface %p, left %p, right %p, bottom %p, top %p stub!\n", |
| iface, left, right, bottom, top); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_GetPlane(IDirect3DRMViewport *iface, |
| D3DVALUE *left, D3DVALUE *right, D3DVALUE *bottom, D3DVALUE *top) |
| { |
| FIXME("iface %p, left %p, right %p, bottom %p, top %p stub!\n", |
| iface, left, right, bottom, top); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_Pick(IDirect3DRMViewport2 *iface, |
| LONG x, LONG y, IDirect3DRMPickedArray **visuals) |
| { |
| FIXME("iface %p, x %d, y %d, visuals %p stub!\n", iface, x, y, visuals); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_Pick(IDirect3DRMViewport *iface, |
| LONG x, LONG y, IDirect3DRMPickedArray **visuals) |
| { |
| FIXME("iface %p, x %d, y %d, visuals %p stub!\n", iface, x, y, visuals); |
| |
| return E_NOTIMPL; |
| } |
| |
| static BOOL WINAPI d3drm_viewport2_GetUniformScaling(IDirect3DRMViewport2 *iface) |
| { |
| FIXME("iface %p stub!\n", iface); |
| |
| return FALSE; |
| } |
| |
| static BOOL WINAPI d3drm_viewport1_GetUniformScaling(IDirect3DRMViewport *iface) |
| { |
| FIXME("iface %p stub!\n", iface); |
| |
| return FALSE; |
| } |
| |
| static LONG WINAPI d3drm_viewport2_GetX(IDirect3DRMViewport2 *iface) |
| { |
| FIXME("iface %p stub!\n", iface); |
| |
| return E_NOTIMPL; |
| } |
| |
| static LONG WINAPI d3drm_viewport1_GetX(IDirect3DRMViewport *iface) |
| { |
| FIXME("iface %p stub!\n", iface); |
| |
| return E_NOTIMPL; |
| } |
| |
| static LONG WINAPI d3drm_viewport2_GetY(IDirect3DRMViewport2 *iface) |
| { |
| FIXME("iface %p stub!\n", iface); |
| |
| return E_NOTIMPL; |
| } |
| |
| static LONG WINAPI d3drm_viewport1_GetY(IDirect3DRMViewport *iface) |
| { |
| FIXME("iface %p stub!\n", iface); |
| |
| return E_NOTIMPL; |
| } |
| |
| static DWORD WINAPI d3drm_viewport2_GetWidth(IDirect3DRMViewport2 *iface) |
| { |
| FIXME("iface %p stub!\n", iface); |
| |
| return E_NOTIMPL; |
| } |
| |
| static DWORD WINAPI d3drm_viewport1_GetWidth(IDirect3DRMViewport *iface) |
| { |
| FIXME("iface %p stub!\n", iface); |
| |
| return E_NOTIMPL; |
| } |
| |
| static DWORD WINAPI d3drm_viewport2_GetHeight(IDirect3DRMViewport2 *iface) |
| { |
| FIXME("iface %p stub!\n", iface); |
| |
| return E_NOTIMPL; |
| } |
| |
| static DWORD WINAPI d3drm_viewport1_GetHeight(IDirect3DRMViewport *iface) |
| { |
| FIXME("iface %p stub!\n", iface); |
| |
| return E_NOTIMPL; |
| } |
| |
| static D3DVALUE WINAPI d3drm_viewport2_GetField(IDirect3DRMViewport2 *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return viewport->field; |
| } |
| |
| static D3DVALUE WINAPI d3drm_viewport1_GetField(IDirect3DRMViewport *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return d3drm_viewport2_GetField(&viewport->IDirect3DRMViewport2_iface); |
| } |
| |
| static D3DVALUE WINAPI d3drm_viewport2_GetBack(IDirect3DRMViewport2 *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return viewport->back; |
| } |
| |
| static D3DVALUE WINAPI d3drm_viewport1_GetBack(IDirect3DRMViewport *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return d3drm_viewport2_GetBack(&viewport->IDirect3DRMViewport2_iface); |
| } |
| |
| static D3DVALUE WINAPI d3drm_viewport2_GetFront(IDirect3DRMViewport2 *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return viewport->front; |
| } |
| |
| static D3DVALUE WINAPI d3drm_viewport1_GetFront(IDirect3DRMViewport *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return d3drm_viewport2_GetFront(&viewport->IDirect3DRMViewport2_iface); |
| } |
| |
| static D3DRMPROJECTIONTYPE WINAPI d3drm_viewport2_GetProjection(IDirect3DRMViewport2 *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return viewport->projection; |
| } |
| |
| static D3DRMPROJECTIONTYPE WINAPI d3drm_viewport1_GetProjection(IDirect3DRMViewport *iface) |
| { |
| struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p.\n", iface); |
| |
| return d3drm_viewport2_GetProjection(&viewport->IDirect3DRMViewport2_iface); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_GetDirect3DViewport(IDirect3DRMViewport2 *iface, |
| IDirect3DViewport **viewport) |
| { |
| struct d3drm_viewport *viewport_object = impl_from_IDirect3DRMViewport2(iface); |
| |
| TRACE("iface %p, viewport %p.\n", iface, viewport); |
| |
| if (!viewport_object->d3d_viewport) |
| return D3DRMERR_BADOBJECT; |
| |
| *viewport = viewport_object->d3d_viewport; |
| IDirect3DViewport_AddRef(*viewport); |
| |
| return D3DRM_OK; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport1_GetDirect3DViewport(IDirect3DRMViewport *iface, |
| IDirect3DViewport **viewport) |
| { |
| struct d3drm_viewport *viewport_object = impl_from_IDirect3DRMViewport(iface); |
| |
| TRACE("iface %p, viewport %p.\n", iface, viewport); |
| |
| return d3drm_viewport2_GetDirect3DViewport(&viewport_object->IDirect3DRMViewport2_iface, viewport); |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_TransformVectors(IDirect3DRMViewport2 *iface, |
| DWORD vector_count, D3DRMVECTOR4D *dst, D3DVECTOR *src) |
| { |
| FIXME("iface %p, vector_count %u, dst %p, src %p stub!\n", iface, vector_count, dst, src); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI d3drm_viewport2_InverseTransformVectors(IDirect3DRMViewport2 *iface, |
| DWORD vector_count, D3DVECTOR *dst, D3DRMVECTOR4D *src) |
| { |
| FIXME("iface %p, vector_count %u, dst %p, src %p stub!\n", iface, vector_count, dst, src); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const struct IDirect3DRMViewport2Vtbl d3drm_viewport2_vtbl = |
| { |
| d3drm_viewport2_QueryInterface, |
| d3drm_viewport2_AddRef, |
| d3drm_viewport2_Release, |
| d3drm_viewport2_Clone, |
| d3drm_viewport2_AddDestroyCallback, |
| d3drm_viewport2_DeleteDestroyCallback, |
| d3drm_viewport2_SetAppData, |
| d3drm_viewport2_GetAppData, |
| d3drm_viewport2_SetName, |
| d3drm_viewport2_GetName, |
| d3drm_viewport2_GetClassName, |
| d3drm_viewport2_Init, |
| d3drm_viewport2_Clear, |
| d3drm_viewport2_Render, |
| d3drm_viewport2_SetFront, |
| d3drm_viewport2_SetBack, |
| d3drm_viewport2_SetField, |
| d3drm_viewport2_SetUniformScaling, |
| d3drm_viewport2_SetCamera, |
| d3drm_viewport2_SetProjection, |
| d3drm_viewport2_Transform, |
| d3drm_viewport2_InverseTransform, |
| d3drm_viewport2_Configure, |
| d3drm_viewport2_ForceUpdate, |
| d3drm_viewport2_SetPlane, |
| d3drm_viewport2_GetCamera, |
| d3drm_viewport2_GetDevice, |
| d3drm_viewport2_GetPlane, |
| d3drm_viewport2_Pick, |
| d3drm_viewport2_GetUniformScaling, |
| d3drm_viewport2_GetX, |
| d3drm_viewport2_GetY, |
| d3drm_viewport2_GetWidth, |
| d3drm_viewport2_GetHeight, |
| d3drm_viewport2_GetField, |
| d3drm_viewport2_GetBack, |
| d3drm_viewport2_GetFront, |
| d3drm_viewport2_GetProjection, |
| d3drm_viewport2_GetDirect3DViewport, |
| d3drm_viewport2_TransformVectors, |
| d3drm_viewport2_InverseTransformVectors, |
| }; |
| |
| static const struct IDirect3DRMViewportVtbl d3drm_viewport1_vtbl = |
| { |
| d3drm_viewport1_QueryInterface, |
| d3drm_viewport1_AddRef, |
| d3drm_viewport1_Release, |
| d3drm_viewport1_Clone, |
| d3drm_viewport1_AddDestroyCallback, |
| d3drm_viewport1_DeleteDestroyCallback, |
| d3drm_viewport1_SetAppData, |
| d3drm_viewport1_GetAppData, |
| d3drm_viewport1_SetName, |
| d3drm_viewport1_GetName, |
| d3drm_viewport1_GetClassName, |
| d3drm_viewport1_Init, |
| d3drm_viewport1_Clear, |
| d3drm_viewport1_Render, |
| d3drm_viewport1_SetFront, |
| d3drm_viewport1_SetBack, |
| d3drm_viewport1_SetField, |
| d3drm_viewport1_SetUniformScaling, |
| d3drm_viewport1_SetCamera, |
| d3drm_viewport1_SetProjection, |
| d3drm_viewport1_Transform, |
| d3drm_viewport1_InverseTransform, |
| d3drm_viewport1_Configure, |
| d3drm_viewport1_ForceUpdate, |
| d3drm_viewport1_SetPlane, |
| d3drm_viewport1_GetCamera, |
| d3drm_viewport1_GetDevice, |
| d3drm_viewport1_GetPlane, |
| d3drm_viewport1_Pick, |
| d3drm_viewport1_GetUniformScaling, |
| d3drm_viewport1_GetX, |
| d3drm_viewport1_GetY, |
| d3drm_viewport1_GetWidth, |
| d3drm_viewport1_GetHeight, |
| d3drm_viewport1_GetField, |
| d3drm_viewport1_GetBack, |
| d3drm_viewport1_GetFront, |
| d3drm_viewport1_GetProjection, |
| d3drm_viewport1_GetDirect3DViewport, |
| }; |
| |
| HRESULT d3drm_viewport_create(struct d3drm_viewport **viewport, IDirect3DRM *d3drm) |
| { |
| static const char classname[] = "Viewport"; |
| struct d3drm_viewport *object; |
| |
| TRACE("viewport %p, d3drm %p.\n", viewport, d3drm); |
| |
| if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) |
| return E_OUTOFMEMORY; |
| |
| object->IDirect3DRMViewport_iface.lpVtbl = &d3drm_viewport1_vtbl; |
| object->IDirect3DRMViewport2_iface.lpVtbl = &d3drm_viewport2_vtbl; |
| object->d3drm = d3drm; |
| d3drm_object_init(&object->obj, classname); |
| |
| *viewport = object; |
| |
| return S_OK; |
| } |