Damjan Jovanovic : winemenubuilder: Parse ICO headers in a separate function.
Alexandre Julliard
julliard at winehq.org
Wed Aug 25 12:35:05 CDT 2010
Module: wine
Branch: master
Commit: 6b39897765e13fb802158487c4052321270a19e3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6b39897765e13fb802158487c4052321270a19e3
Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date: Tue Aug 24 15:04:54 2010 +0200
winemenubuilder: Parse ICO headers in a separate function.
---
programs/winemenubuilder/winemenubuilder.c | 56 ++++++++++++++--------------
1 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index 88676cd..dcf13ac 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -631,19 +631,15 @@ static HRESULT open_module_icon(LPCWSTR szFileName, int nIndex, IStream **ppStre
return hr;
}
-static HRESULT write_native_icon(IStream *iconStream, const char *icon_name, LPCWSTR szFileName)
+static HRESULT read_ico_direntries(IStream *icoStream, ICONDIRENTRY **ppIconDirEntries, int *numEntries)
{
ICONDIR iconDir;
- ICONDIRENTRY *pIconDirEntry = NULL;
- int nMax = 0, nMaxBits = 0;
- int nIndex = 0;
- void *pIcon = NULL;
- int i;
ULONG bytesRead;
- LARGE_INTEGER position;
HRESULT hr;
- hr = IStream_Read(iconStream, &iconDir, sizeof(ICONDIR), &bytesRead);
+ *ppIconDirEntries = NULL;
+
+ hr = IStream_Read(icoStream, &iconDir, sizeof(ICONDIR), &bytesRead);
if (FAILED(hr) || bytesRead != sizeof(ICONDIR) ||
(iconDir.idReserved != 0) || (iconDir.idType != 1))
{
@@ -651,20 +647,41 @@ static HRESULT write_native_icon(IStream *iconStream, const char *icon_name, LPC
hr = E_FAIL;
goto end;
}
+ *numEntries = iconDir.idCount;
- if ((pIconDirEntry = HeapAlloc(GetProcessHeap(), 0, iconDir.idCount * sizeof (ICONDIRENTRY))) == NULL)
+ if ((*ppIconDirEntries = HeapAlloc(GetProcessHeap(), 0, sizeof(ICONDIRENTRY)*iconDir.idCount)) == NULL)
{
hr = E_OUTOFMEMORY;
goto end;
}
- hr = IStream_Read(iconStream, pIconDirEntry, sizeof(ICONDIRENTRY)*iconDir.idCount, &bytesRead);
+ hr = IStream_Read(icoStream, *ppIconDirEntries, sizeof(ICONDIRENTRY)*iconDir.idCount, &bytesRead);
if (FAILED(hr) || bytesRead != sizeof(ICONDIRENTRY)*iconDir.idCount)
{
if (SUCCEEDED(hr)) hr = E_FAIL;
goto end;
}
- for (i = 0; i < iconDir.idCount; i++)
+end:
+ if (FAILED(hr))
+ HeapFree(GetProcessHeap(), 0, *ppIconDirEntries);
+ return hr;
+}
+
+static HRESULT write_native_icon(IStream *iconStream, const char *icon_name, LPCWSTR szFileName)
+{
+ ICONDIRENTRY *pIconDirEntry = NULL;
+ int numEntries;
+ int nMax = 0, nMaxBits = 0;
+ int nIndex = 0;
+ int i;
+ LARGE_INTEGER position;
+ HRESULT hr;
+
+ hr = read_ico_direntries(iconStream, &pIconDirEntry, &numEntries);
+ if (FAILED(hr))
+ goto end;
+
+ for (i = 0; i < numEntries; i++)
{
WINE_TRACE("[%d]: %d x %d @ %d\n", i, pIconDirEntry[i].bWidth, pIconDirEntry[i].bHeight, pIconDirEntry[i].wBitCount);
if (pIconDirEntry[i].wBitCount >= nMaxBits &&
@@ -677,22 +694,6 @@ static HRESULT write_native_icon(IStream *iconStream, const char *icon_name, LPC
}
WINE_TRACE("Selected: %d\n", nIndex);
- if ((pIcon = HeapAlloc(GetProcessHeap(), 0, pIconDirEntry[nIndex].dwBytesInRes)) == NULL)
- {
- hr = E_OUTOFMEMORY;
- goto end;
- }
- position.QuadPart = pIconDirEntry[nIndex].dwImageOffset;
- hr = IStream_Seek(iconStream, position, STREAM_SEEK_SET, NULL);
- if (FAILED(hr))
- goto end;
- hr = IStream_Read(iconStream, pIcon, pIconDirEntry[nIndex].dwBytesInRes, &bytesRead);
- if (FAILED(hr) || bytesRead != pIconDirEntry[nIndex].dwBytesInRes)
- {
- if (SUCCEEDED(hr)) hr = E_FAIL;
- goto end;
- }
-
position.QuadPart = 0;
hr = IStream_Seek(iconStream, position, STREAM_SEEK_SET, NULL);
if (FAILED(hr))
@@ -700,7 +701,6 @@ static HRESULT write_native_icon(IStream *iconStream, const char *icon_name, LPC
hr = convert_to_native_icon(iconStream, &nIndex, 1, &CLSID_WICPngEncoder, icon_name, szFileName);
end:
- HeapFree(GetProcessHeap(), 0, pIcon);
HeapFree(GetProcessHeap(), 0, pIconDirEntry);
return hr;
}
More information about the wine-cvs
mailing list