Jacek Caban : user32: Use create_cursoricon_object in CreateIconIndirect.
Alexandre Julliard
julliard at winehq.org
Tue Feb 22 16:06:51 CST 2022
Module: wine
Branch: master
Commit: a37a0a94d40367b4885ea7438ac191c2aca9ae27
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a37a0a94d40367b4885ea7438ac191c2aca9ae27
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Feb 22 13:41:52 2022 +0100
user32: Use create_cursoricon_object in CreateIconIndirect.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/cursoricon.c | 73 ++++++++++++++++++++----------------------------
1 file changed, 31 insertions(+), 42 deletions(-)
diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index 556bc1b0f91..8b74f7ba4e8 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -2373,10 +2373,10 @@ static void stretch_blt_icon( HDC hdc_dst, int dst_x, int dst_y, int dst_width,
*/
HICON WINAPI CreateIconIndirect(PICONINFO iconinfo)
{
+ struct cursoricon_frame frame = { 0 };
+ struct cursoricon_desc desc = { .frames = &frame };
BITMAP bmpXor, bmpAnd;
- HICON hObj;
- HBITMAP color = 0, mask;
- int width, height;
+ HICON ret;
HDC hdc;
TRACE("color %p, mask %p, hotspot %ux%u, fIcon %d\n",
@@ -2397,59 +2397,48 @@ HICON WINAPI CreateIconIndirect(PICONINFO iconinfo)
bmpXor.bmWidth, bmpXor.bmHeight, bmpXor.bmWidthBytes,
bmpXor.bmPlanes, bmpXor.bmBitsPixel);
- width = bmpXor.bmWidth;
- height = bmpXor.bmHeight;
- color = create_color_bitmap( width, height );
+ frame.width = bmpXor.bmWidth;
+ frame.height = bmpXor.bmHeight;
+ frame.color = create_color_bitmap( frame.width, frame.height );
}
else
{
- width = bmpAnd.bmWidth;
- height = bmpAnd.bmHeight;
+ frame.width = bmpAnd.bmWidth;
+ frame.height = bmpAnd.bmHeight;
}
- mask = CreateBitmap( width, height, 1, 1, NULL );
+ frame.mask = CreateBitmap( frame.width, frame.height, 1, 1, NULL );
hdc = CreateCompatibleDC( 0 );
- SelectObject( hdc, mask );
- stretch_blt_icon( hdc, 0, 0, width, height, iconinfo->hbmMask, bmpAnd.bmWidth, bmpAnd.bmHeight );
+ SelectObject( hdc, frame.mask );
+ stretch_blt_icon( hdc, 0, 0, frame.width, frame.height, iconinfo->hbmMask,
+ bmpAnd.bmWidth, bmpAnd.bmHeight );
- if (color)
+ if (frame.color)
{
- SelectObject( hdc, color );
- stretch_blt_icon( hdc, 0, 0, width, height, iconinfo->hbmColor, width, height );
+ SelectObject( hdc, frame.color );
+ stretch_blt_icon( hdc, 0, 0, frame.width, frame.height, iconinfo->hbmColor,
+ frame.width, frame.height );
}
- else height /= 2;
+ else frame.height /= 2;
DeleteDC( hdc );
- hObj = alloc_icon_handle( FALSE, 0 );
- if (hObj)
- {
- struct cursoricon_object *info = get_icon_ptr( hObj );
- struct cursoricon_frame *frame;
-
- info->is_icon = iconinfo->fIcon;
- frame = get_icon_frame( info, 0 );
- frame->delay = ~0;
- frame->width = width;
- frame->height = height;
- frame->color = color;
- frame->mask = mask;
- frame->alpha = create_alpha_bitmap( iconinfo->hbmColor, NULL, NULL );
- if (info->is_icon)
- {
- frame->hotspot.x = width / 2;
- frame->hotspot.y = height / 2;
- }
- else
- {
- frame->hotspot.x = iconinfo->xHotspot;
- frame->hotspot.y = iconinfo->yHotspot;
- }
+ frame.alpha = create_alpha_bitmap( iconinfo->hbmColor, NULL, NULL );
- release_icon_frame( info, frame );
- release_user_handle_ptr( info );
+ if (iconinfo->fIcon)
+ {
+ frame.hotspot.x = frame.width / 2;
+ frame.hotspot.y = frame.height / 2;
+ }
+ else
+ {
+ frame.hotspot.x = iconinfo->xHotspot;
+ frame.hotspot.y = iconinfo->yHotspot;
}
- return hObj;
+
+ ret = create_cursoricon_object( &desc, iconinfo->fIcon, 0, 0, 0 );
+ if (!ret) free_icon_frame( &frame );
+ return ret;
}
/******************************************************************************
More information about the wine-cvs
mailing list