* IPicture handles IUnknown
*/
- const IPictureVtbl *lpvtbl1;
- const IDispatchVtbl *lpvtbl2;
- const IPersistStreamVtbl *lpvtbl3;
- const IConnectionPointContainerVtbl *lpvtbl4;
+ const IPictureVtbl *lpVtbl;
+ const IDispatchVtbl *lpvtblIDispatch;
+ const IPersistStreamVtbl *lpvtblIPersistStream;
+ const IConnectionPointContainerVtbl *lpvtblIConnectionPointContainer;
/* Object reference count */
LONG ref;
/*
* Macros to retrieve pointer to IUnknown (IPicture) from the other VTables.
*/
-#define ICOM_THIS_From_IDispatch(impl, name) \
- impl *This = (impl*)(((char*)name)-sizeof(void*));
-#define ICOM_THIS_From_IPersistStream(impl, name) \
- impl *This = (impl*)(((char*)name)-2*sizeof(void*));
-#define ICOM_THIS_From_IConnectionPointContainer(impl, name) \
- impl *This = (impl*)(((char*)name)-3*sizeof(void*));
+
+static inline OLEPictureImpl *impl_from_IDispatch( IDispatch *iface )
+{
+ return (OLEPictureImpl *)((char*)iface - FIELD_OFFSET(OLEPictureImpl, lpvtblIDispatch));
+}
+
+static inline OLEPictureImpl *impl_from_IPersistStream( IPersistStream *iface )
+{
+ return (OLEPictureImpl *)((char*)iface - FIELD_OFFSET(OLEPictureImpl, lpvtblIPersistStream));
+}
+
+static inline OLEPictureImpl *impl_from_IConnectionPointContainer( IConnectionPointContainer *iface )
+{
+ return (OLEPictureImpl *)((char*)iface - FIELD_OFFSET(OLEPictureImpl, lpvtblIConnectionPointContainer));
+}
/*
* Predeclare VTables. They get initialized at the end.
/*
* Initialize the virtual function table.
*/
- newObject->lpvtbl1 = &OLEPictureImpl_VTable;
- newObject->lpvtbl2 = &OLEPictureImpl_IDispatch_VTable;
- newObject->lpvtbl3 = &OLEPictureImpl_IPersistStream_VTable;
- newObject->lpvtbl4 = &OLEPictureImpl_IConnectionPointContainer_VTable;
+ newObject->lpVtbl = &OLEPictureImpl_VTable;
+ newObject->lpvtblIDispatch = &OLEPictureImpl_IDispatch_VTable;
+ newObject->lpvtblIPersistStream = &OLEPictureImpl_IPersistStream_VTable;
+ newObject->lpvtblIConnectionPointContainer = &OLEPictureImpl_IConnectionPointContainer_VTable;
CreateConnectionPoint((IUnknown*)newObject,&IID_IPropertyNotifySink,&newObject->pCP);
}
else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0)
{
- *ppvObject = (IDispatch*)&(This->lpvtbl2);
+ *ppvObject = (IDispatch*)&(This->lpvtblIDispatch);
}
else if (memcmp(&IID_IPictureDisp, riid, sizeof(IID_IPictureDisp)) == 0)
{
- *ppvObject = (IDispatch*)&(This->lpvtbl2);
+ *ppvObject = (IDispatch*)&(This->lpvtblIDispatch);
}
else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0)
{
- *ppvObject = (IPersistStream*)&(This->lpvtbl3);
+ *ppvObject = (IPersistStream*)&(This->lpvtblIPersistStream);
}
else if (memcmp(&IID_IConnectionPointContainer, riid, sizeof(IID_IConnectionPointContainer)) == 0)
{
- *ppvObject = (IConnectionPointContainer*)&(This->lpvtbl4);
+ *ppvObject = (IConnectionPointContainer*)&(This->lpvtblIConnectionPointContainer);
}
/*
* Check that we obtained an interface.
OLE_HANDLE *phandle)
{
OLEPictureImpl *This = (OLEPictureImpl *)iface;
- FIXME("(%p)->(%p): stub, return 0 palette.\n", This, phandle);
+ HRESULT hres;
+ TRACE("(%p)->(%p)\n", This, phandle);
- *phandle = 0;
- return S_OK;
+ if (!phandle)
+ return E_POINTER;
+
+ switch (This->desc.picType) {
+ case PICTYPE_UNINITIALIZED:
+ case PICTYPE_NONE:
+ *phandle = 0;
+ hres = S_FALSE;
+ break;
+ case PICTYPE_BITMAP:
+ *phandle = (OLE_HANDLE)This->desc.u.bmp.hpal;
+ hres = S_OK;
+ break;
+ case PICTYPE_ICON:
+ case PICTYPE_METAFILE:
+ case PICTYPE_ENHMETAFILE:
+ default:
+ FIXME("unimplemented for type %d. Returning 0 palette.\n",
+ This->desc.picType);
+ *phandle = 0;
+ hres = S_OK;
+ }
+
+ TRACE("returning 0x%08lx, palette handle %08x\n", hres, *phandle);
+ return hres;
}
/************************************************************************
static HRESULT WINAPI OLEPictureImpl_IConnectionPointContainer_QueryInterface(
IConnectionPointContainer* iface,
REFIID riid,
- VOID** ppvoid
-) {
- ICOM_THIS_From_IConnectionPointContainer(IPicture,iface);
+ VOID** ppvoid)
+{
+ OLEPictureImpl *This = impl_from_IConnectionPointContainer(iface);
- return IPicture_QueryInterface(This,riid,ppvoid);
+ return IPicture_QueryInterface((IPicture *)This,riid,ppvoid);
}
static ULONG WINAPI OLEPictureImpl_IConnectionPointContainer_AddRef(
IConnectionPointContainer* iface)
{
- ICOM_THIS_From_IConnectionPointContainer(IPicture, iface);
+ OLEPictureImpl *This = impl_from_IConnectionPointContainer(iface);
- return IPicture_AddRef(This);
+ return IPicture_AddRef((IPicture *)This);
}
static ULONG WINAPI OLEPictureImpl_IConnectionPointContainer_Release(
IConnectionPointContainer* iface)
{
- ICOM_THIS_From_IConnectionPointContainer(IPicture, iface);
+ OLEPictureImpl *This = impl_from_IConnectionPointContainer(iface);
- return IPicture_Release(This);
+ return IPicture_Release((IPicture *)This);
}
static HRESULT WINAPI OLEPictureImpl_EnumConnectionPoints(
IConnectionPointContainer* iface,
- IEnumConnectionPoints** ppEnum
-) {
- ICOM_THIS_From_IConnectionPointContainer(IPicture, iface);
+ IEnumConnectionPoints** ppEnum)
+{
+ OLEPictureImpl *This = impl_from_IConnectionPointContainer(iface);
FIXME("(%p,%p), stub!\n",This,ppEnum);
return E_NOTIMPL;
static HRESULT WINAPI OLEPictureImpl_FindConnectionPoint(
IConnectionPointContainer* iface,
REFIID riid,
- IConnectionPoint **ppCP
-) {
- ICOM_THIS_From_IConnectionPointContainer(OLEPictureImpl, iface);
+ IConnectionPoint **ppCP)
+{
+ OLEPictureImpl *This = impl_from_IConnectionPointContainer(iface);
TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppCP);
if (!ppCP)
return E_POINTER;
REFIID riid,
VOID** ppvoid)
{
- ICOM_THIS_From_IPersistStream(IPicture, iface);
+ OLEPictureImpl *This = impl_from_IPersistStream(iface);
- return IPicture_QueryInterface(This, riid, ppvoid);
+ return IPicture_QueryInterface((IPicture *)This, riid, ppvoid);
}
/************************************************************************
static ULONG WINAPI OLEPictureImpl_IPersistStream_AddRef(
IPersistStream* iface)
{
- ICOM_THIS_From_IPersistStream(IPicture, iface);
+ OLEPictureImpl *This = impl_from_IPersistStream(iface);
- return IPicture_AddRef(This);
+ return IPicture_AddRef((IPicture *)This);
}
/************************************************************************
static ULONG WINAPI OLEPictureImpl_IPersistStream_Release(
IPersistStream* iface)
{
- ICOM_THIS_From_IPersistStream(IPicture, iface);
+ OLEPictureImpl *This = impl_from_IPersistStream(iface);
- return IPicture_Release(This);
+ return IPicture_Release((IPicture *)This);
}
/************************************************************************
static HRESULT WINAPI OLEPictureImpl_GetClassID(
IPersistStream* iface,CLSID* pClassID)
{
- ICOM_THIS_From_IPersistStream(IPicture, iface);
+ OLEPictureImpl *This = impl_from_IPersistStream(iface);
FIXME("(%p),stub!\n",This);
return E_FAIL;
}
static HRESULT WINAPI OLEPictureImpl_IsDirty(
IPersistStream* iface)
{
- ICOM_THIS_From_IPersistStream(IPicture, iface);
+ OLEPictureImpl *This = impl_from_IPersistStream(iface);
FIXME("(%p),stub!\n",This);
return E_NOTIMPL;
}
DWORD header[2];
WORD magic;
STATSTG statstg;
- ICOM_THIS_From_IPersistStream(OLEPictureImpl, iface);
+ OLEPictureImpl *This = impl_from_IPersistStream(iface);
TRACE("(%p,%p)\n",This,pStm);
ULONG dummy;
int iSerializeResult = 0;
- ICOM_THIS_From_IPersistStream(OLEPictureImpl, iface);
+ OLEPictureImpl *This = impl_from_IPersistStream(iface);
switch (This->desc.picType) {
case PICTYPE_ICON:
static HRESULT WINAPI OLEPictureImpl_GetSizeMax(
IPersistStream* iface,ULARGE_INTEGER*pcbSize)
{
- ICOM_THIS_From_IPersistStream(IPicture, iface);
+ OLEPictureImpl *This = impl_from_IPersistStream(iface);
FIXME("(%p,%p),stub!\n",This,pcbSize);
return E_NOTIMPL;
}
REFIID riid,
VOID** ppvoid)
{
- ICOM_THIS_From_IDispatch(IPicture, iface);
+ OLEPictureImpl *This = impl_from_IDispatch(iface);
- return IPicture_QueryInterface(This, riid, ppvoid);
+ return IPicture_QueryInterface((IPicture *)This, riid, ppvoid);
}
/************************************************************************
static ULONG WINAPI OLEPictureImpl_IDispatch_AddRef(
IDispatch* iface)
{
- ICOM_THIS_From_IDispatch(IPicture, iface);
+ OLEPictureImpl *This = impl_from_IDispatch(iface);
- return IPicture_AddRef(This);
+ return IPicture_AddRef((IPicture *)This);
}
/************************************************************************
static ULONG WINAPI OLEPictureImpl_IDispatch_Release(
IDispatch* iface)
{
- ICOM_THIS_From_IDispatch(IPicture, iface);
+ OLEPictureImpl *This = impl_from_IDispatch(iface);
- return IPicture_Release(This);
+ return IPicture_Release((IPicture *)This);
}
/************************************************************************