[RFC PATCH] gdi32: allow passing BITMAPINFO with bmiHeader.biSizeImage == 0 for EMF DC.
Jacek Caban
jacek at codeweavers.com
Wed Oct 13 12:57:19 CDT 2021
Hi Jinoh,
On 10/12/21 8:31 PM, Jinoh Kang wrote:
> I performed a test going roughly as follows on Windows 10, build 2108:
>
> - rect = {0, 0, 128, 128};
> - hdc = CreateEnhMetaFileW(NULL, NULL, &rect, NULL); // NOTE current session on truecolor desktop
> - StretchDIBits(hdc, 0, 0, 32, 32, 0, 0, 32, 32, data, bmi, DIB_RGB_COLORS, SRCCOPY);
>
> The results are as follows:
>
> - bmiHeader.biCompression:
> - BI_RGB and BI_BITFIELD: calculates cbBitsSrc based on width/height/depth; ignores bmiHeader.biSizeImage.
> - BI_RLE4 and BI_RLE8: cbBitsSrc := bmiHeader.biSizeImage. Fails if bmiHeader.biSizeImage is zero.
> - BI_JPEG and BI_PNG: (unable to test -- fails on my system; perhaps incorrect DC settings?)
> - bmiHeader.biSizeImage:
> - Preserved as-is in resulting EMF, however large or small.
> - bmiHeader.biClrUsed and bmiHeader.biClrImportant:
> - Preserved as-is in resulting EMF, however large or small.
> - Invalid values seem to be also accepted.
> - Works also on BI_RGB (no checks are done?)
> - Usage of BITMAPCOREINFO instead of BITMAPINFO (size == 12):
> - Normalized to BITMAPINFOHEADER (size == 40).
>
> These behaviours closely resemble bitmapinfoheader_from_user_bitmapinfo_sans_ in-line mutation of biSizeImage.
> Perhaps we can write the calculated size to a separate pass-by-ref variable, and change the original usage as follows:
>
> -bitmapinfoheader_from_user_bitmapinfo(&dst->bmiHeader, &info->bmiHeader);
> +bitmapinfoheader_from_user_bitmapinfo(&dst->bmiHeader, &info->bmiHeader, &dst->bmiHeader.biSizeImage);
>
> Alternatively, we should factor it out into a separate function.
Thanks for testing it. The problem with using a function like above is
that it depends on the order values of &dst->bmiHeader and
&dst->bmiHeader.biSizeImage are set in
bitmapinfoheader_from_user_bitmapinfo. In this case I'd say that
skipping size calculation in the helper that sanitizes the header and
doing that in a separate helper seems better.
Thanks,
Jacek
More information about the wine-devel
mailing list