[PATCH v4 1/4] include: Add definition for IShellItemImageFactory.

Jinoh Kang jinoh.kang.kr at gmail.com
Sun Apr 24 09:06:42 CDT 2022


On 4/24/22 22:05, Nikolay Sivov wrote:
> 
> 
> On 4/23/22 20:53, Jinoh Kang wrote:
>> +    [v1_enum] enum _SIIGBF {
>> +        SIIGBF_RESIZETOFIT     = 0x00000000,
>> +        SIIGBF_BIGGERSIZEOK    = 0x00000001,
>> +        SIIGBF_MEMORYONLY      = 0x00000002,
>> +        SIIGBF_ICONONLY        = 0x00000004,
>> +        SIIGBF_THUMBNAILONLY   = 0x00000008,
>> +        SIIGBF_INCACHEONLY     = 0x00000010,
>> +        SIIGBF_CROPTOSQUARE    = 0x00000020,
>> +        SIIGBF_WIDETHUMBNAILS  = 0x00000040,
>> +        SIIGBF_ICONBACKGROUND  = 0x00000080,
>> +        SIIGBF_SCALEUP         = 0x00000100,
>> +    };
>> +    typedef DWORD SIIGBF;
> I see this using int instead of DWORD in 10.0.22000.0, did it change?

That's about right.  No idea where the DWORD came though...

> 
>> Because you have to convert potentially-transparent HICON to HBITMAP with alpha channel, which is quite a complicated feat.
>>
>> 1. HICON can take many pixel formats, ranging from 32-bit ARGB and monochrome with mask.
>> 2. hbmColor and hbmMask combinations aren't exactly simple to handle.
>> 3. Windows always seems to output a 32-bit ARGB bitmap. GDI routines alone aren't particularly suited for the task (GdiAlphaBlend works with PARGB, not ARGB).
>>
>> Only WIC and GDI+ has functions to handle most of these.
> Same SDK claims output could be RGB24, RGB32, or PARGB32, but it can't be trusted of course.

There is an API sample from Microsoft: https://github.com/microsoft/Windows-classic-samples/blob/main/Samples/Win7Samples/winui/shell/appplatform/UsingImageFactory/ImageFactorySample.cpp
Basically it feeds IShellItemImageFactory output directly into a SS_BITMAP static control.

Note that static controls are known to accept ARGB32 bitmaps, which is converted into PARGB32 internally:
- https://source.winehq.org/git/wine.git/blob/f4fdafbb5597bde5d2d3433d5c64f5a74dfac859:/dlls/comctl32/tests/static.c#l263

This is also consistent with Wine behaviour:
- https://source.winehq.org/git/wine.git/blob/f4fdafbb5597bde5d2d3433d5c64f5a74dfac859:/dlls/comctl32/static.c#l208

Ideally it would be nice if we could test the pixel format, but there is no reliable way to detect if a given GDI bitmap is in ARGB32 or PARGB32.
(Specifically, a PARGB32 bitmap can always be interpreted as a valid ARGB32 bitmap, but not vice versa.)

At least, the output bitmap was observed to be consistently ARGB32 regardless of which pixel format the source icon used (e.g. 8-bit color, RGB32, or ARGB32).


-- 
Sincerely,
Jinoh Kang



More information about the wine-devel mailing list