Alexandre Julliard : progman: Don' t try to access the internals of an icon object.

Alexandre Julliard julliard at winehq.org
Fri Dec 18 10:49:10 CST 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Dec 17 20:22:27 2009 +0100

progman: Don't try to access the internals of an icon object.

---

 programs/progman/grpfile.c |   64 ++++++++++++++++++++++----------------------
 1 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/programs/progman/grpfile.c b/programs/progman/grpfile.c
index e26c215..1d31400 100644
--- a/programs/progman/grpfile.c
+++ b/programs/progman/grpfile.c
@@ -22,7 +22,6 @@
 #define WIN32_LEAN_AND_MEAN
 
 #include "windows.h"
-#include "wine/winuser16.h"
 #include "progman.h"
 #include "mmsystem.h"
 
@@ -242,7 +241,7 @@ static HLOCAL GRPFILE_ScanProgram(LPCSTR buffer, INT size,
   LPCSTR iconinfo_ptr, iconANDbits_ptr, iconXORbits_ptr;
   INT    x, y, nIconIndex, iconANDsize, iconXORsize;
   INT    nHotKey, nCmdShow;
-  CURSORICONINFO iconinfo;
+  UINT width, height, planes, bpp;
 
   x               = GET_SHORT(program_ptr, 0);
   y               = GET_SHORT(program_ptr, 2);
@@ -261,13 +260,10 @@ static HLOCAL GRPFILE_ScanProgram(LPCSTR buffer, INT size,
       iconinfo_ptr    = buffer + GET_USHORT(program_ptr, 12);
       iconXORbits_ptr = buffer + GET_USHORT(program_ptr, 14);
       iconANDbits_ptr = buffer + GET_USHORT(program_ptr, 16);
-      iconinfo.ptHotSpot.x   = GET_USHORT(iconinfo_ptr, 0);
-      iconinfo.ptHotSpot.y   = GET_USHORT(iconinfo_ptr, 2);
-      iconinfo.nWidth        = GET_USHORT(iconinfo_ptr, 4);
-      iconinfo.nHeight       = GET_USHORT(iconinfo_ptr, 6);
-      iconinfo.nWidthBytes   = GET_USHORT(iconinfo_ptr, 8);
-      iconinfo.bPlanes       = GET_USHORT(iconinfo_ptr, 10);
-      iconinfo.bBitsPerPixel = GET_USHORT(iconinfo_ptr, 11);
+      width           = GET_USHORT(iconinfo_ptr, 4);
+      height          = GET_USHORT(iconinfo_ptr, 6);
+      planes          = GET_USHORT(iconinfo_ptr, 10);
+      bpp             = GET_USHORT(iconinfo_ptr, 11);
       break;
     case 0x000c:
       iconANDsize     = GET_USHORT(program_ptr,  8);
@@ -275,21 +271,16 @@ static HLOCAL GRPFILE_ScanProgram(LPCSTR buffer, INT size,
       iconinfo_ptr    = buffer + GET_USHORT(program_ptr, 12);
       iconANDbits_ptr = buffer + GET_USHORT(program_ptr, 14);
       iconXORbits_ptr = buffer + GET_USHORT(program_ptr, 16);
-      iconinfo.ptHotSpot.x   = GET_USHORT(iconinfo_ptr, 0);
-      iconinfo.ptHotSpot.y   = GET_USHORT(iconinfo_ptr, 2);
-      iconinfo.nWidth        = GET_USHORT(iconinfo_ptr, 4);
-      iconinfo.nHeight       = GET_USHORT(iconinfo_ptr, 6);
-      iconinfo.nWidthBytes = GET_USHORT(iconinfo_ptr, 8) * 8;
-      iconinfo.bPlanes       = GET_USHORT(iconinfo_ptr, 10);
-      iconinfo.bBitsPerPixel = GET_USHORT(iconinfo_ptr, 11);
+      width           = GET_USHORT(iconinfo_ptr, 4);
+      height          = GET_USHORT(iconinfo_ptr, 6);
+      planes          = GET_USHORT(iconinfo_ptr, 10);
+      bpp             = GET_USHORT(iconinfo_ptr, 11);
     }
 
   if (iconANDbits_ptr + iconANDsize > buffer + size ||
       iconXORbits_ptr + iconXORsize > buffer + size) return(0);
 
-  hIcon = CreateIcon( Globals.hInstance, iconinfo.nWidth, iconinfo.nHeight,
-                      iconinfo.bPlanes, iconinfo.bBitsPerPixel,
-                      iconANDbits_ptr, iconXORbits_ptr );
+  hIcon = CreateIcon( Globals.hInstance, width, height, planes, bpp, iconANDbits_ptr, iconXORbits_ptr );
 
   lpszName        = buffer + GET_USHORT(program_ptr, 18);
   lpszCmdLine     = buffer + GET_USHORT(program_ptr, 20);
@@ -419,12 +410,19 @@ BOOL GRPFILE_WriteGroupFile(HLOCAL hGroup)
  *           GRPFILE_CalculateSizes
  */
 
-static VOID GRPFILE_CalculateSizes(PROGRAM *program,
-				   INT *Progs, INT *Icons)
+static VOID GRPFILE_CalculateSizes(PROGRAM *program, INT *Progs, INT *Icons,
+                                   UINT *sizeAnd, UINT *sizeXor)
 {
-  CURSORICONINFO *iconinfo = LocalLock(program->hIcon);
-  INT sizeXor = iconinfo->nHeight * iconinfo->nWidthBytes;
-  INT sizeAnd = iconinfo->nHeight * ((iconinfo->nWidth + 15) / 16 * 2);
+  ICONINFO info;
+  BITMAP bmp;
+
+  GetIconInfo( program->hIcon, &info );
+  GetObjectW( info.hbmMask, sizeof(bmp), &bmp );
+  *sizeAnd = bmp.bmHeight * ((bmp.bmWidth + 15) / 16 * 2);
+  GetObjectW( info.hbmColor, sizeof(bmp), &bmp );
+  *sizeXor = bmp.bmHeight * bmp.bmWidthBytes;
+  DeleteObject( info.hbmMask );
+  DeleteObject( info.hbmColor );
 
   *Progs += 24;
   *Progs += lstrlen(LocalLock(program->hName)) + 1;
@@ -432,8 +430,8 @@ static VOID GRPFILE_CalculateSizes(PROGRAM *program,
   *Progs += lstrlen(LocalLock(program->hIconFile)) + 1;
 
   *Icons += 12; /* IconInfo */
-  *Icons += sizeAnd;
-  *Icons += sizeXor;
+  *Icons += *sizeAnd;
+  *Icons += *sizeXor;
 }
 
 /***********************************************************************/
@@ -513,6 +511,7 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, PROGGROUP *group)
   HLOCAL hProgram;
   INT    NumProg, Title, Progs, Icons, Extension;
   INT    CurrProg, CurrIcon, nCmdShow, ptr, seqnum;
+  DWORD  sizeAnd, sizeXor;
   BOOL   need_extension;
   LPCSTR lpszTitle = LocalLock(group->hName);
 
@@ -532,7 +531,7 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, PROGGROUP *group)
       LPCSTR lpszWorkDir = LocalLock(program->hWorkDir);
 
       NumProg++;
-      GRPFILE_CalculateSizes(program, &Icons, &Extension);
+      GRPFILE_CalculateSizes(program, &Icons, &Extension, &sizeAnd, &sizeXor);
 
       /* Set a flag if an extension is needed */
       if (lpszWorkDir[0] || program->nHotKey ||
@@ -585,7 +584,7 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, PROGGROUP *group)
       if ((UINT)HFILE_ERROR == GRPFILE_WriteWithChecksum(file, buffer, 2))
 	      return FALSE;
 
-      GRPFILE_CalculateSizes(program, &CurrProg, &CurrIcon);
+      GRPFILE_CalculateSizes(program, &CurrProg, &CurrIcon, &sizeAnd, &sizeXor);
       hProgram = program->hNext;
     }
 
@@ -601,13 +600,13 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, PROGGROUP *group)
   while(hProgram)
     {
       PROGRAM *program = LocalLock(hProgram);
-      CURSORICONINFO *iconinfo = LocalLock(program->hIcon);
       LPCSTR Name     = LocalLock(program->hName);
       LPCSTR CmdLine  = LocalLock(program->hCmdLine);
       LPCSTR IconFile = LocalLock(program->hIconFile);
-      INT sizeXor = iconinfo->nHeight * iconinfo->nWidthBytes;
-      INT sizeAnd = iconinfo->nHeight * ((iconinfo->nWidth + 15) / 16 * 2);
+      INT next_prog = CurrProg;
+      INT next_icon = CurrIcon;
 
+      GRPFILE_CalculateSizes(program, &next_prog, &next_icon, &sizeAnd, &sizeXor);
       PUT_SHORT(buffer,  0, program->x);
       PUT_SHORT(buffer,  2, program->y);
       PUT_SHORT(buffer,  4, program->nIconIndex);
@@ -630,7 +629,8 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, PROGGROUP *group)
 	  (UINT)HFILE_ERROR == GRPFILE_WriteWithChecksum(file, IconFile, lstrlen(IconFile) + 1))
 	return FALSE;
 
-      GRPFILE_CalculateSizes(program, &CurrProg, &CurrIcon);
+      CurrProg = next_prog;
+      CurrIcon = next_icon;
       hProgram = program->hNext;
     }
 




More information about the wine-cvs mailing list