Michael Stefaniuc : avifil32: Use an iface instead of a vtbl pointer in ITmpFileImpl.

Alexandre Julliard julliard at winehq.org
Thu Dec 23 11:28:03 CST 2010


Module: wine
Branch: master
Commit: 9b1a6a5d408aa272d0e4c8baf7015f2cce440896
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9b1a6a5d408aa272d0e4c8baf7015f2cce440896

Author: Michael Stefaniuc <mstefani at redhat.de>
Date:   Thu Dec 23 02:10:03 2010 +0100

avifil32: Use an iface instead of a vtbl pointer in ITmpFileImpl.

---

 dlls/avifil32/tmpfile.c |  169 ++++++++++++++++++++++------------------------
 1 files changed, 81 insertions(+), 88 deletions(-)

diff --git a/dlls/avifil32/tmpfile.c b/dlls/avifil32/tmpfile.c
index 49b5a0a..3bdd50a 100644
--- a/dlls/avifil32/tmpfile.c
+++ b/dlls/avifil32/tmpfile.c
@@ -34,102 +34,23 @@ WINE_DEFAULT_DEBUG_CHANNEL(avifile);
 
 /***********************************************************************/
 
-static HRESULT WINAPI ITmpFile_fnQueryInterface(IAVIFile* iface,REFIID refiid,LPVOID *obj);
-static ULONG   WINAPI ITmpFile_fnAddRef(IAVIFile* iface);
-static ULONG   WINAPI ITmpFile_fnRelease(IAVIFile* iface);
-static HRESULT WINAPI ITmpFile_fnInfo(IAVIFile*iface,AVIFILEINFOW*afi,LONG size);
-static HRESULT WINAPI ITmpFile_fnGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam);
-static HRESULT WINAPI ITmpFile_fnCreateStream(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi);
-static HRESULT WINAPI ITmpFile_fnWriteData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG size);
-static HRESULT WINAPI ITmpFile_fnReadData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG *size);
-static HRESULT WINAPI ITmpFile_fnEndRecord(IAVIFile*iface);
-static HRESULT WINAPI ITmpFile_fnDeleteStream(IAVIFile*iface,DWORD fccType,LONG lParam);
-
-static const struct IAVIFileVtbl itmpft = {
-  ITmpFile_fnQueryInterface,
-  ITmpFile_fnAddRef,
-  ITmpFile_fnRelease,
-  ITmpFile_fnInfo,
-  ITmpFile_fnGetStream,
-  ITmpFile_fnCreateStream,
-  ITmpFile_fnWriteData,
-  ITmpFile_fnReadData,
-  ITmpFile_fnEndRecord,
-  ITmpFile_fnDeleteStream
-};
-
 typedef struct _ITmpFileImpl {
-  /* IUnknown stuff */
-  const IAVIFileVtbl *lpVtbl;
+  IAVIFile     IAVIFile_iface;
   LONG         ref;
 
-  /* IAVIFile stuff */
   AVIFILEINFOW  fInfo;
   PAVISTREAM   *ppStreams;
 } ITmpFileImpl;
 
-PAVIFILE AVIFILE_CreateAVITempFile(int nStreams, const PAVISTREAM *ppStreams) {
-  ITmpFileImpl *tmpFile;
-  int           i;
-
-  tmpFile = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ITmpFileImpl));
-  if (tmpFile == NULL)
-    return NULL;
-
-  tmpFile->lpVtbl = &itmpft;
-  tmpFile->ref    = 1;
-  memset(&tmpFile->fInfo, 0, sizeof(tmpFile->fInfo));
-
-  tmpFile->fInfo.dwStreams = nStreams;
-  tmpFile->ppStreams = HeapAlloc(GetProcessHeap(), 0, nStreams * sizeof(PAVISTREAM));
-  if (tmpFile->ppStreams == NULL) {
-    HeapFree(GetProcessHeap(), 0, tmpFile);
-    return NULL;
-  }
-
-  for (i = 0; i < nStreams; i++) {
-    AVISTREAMINFOW sInfo;
-
-    tmpFile->ppStreams[i] = ppStreams[i];
-
-    AVIStreamAddRef(ppStreams[i]);
-    AVIStreamInfoW(ppStreams[i], &sInfo, sizeof(sInfo));
-    if (i == 0) {
-      tmpFile->fInfo.dwScale = sInfo.dwScale;
-      tmpFile->fInfo.dwRate  = sInfo.dwRate;
-      if (!sInfo.dwScale || !sInfo.dwRate) {
-	tmpFile->fInfo.dwScale = 1;
-	tmpFile->fInfo.dwRate  = 100;
-      }
-    }
-
-    if (tmpFile->fInfo.dwSuggestedBufferSize < sInfo.dwSuggestedBufferSize)
-      tmpFile->fInfo.dwSuggestedBufferSize = sInfo.dwSuggestedBufferSize;
-
-    {
-      register DWORD tmp;
-
-      tmp = MulDiv(AVIStreamSampleToTime(ppStreams[i], sInfo.dwLength),
-		   tmpFile->fInfo.dwScale, tmpFile->fInfo.dwRate * 1000);
-      if (tmpFile->fInfo.dwLength < tmp)
-	tmpFile->fInfo.dwLength = tmp;
-
-      tmp = sInfo.rcFrame.right - sInfo.rcFrame.left;
-      if (tmpFile->fInfo.dwWidth < tmp)
-	tmpFile->fInfo.dwWidth = tmp;
-      tmp = sInfo.rcFrame.bottom - sInfo.rcFrame.top;
-      if (tmpFile->fInfo.dwHeight < tmp)
-	tmpFile->fInfo.dwHeight = tmp;
-    }
-  }
-
-  return (PAVIFILE)tmpFile;
+static inline ITmpFileImpl *impl_from_IAVIFile(IAVIFile *iface)
+{
+  return CONTAINING_RECORD(iface, ITmpFileImpl, IAVIFile_iface);
 }
 
 static HRESULT WINAPI ITmpFile_fnQueryInterface(IAVIFile *iface, REFIID refiid,
 						LPVOID *obj)
 {
-  ITmpFileImpl *This = (ITmpFileImpl *)iface;
+  ITmpFileImpl *This = impl_from_IAVIFile(iface);
 
   TRACE("(%p,%s,%p)\n", This, debugstr_guid(refiid), obj);
 
@@ -146,7 +67,7 @@ static HRESULT WINAPI ITmpFile_fnQueryInterface(IAVIFile *iface, REFIID refiid,
 
 static ULONG   WINAPI ITmpFile_fnAddRef(IAVIFile *iface)
 {
-  ITmpFileImpl *This = (ITmpFileImpl *)iface;
+  ITmpFileImpl *This = impl_from_IAVIFile(iface);
   ULONG ref = InterlockedIncrement(&This->ref);
 
   TRACE("(%p) -> %d\n", iface, ref);
@@ -156,7 +77,7 @@ static ULONG   WINAPI ITmpFile_fnAddRef(IAVIFile *iface)
 
 static ULONG   WINAPI ITmpFile_fnRelease(IAVIFile *iface)
 {
-  ITmpFileImpl *This = (ITmpFileImpl *)iface;
+  ITmpFileImpl *This = impl_from_IAVIFile(iface);
   ULONG ref = InterlockedDecrement(&This->ref);
 
   TRACE("(%p) -> %d\n", iface, ref);
@@ -182,7 +103,7 @@ static ULONG   WINAPI ITmpFile_fnRelease(IAVIFile *iface)
 static HRESULT WINAPI ITmpFile_fnInfo(IAVIFile *iface,
 				      AVIFILEINFOW *afi, LONG size)
 {
-  ITmpFileImpl *This = (ITmpFileImpl *)iface;
+  ITmpFileImpl *This = impl_from_IAVIFile(iface);
 
   TRACE("(%p,%p,%d)\n",iface,afi,size);
 
@@ -201,7 +122,7 @@ static HRESULT WINAPI ITmpFile_fnInfo(IAVIFile *iface,
 static HRESULT WINAPI ITmpFile_fnGetStream(IAVIFile *iface, PAVISTREAM *avis,
 					   DWORD fccType, LONG lParam)
 {
-  ITmpFileImpl *This = (ITmpFileImpl *)iface;
+  ITmpFileImpl *This = impl_from_IAVIFile(iface);
 
   ULONG nStream = (ULONG)-1;
 
@@ -283,3 +204,75 @@ static HRESULT WINAPI ITmpFile_fnDeleteStream(IAVIFile *iface, DWORD fccType,
 
   return AVIERR_UNSUPPORTED;
 }
+
+static const struct IAVIFileVtbl itmpft = {
+  ITmpFile_fnQueryInterface,
+  ITmpFile_fnAddRef,
+  ITmpFile_fnRelease,
+  ITmpFile_fnInfo,
+  ITmpFile_fnGetStream,
+  ITmpFile_fnCreateStream,
+  ITmpFile_fnWriteData,
+  ITmpFile_fnReadData,
+  ITmpFile_fnEndRecord,
+  ITmpFile_fnDeleteStream
+};
+
+PAVIFILE AVIFILE_CreateAVITempFile(int nStreams, const PAVISTREAM *ppStreams)
+{
+  ITmpFileImpl *tmpFile;
+  int           i;
+
+  tmpFile = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ITmpFileImpl));
+  if (tmpFile == NULL)
+    return NULL;
+
+  tmpFile->IAVIFile_iface.lpVtbl = &itmpft;
+  tmpFile->ref    = 1;
+  memset(&tmpFile->fInfo, 0, sizeof(tmpFile->fInfo));
+
+  tmpFile->fInfo.dwStreams = nStreams;
+  tmpFile->ppStreams = HeapAlloc(GetProcessHeap(), 0, nStreams * sizeof(PAVISTREAM));
+  if (tmpFile->ppStreams == NULL) {
+    HeapFree(GetProcessHeap(), 0, tmpFile);
+    return NULL;
+  }
+
+  for (i = 0; i < nStreams; i++) {
+    AVISTREAMINFOW sInfo;
+
+    tmpFile->ppStreams[i] = ppStreams[i];
+
+    AVIStreamAddRef(ppStreams[i]);
+    AVIStreamInfoW(ppStreams[i], &sInfo, sizeof(sInfo));
+    if (i == 0) {
+      tmpFile->fInfo.dwScale = sInfo.dwScale;
+      tmpFile->fInfo.dwRate  = sInfo.dwRate;
+      if (!sInfo.dwScale || !sInfo.dwRate) {
+        tmpFile->fInfo.dwScale = 1;
+        tmpFile->fInfo.dwRate  = 100;
+      }
+    }
+
+    if (tmpFile->fInfo.dwSuggestedBufferSize < sInfo.dwSuggestedBufferSize)
+      tmpFile->fInfo.dwSuggestedBufferSize = sInfo.dwSuggestedBufferSize;
+
+    {
+      register DWORD tmp;
+
+      tmp = MulDiv(AVIStreamSampleToTime(ppStreams[i], sInfo.dwLength),
+                   tmpFile->fInfo.dwScale, tmpFile->fInfo.dwRate * 1000);
+      if (tmpFile->fInfo.dwLength < tmp)
+        tmpFile->fInfo.dwLength = tmp;
+
+      tmp = sInfo.rcFrame.right - sInfo.rcFrame.left;
+      if (tmpFile->fInfo.dwWidth < tmp)
+        tmpFile->fInfo.dwWidth = tmp;
+      tmp = sInfo.rcFrame.bottom - sInfo.rcFrame.top;
+      if (tmpFile->fInfo.dwHeight < tmp)
+        tmpFile->fInfo.dwHeight = tmp;
+    }
+  }
+
+  return (PAVIFILE)tmpFile;
+}




More information about the wine-cvs mailing list