857
899
for (compr = 0; compr < 8; compr++)
864
case 24: expect_ok = (compr == BI_RGB); break;
866
case 32: expect_ok = (compr == BI_RGB || compr == BI_BITFIELDS); break;
867
default: expect_ok = FALSE; break;
869
todo = (compr == BI_BITFIELDS); /* wine doesn't like strange bitfields */
871
memset( bi, 0, sizeof(bi->bmiHeader) );
872
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
873
bi->bmiHeader.biWidth = 2;
874
bi->bmiHeader.biHeight = 2;
875
bi->bmiHeader.biPlanes = planes;
876
bi->bmiHeader.biBitCount = bpp;
877
bi->bmiHeader.biCompression = compr;
878
bi->bmiHeader.biSizeImage = 0;
879
memset( bi->bmiColors, 0xaa, sizeof(RGBQUAD) * 256 );
880
ret = GetDIBits(hdc, hbmp, 0, 0, data, bi, DIB_RGB_COLORS);
881
if (expect_ok || (!bpp && compr != BI_JPEG && compr != BI_PNG) ||
882
(bpp == 4 && compr == BI_RLE4) || (bpp == 8 && compr == BI_RLE8))
883
ok( ret, "GetDIBits failed for %u/%u/%u\n", bpp, planes, compr );
885
ok( !ret || broken(!bpp && (compr == BI_JPEG || compr == BI_PNG)), /* nt4 */
886
"GetDIBits succeeded for %u/%u/%u\n", bpp, planes, compr );
888
/* all functions check planes except GetDIBits with 0 lines */
889
if (!planes) expect_ok = FALSE;
890
memset( bi, 0, sizeof(bi->bmiHeader) );
891
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
892
bi->bmiHeader.biWidth = 2;
893
bi->bmiHeader.biHeight = 2;
894
bi->bmiHeader.biPlanes = planes;
895
bi->bmiHeader.biBitCount = bpp;
896
bi->bmiHeader.biCompression = compr;
897
bi->bmiHeader.biSizeImage = 0;
898
memset( bi->bmiColors, 0xaa, sizeof(RGBQUAD) * 256 );
900
hdib = CreateDIBSection(hdc, bi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
901
if (expect_ok && (planes == 1 || planes * bpp <= 16))
902
ok( hdib != NULL, "CreateDIBSection failed for %u/%u/%u\n", bpp, planes, compr );
904
ok( hdib == NULL, "CreateDIBSection succeeded for %u/%u/%u\n", bpp, planes, compr );
905
if (hdib) DeleteObject( hdib );
907
hdib = CreateDIBitmap( hdc, &bi->bmiHeader, 0, data, bi, DIB_RGB_COLORS );
908
/* no sanity checks in CreateDIBitmap except compression */
909
if (compr == BI_JPEG || compr == BI_PNG)
910
ok( hdib == NULL || broken(hdib != NULL), /* nt4 */
911
"CreateDIBitmap succeeded for %u/%u/%u\n", bpp, planes, compr );
913
ok( hdib != NULL, "CreateDIBitmap failed for %u/%u/%u\n", bpp, planes, compr );
914
if (hdib) DeleteObject( hdib );
916
/* RLE needs a size */
917
bi->bmiHeader.biSizeImage = 0;
918
ret = SetDIBits(hdc, hbmp, 0, 1, data, bi, DIB_RGB_COLORS);
922
todo_wine ok( ret, "SetDIBits failed for %u/%u/%u\n", bpp, planes, compr );
924
ok( ret, "SetDIBits failed for %u/%u/%u\n", bpp, planes, compr );
928
broken((bpp == 4 && compr == BI_RLE4) || (bpp == 8 && compr == BI_RLE8)), /* nt4 */
929
"SetDIBits succeeded for %u/%u/%u\n", bpp, planes, compr );
930
ret = SetDIBitsToDevice( memdc, 0, 0, 1, 1, 0, 0, 0, 1, data, bi, DIB_RGB_COLORS );
934
todo_wine ok( ret, "SetDIBitsToDevice failed for %u/%u/%u\n", bpp, planes, compr );
936
ok( ret, "SetDIBitsToDevice failed for %u/%u/%u\n", bpp, planes, compr );
940
broken((bpp == 4 && compr == BI_RLE4) || (bpp == 8 && compr == BI_RLE8)), /* nt4 */
941
"SetDIBitsToDevice succeeded for %u/%u/%u\n", bpp, planes, compr );
942
ret = StretchDIBits( memdc, 0, 0, 1, 1, 0, 0, 1, 1, data, bi, DIB_RGB_COLORS, SRCCOPY );
946
todo_wine ok( ret, "StretchDIBits failed for %u/%u/%u\n", bpp, planes, compr );
948
ok( ret, "StretchDIBits failed for %u/%u/%u\n", bpp, planes, compr );
952
broken((bpp == 4 && compr == BI_RLE4) || (bpp == 8 && compr == BI_RLE8)), /* nt4 */
953
"StretchDIBits succeeded for %u/%u/%u\n", bpp, planes, compr );
955
ret = GetDIBits(hdc, hbmp, 0, 2, data, bi, DIB_RGB_COLORS);
957
ok( ret, "GetDIBits failed for %u/%u/%u\n", bpp, planes, compr );
959
ok( !ret, "GetDIBits succeeded for %u/%u/%u\n", bpp, planes, compr );
960
ok( bi->bmiHeader.biBitCount == bpp, "GetDIBits modified bpp %u/%u\n",
961
bpp, bi->bmiHeader.biBitCount );
963
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
964
bi->bmiHeader.biWidth = 2;
965
bi->bmiHeader.biHeight = 2;
966
bi->bmiHeader.biPlanes = planes;
967
bi->bmiHeader.biBitCount = bpp;
968
bi->bmiHeader.biCompression = compr;
969
bi->bmiHeader.biSizeImage = 1;
970
memset( bi->bmiColors, 0xaa, sizeof(RGBQUAD) * 256 );
971
/* RLE allowed with valid biSizeImage */
972
if ((bpp == 4 && compr == BI_RLE4) || (bpp == 8 && compr == BI_RLE8)) expect_ok = TRUE;
974
ret = SetDIBits(hdc, hbmp, 0, 1, data, bi, DIB_RGB_COLORS);
978
todo_wine ok( ret, "SetDIBits failed for %u/%u/%u\n", bpp, planes, compr );
980
ok( ret, "SetDIBits failed for %u/%u/%u\n", bpp, planes, compr );
983
ok( !ret, "SetDIBits succeeded for %u/%u/%u\n", bpp, planes, compr );
984
ret = SetDIBitsToDevice( memdc, 0, 0, 1, 1, 0, 0, 0, 1, data, bi, DIB_RGB_COLORS );
988
todo_wine ok( ret, "SetDIBitsToDevice failed for %u/%u/%u\n", bpp, planes, compr );
990
ok( ret, "SetDIBitsToDevice failed for %u/%u/%u\n", bpp, planes, compr );
993
ok( !ret, "SetDIBitsToDevice succeeded for %u/%u/%u\n", bpp, planes, compr );
994
ret = StretchDIBits( memdc, 0, 0, 1, 1, 0, 0, 1, 1, data, bi, DIB_RGB_COLORS, SRCCOPY );
998
todo_wine ok( ret, "StretchDIBits failed for %u/%u/%u\n", bpp, planes, compr );
1000
ok( ret, "StretchDIBits failed for %u/%u/%u\n", bpp, planes, compr );
1003
ok( !ret, "StretchDIBits succeeded for %u/%u/%u\n", bpp, planes, compr );
1005
bi->bmiHeader.biSizeImage = 0;
1006
ret = GetDIBits(hdc, hbmp, 0, 2, NULL, bi, DIB_RGB_COLORS);
1007
if (expect_ok || !bpp)
1008
ok( ret, "GetDIBits failed for %u/%u/%u\n", bpp, planes, compr );
1010
ok( !ret, "GetDIBits succeeded for %u/%u/%u\n", bpp, planes, compr );
901
for (format = DIB_RGB_COLORS; format <= DIB_PAL_COLORS; format++)
908
case 24: expect_ok = (compr == BI_RGB); break;
910
case 32: expect_ok = (compr == BI_RGB || compr == BI_BITFIELDS); break;
911
default: expect_ok = FALSE; break;
914
memset( bi, 0, sizeof(bi->bmiHeader) );
915
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
916
bi->bmiHeader.biWidth = 2;
917
bi->bmiHeader.biHeight = 2;
918
bi->bmiHeader.biPlanes = planes;
919
bi->bmiHeader.biBitCount = bpp;
920
bi->bmiHeader.biCompression = compr;
921
bi->bmiHeader.biSizeImage = 0;
922
memset( bi->bmiColors, 0xaa, sizeof(RGBQUAD) * 256 );
923
ret = GetDIBits(hdc, hbmp, 0, 0, data, bi, format);
924
if (expect_ok || (!bpp && compr != BI_JPEG && compr != BI_PNG) ||
925
(bpp == 4 && compr == BI_RLE4) || (bpp == 8 && compr == BI_RLE8))
926
ok( ret, "GetDIBits failed for %u/%u/%u/%u\n", bpp, planes, compr, format );
928
ok( !ret || broken(!bpp && (compr == BI_JPEG || compr == BI_PNG)), /* nt4 */
929
"GetDIBits succeeded for %u/%u/%u/%u\n", bpp, planes, compr, format );
931
/* all functions check planes except GetDIBits with 0 lines */
932
format_ok = expect_ok;
933
if (!planes) expect_ok = FALSE;
934
memset( bi, 0, sizeof(bi->bmiHeader) );
935
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
936
bi->bmiHeader.biWidth = 2;
937
bi->bmiHeader.biHeight = 2;
938
bi->bmiHeader.biPlanes = planes;
939
bi->bmiHeader.biBitCount = bpp;
940
bi->bmiHeader.biCompression = compr;
941
bi->bmiHeader.biSizeImage = 0;
942
memset( bi->bmiColors, 0xaa, sizeof(RGBQUAD) * 256 );
944
hdib = CreateDIBSection(hdc, bi, format, &bits, NULL, 0);
945
if (expect_ok && (planes == 1 || planes * bpp <= 16) &&
946
(compr != BI_BITFIELDS || format != DIB_PAL_COLORS))
947
ok( hdib != NULL, "CreateDIBSection failed for %u/%u/%u/%u\n", bpp, planes, compr, format );
949
ok( hdib == NULL, "CreateDIBSection succeeded for %u/%u/%u/%u\n", bpp, planes, compr, format );
950
if (hdib) DeleteObject( hdib );
952
hdib = CreateDIBitmap( hdc, &bi->bmiHeader, 0, data, bi, format );
953
/* no sanity checks in CreateDIBitmap except compression */
954
if (compr == BI_JPEG || compr == BI_PNG)
955
ok( hdib == NULL || broken(hdib != NULL), /* nt4 */
956
"CreateDIBitmap succeeded for %u/%u/%u/%u\n", bpp, planes, compr, format );
958
ok( hdib != NULL, "CreateDIBitmap failed for %u/%u/%u/%u\n", bpp, planes, compr, format );
959
if (hdib) DeleteObject( hdib );
961
/* RLE needs a size */
962
bi->bmiHeader.biSizeImage = 0;
963
ret = SetDIBits(hdc, hbmp, 0, 1, data, bi, format);
965
ok( ret, "SetDIBits failed for %u/%u/%u/%u\n", bpp, planes, compr, format );
968
broken((bpp == 4 && compr == BI_RLE4) || (bpp == 8 && compr == BI_RLE8)), /* nt4 */
969
"SetDIBits succeeded for %u/%u/%u/%u\n", bpp, planes, compr, format );
970
ret = SetDIBitsToDevice( memdc, 0, 0, 1, 1, 0, 0, 0, 1, data, bi, format );
972
ok( ret, "SetDIBitsToDevice failed for %u/%u/%u/%u\n", bpp, planes, compr, format );
975
broken((bpp == 4 && compr == BI_RLE4) || (bpp == 8 && compr == BI_RLE8)), /* nt4 */
976
"SetDIBitsToDevice succeeded for %u/%u/%u/%u\n", bpp, planes, compr, format );
977
ret = StretchDIBits( memdc, 0, 0, 1, 1, 0, 0, 1, 1, data, bi, format, SRCCOPY );
979
ok( ret, "StretchDIBits failed for %u/%u/%u/%u\n", bpp, planes, compr, format );
982
broken((bpp == 4 && compr == BI_RLE4) || (bpp == 8 && compr == BI_RLE8)), /* nt4 */
983
"StretchDIBits succeeded for %u/%u/%u/%u\n", bpp, planes, compr, format );
985
ret = GetDIBits(hdc, hbmp, 0, 2, data, bi, format);
987
ok( ret, "GetDIBits failed for %u/%u/%u/%u\n", bpp, planes, compr, format );
989
ok( !ret, "GetDIBits succeeded for %u/%u/%u/%u\n", bpp, planes, compr, format );
990
ok( bi->bmiHeader.biBitCount == bpp, "GetDIBits modified bpp %u/%u\n",
991
bpp, bi->bmiHeader.biBitCount );
993
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
994
bi->bmiHeader.biWidth = 2;
995
bi->bmiHeader.biHeight = 2;
996
bi->bmiHeader.biPlanes = planes;
997
bi->bmiHeader.biBitCount = bpp;
998
bi->bmiHeader.biCompression = compr;
999
bi->bmiHeader.biSizeImage = 1;
1000
memset( bi->bmiColors, 0xaa, sizeof(RGBQUAD) * 256 );
1001
/* RLE allowed with valid biSizeImage */
1002
if ((bpp == 4 && compr == BI_RLE4) || (bpp == 8 && compr == BI_RLE8)) expect_ok = TRUE;
1004
ret = SetDIBits(hdc, hbmp, 0, 1, data, bi, format);
1006
ok( ret, "SetDIBits failed for %u/%u/%u/%u\n", bpp, planes, compr, format );
1008
ok( !ret, "SetDIBits succeeded for %u/%u/%u/%u\n", bpp, planes, compr, format );
1009
ret = SetDIBitsToDevice( memdc, 0, 0, 1, 1, 0, 0, 0, 1, data, bi, format );
1011
ok( ret, "SetDIBitsToDevice failed for %u/%u/%u/%u\n", bpp, planes, compr, format );
1013
ok( !ret, "SetDIBitsToDevice succeeded for %u/%u/%u/%u\n", bpp, planes, compr, format );
1014
ret = StretchDIBits( memdc, 0, 0, 1, 1, 0, 0, 1, 1, data, bi, format, SRCCOPY );
1016
ok( ret, "StretchDIBits failed for %u/%u/%u/%u\n", bpp, planes, compr, format );
1018
ok( !ret, "StretchDIBits succeeded for %u/%u/%u/%u\n", bpp, planes, compr, format );
1020
bi->bmiHeader.biSizeImage = 0;
1021
ret = GetDIBits(hdc, hbmp, 0, 2, NULL, bi, format);
1022
if (expect_ok || !bpp)
1023
ok( ret, "GetDIBits failed for %u/%u/%u/%u\n", bpp, planes, compr, format );
1025
ok( !ret || broken(format_ok && !planes), /* nt4 */
1026
"GetDIBits succeeded for %u/%u/%u/%u\n", bpp, planes, compr, format );
2835
2908
/* Top-down to top-down tests */
2836
2909
srcBuffer[0] = 0xCAFED00D, srcBuffer[1] = 0xFEEDFACE;
2837
srcBuffer[2] = 0xFEDCBA98, srcBuffer[3] = 0x76543210;
2910
srcBuffer[16] = 0xFEDCBA98, srcBuffer[17] = 0x76543210;
2912
memset( expected, 0, get_dib_image_size( &biDst ) );
2839
2913
expected[0] = 0xCAFED00D, expected[1] = 0xFEEDFACE;
2840
expected[2] = 0xFEDCBA98, expected[3] = 0x76543210;
2841
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2842
0, 0, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
2914
expected[16] = 0xFEDCBA98, expected[17] = 0x76543210;
2915
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2916
0, 0, 2, 2, 0, 0, 2, 2, expected, __LINE__);
2844
2918
expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
2845
expected[2] = 0x00000000, expected[3] = 0x00000000;
2846
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2847
0, 0, 1, 1, 0, 0, 1, 1, expected, expected, __LINE__);
2919
expected[16] = 0x00000000, expected[17] = 0x00000000;
2920
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2921
0, 0, 1, 1, 0, 0, 1, 1, expected, __LINE__);
2849
2923
expected[0] = 0xCAFED00D, expected[1] = 0xCAFED00D;
2850
expected[2] = 0xCAFED00D, expected[3] = 0xCAFED00D;
2851
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2852
0, 0, 2, 2, 0, 0, 1, 1, expected, expected, __LINE__);
2854
expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
2855
expected[2] = 0x00000000, expected[3] = 0x00000000;
2856
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2857
0, 0, 1, 1, 0, 0, 2, 2, expected, expected, __LINE__);
2859
expected[0] = 0x76543210, expected[1] = 0xFEDCBA98;
2860
expected[2] = 0xFEEDFACE, expected[3] = 0xCAFED00D;
2861
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2862
0, 0, 2, 2, 1, 1, -2, -2, expected, expected, __LINE__);
2864
expected[0] = 0x76543210, expected[1] = 0xFEDCBA98;
2865
expected[2] = 0xFEEDFACE, expected[3] = 0xCAFED00D;
2866
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2867
1, 1, -2, -2, 0, 0, 2, 2, expected, expected, __LINE__);
2869
/* This result seems broken. One might expect the following result:
2870
* 0xCAFED00D 0xFEEDFACE
2871
* 0xFEDCBA98 0x76543210
2873
expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
2874
expected[2] = 0xFEDCBA98, expected[3] = 0x76543210;
2875
legacy_expected[0] = 0xCAFED00D, legacy_expected[1] = 0x00000000;
2876
legacy_expected[2] = 0x00000000, legacy_expected[3] = 0x00000000;
2877
todo_wine check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2878
1, 1, -2, -2, 1, 1, -2, -2, expected,
2879
legacy_expected, __LINE__);
2924
expected[16] = 0xCAFED00D, expected[17] = 0xCAFED00D;
2925
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2926
0, 0, 2, 2, 0, 0, 1, 1, expected, __LINE__);
2928
/* This is an example of the dst width (height) == 1 exception, explored below */
2929
expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
2930
expected[16] = 0x00000000, expected[17] = 0x00000000;
2931
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2932
0, 0, 1, 1, 0, 0, 2, 2, expected, __LINE__);
2934
expected[0] = 0x76543210, expected[1] = 0xFEDCBA98;
2935
expected[16] = 0xFEEDFACE, expected[17] = 0xCAFED00D;
2936
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2937
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
2939
expected[0] = 0x76543210, expected[1] = 0xFEDCBA98;
2940
expected[16] = 0xFEEDFACE, expected[17] = 0xCAFED00D;
2941
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2942
1, 1, -2, -2, 0, 0, 2, 2, expected, __LINE__);
2944
expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
2945
expected[16] = 0x00000000, expected[17] = 0x00000000;
2946
todo_wine check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2947
1, 1, -2, -2, 1, 1, -2, -2, expected, __LINE__);
2881
2949
expected[0] = 0x00000000, expected[1] = 0x00000000;
2882
expected[2] = 0x00000000, expected[3] = 0xCAFED00D;
2883
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2884
1, 1, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
2950
expected[16] = 0x00000000, expected[17] = 0xCAFED00D, expected[18] = 0xFEEDFACE;
2951
expected[32] = 0x00000000, expected[33] = 0xFEDCBA98, expected[34] = 0x76543210;
2953
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2954
1, 1, 2, 2, 0, 0, 2, 2, expected, __LINE__);
2956
/* when dst width is 1 merge src width - 1 pixels */
2957
memset( srcBuffer, 0, get_dib_image_size( &biSrc ) );
2958
srcBuffer[0] = 0x0000ff00, srcBuffer[1] = 0x0000f0f0, srcBuffer[2] = 0x0000cccc, srcBuffer[3] = 0x0000aaaa;
2959
srcBuffer[16] = 0xFEDCBA98, srcBuffer[17] = 0x76543210;
2961
memset( expected, 0, get_dib_image_size( &biDst ) );
2962
expected[0] = srcBuffer[0];
2963
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2964
0, 0, 1, 1, 0, 0, 2, 1, expected, __LINE__);
2966
expected[0] = srcBuffer[0] & srcBuffer[1];
2967
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2968
0, 0, 1, 1, 0, 0, 3, 1, expected, __LINE__);
2970
expected[0] = srcBuffer[0] & srcBuffer[1] & srcBuffer[2];
2971
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2972
0, 0, 1, 1, 0, 0, 4, 1, expected, __LINE__);
2974
/* this doesn't happen if the src width is -ve */
2975
expected[0] = srcBuffer[1] & srcBuffer[2];
2976
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2977
0, 0, 1, 1, 2, 0, -2, 1, expected, __LINE__);
2979
/* when dst width > 1 behaviour reverts to what one would expect */
2980
expected[0] = srcBuffer[0] & srcBuffer[1], expected[1] = srcBuffer[2] & srcBuffer[3];
2981
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2982
0, 0, 2, 1, 0, 0, 4, 1, expected, __LINE__);
2984
/* similarly in the vertical direction */
2985
memset( expected, 0, get_dib_image_size( &biDst ) );
2986
expected[0] = srcBuffer[0];
2987
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2988
0, 0, 1, 1, 0, 0, 1, 2, expected, __LINE__);
2990
/* check that it's the dst size in device units that needs to be 1 */
2991
SetMapMode( hdcDst, MM_ISOTROPIC );
2992
SetWindowExtEx( hdcDst, 200, 200, NULL );
2993
SetViewportExtEx( hdcDst, 100, 100, NULL );
2995
expected[0] = srcBuffer[0] & srcBuffer[1] & srcBuffer[2];
2996
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2997
0, 0, 2, 2, 0, 0, 4, 1, expected, __LINE__);
2998
SetMapMode( hdcDst, MM_TEXT );
2886
3000
SelectObject(hdcDst, oldDst);
2887
3001
DeleteObject(bmpDst);
2889
3003
/* Top-down to bottom-up tests */
2890
biDst.bmiHeader.biHeight = 2;
3004
memset( srcBuffer, 0, get_dib_image_size( &biSrc ) );
3005
srcBuffer[0] = 0xCAFED00D, srcBuffer[1] = 0xFEEDFACE;
3006
srcBuffer[16] = 0xFEDCBA98, srcBuffer[17] = 0x76543210;
3008
biDst.bmiHeader.biHeight = 16;
2891
3009
bmpDst = CreateDIBSection(hdcScreen, &biDst, DIB_RGB_COLORS, (void**)&dstBuffer,
2893
3011
oldDst = SelectObject(hdcDst, bmpDst);
2895
expected[0] = 0xFEDCBA98, expected[1] = 0x76543210;
2896
expected[2] = 0xCAFED00D, expected[3] = 0xFEEDFACE;
2897
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2898
0, 0, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
2900
expected[0] = 0xFEEDFACE, expected[1] = 0xCAFED00D;
2901
expected[2] = 0x76543210, expected[3] = 0xFEDCBA98;
2902
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2903
0, 0, 2, 2, 1, 1, -2, -2, expected, expected, __LINE__);
3013
memset( expected, 0, get_dib_image_size( &biDst ) );
3015
expected[224] = 0xFEDCBA98, expected[225] = 0x76543210;
3016
expected[240] = 0xCAFED00D, expected[241] = 0xFEEDFACE;
3017
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
3018
0, 0, 2, 2, 0, 0, 2, 2, expected, __LINE__);
3020
expected[224] = 0xFEEDFACE, expected[225] = 0xCAFED00D;
3021
expected[240] = 0x76543210, expected[241] = 0xFEDCBA98;
3022
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
3023
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
2905
3025
SelectObject(hdcSrc, oldSrc);
2906
3026
DeleteObject(bmpSrc);
2908
3028
/* Bottom-up to bottom-up tests */
2909
biSrc.bmiHeader.biHeight = 2;
3029
biSrc.bmiHeader.biHeight = 16;
2910
3030
bmpSrc = CreateDIBSection(hdcScreen, &biSrc, DIB_RGB_COLORS, (void**)&srcBuffer,
2912
srcBuffer[0] = 0xCAFED00D, srcBuffer[1] = 0xFEEDFACE;
2913
srcBuffer[2] = 0xFEDCBA98, srcBuffer[3] = 0x76543210;
3032
srcBuffer[224] = 0xCAFED00D, srcBuffer[225] = 0xFEEDFACE;
3033
srcBuffer[240] = 0xFEDCBA98, srcBuffer[241] = 0x76543210;
2914
3034
oldSrc = SelectObject(hdcSrc, bmpSrc);
2916
expected[0] = 0xCAFED00D, expected[1] = 0xFEEDFACE;
2917
expected[2] = 0xFEDCBA98, expected[3] = 0x76543210;
2918
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2919
0, 0, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
2921
expected[0] = 0x76543210, expected[1] = 0xFEDCBA98;
2922
expected[2] = 0xFEEDFACE, expected[3] = 0xCAFED00D;
2923
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2924
0, 0, 2, 2, 1, 1, -2, -2, expected, expected, __LINE__);
3036
memset( expected, 0, get_dib_image_size( &biDst ) );
3038
expected[224] = 0xCAFED00D, expected[225] = 0xFEEDFACE;
3039
expected[240] = 0xFEDCBA98, expected[241] = 0x76543210;
3040
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
3041
0, 0, 2, 2, 0, 0, 2, 2, expected, __LINE__);
3043
expected[224] = 0x76543210, expected[225] = 0xFEDCBA98;
3044
expected[240] = 0xFEEDFACE, expected[241] = 0xCAFED00D;
3045
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
3046
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
2926
3048
SelectObject(hdcDst, oldDst);
2927
3049
DeleteObject(bmpDst);
2929
3051
/* Bottom-up to top-down tests */
2930
biDst.bmiHeader.biHeight = -2;
3052
biDst.bmiHeader.biHeight = -16;
2931
3053
bmpDst = CreateDIBSection(hdcScreen, &biDst, DIB_RGB_COLORS, (void**)&dstBuffer,
2933
3055
oldDst = SelectObject(hdcDst, bmpDst);
3057
memset( expected, 0, get_dib_image_size( &biDst ) );
2935
3058
expected[0] = 0xFEDCBA98, expected[1] = 0x76543210;
2936
expected[2] = 0xCAFED00D, expected[3] = 0xFEEDFACE;
2937
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2938
0, 0, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
2940
expected[0] = 0xFEEDFACE, expected[1] = 0xCAFED00D;
2941
expected[2] = 0x76543210, expected[3] = 0xFEDCBA98;
2942
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
2943
0, 0, 2, 2, 1, 1, -2, -2, expected, expected, __LINE__);
2946
SelectObject(hdcSrc, oldSrc);
2947
DeleteObject(bmpSrc);
3059
expected[16] = 0xCAFED00D, expected[17] = 0xFEEDFACE;
3060
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
3061
0, 0, 2, 2, 0, 0, 2, 2, expected, __LINE__);
3063
expected[0] = 0xFEEDFACE, expected[1] = 0xCAFED00D;
3064
expected[16] = 0x76543210, expected[17] = 0xFEDCBA98;
3065
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
3066
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
3068
SelectObject(hdcSrc, oldSrc);
3069
DeleteObject(bmpSrc);
3071
biSrc.bmiHeader.biHeight = -2;
3072
biSrc.bmiHeader.biBitCount = 24;
3073
bmpSrc = CreateDIBSection(hdcScreen, &biSrc, DIB_RGB_COLORS, (void**)&srcBuffer, NULL, 0);
3074
oldSrc = SelectObject(hdcSrc, bmpSrc);
3076
memset( expected, 0, get_dib_image_size( &biDst ) );
3077
expected[0] = 0xFEEDFACE, expected[1] = 0xCAFED00D;
3078
expected[2] = 0x76543210, expected[3] = 0xFEDCBA98;
3079
memcpy(dstBuffer, expected, 4 * sizeof(*dstBuffer));
3080
StretchBlt(hdcSrc, 0, 0, 4, 1, hdcDst, 0, 0, 4, 1, SRCCOPY );
3081
memset(dstBuffer, 0x55, 4 * sizeof(*dstBuffer));
3082
StretchBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, 4, 1, SRCCOPY );
3083
expected[0] = 0x00EDFACE, expected[1] = 0x00FED00D;
3084
expected[2] = 0x00543210, expected[3] = 0x00DCBA98;
3085
ok(!memcmp(dstBuffer, expected, 16),
3086
"StretchBlt expected { %08X, %08X, %08X, %08X } got { %08X, %08X, %08X, %08X }\n",
3087
expected[0], expected[1], expected[2], expected[3],
3088
dstBuffer[0], dstBuffer[1], dstBuffer[2], dstBuffer[3] );
3090
expected[0] = 0xFEEDFACE, expected[1] = 0xCAFED00D;
3091
expected[2] = 0x76543210, expected[3] = 0xFEDCBA98;
3092
memcpy(srcBuffer, expected, 4 * sizeof(*dstBuffer));
3093
memset(dstBuffer, 0x55, 4 * sizeof(*dstBuffer));
3094
StretchBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, 4, 1, SRCCOPY );
3095
expected[0] = 0x00EDFACE, expected[1] = 0x00D00DFE;
3096
expected[2] = 0x0010CAFE, expected[3] = 0x00765432;
3097
ok(!memcmp(dstBuffer, expected, 16),
3098
"StretchBlt expected { %08X, %08X, %08X, %08X } got { %08X, %08X, %08X, %08X }\n",
3099
expected[0], expected[1], expected[2], expected[3],
3100
dstBuffer[0], dstBuffer[1], dstBuffer[2], dstBuffer[3] );
3102
SelectObject(hdcSrc, oldSrc);
3103
DeleteObject(bmpSrc);
3105
biSrc.bmiHeader.biBitCount = 1;
3106
bmpSrc = CreateDIBSection(hdcScreen, &biSrc, DIB_RGB_COLORS, (void**)&srcBuffer, NULL, 0);
3107
oldSrc = SelectObject(hdcSrc, bmpSrc);
3108
*((DWORD *)colors + 0) = 0x123456;
3109
*((DWORD *)colors + 1) = 0x335577;
3110
SetDIBColorTable( hdcSrc, 0, 2, colors );
3111
srcBuffer[0] = 0x55555555;
3112
memset(dstBuffer, 0xcc, 4 * sizeof(*dstBuffer));
3113
SetTextColor( hdcDst, 0 );
3114
SetBkColor( hdcDst, 0 );
3115
StretchBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, 4, 1, SRCCOPY );
3116
expected[0] = expected[2] = 0x00123456;
3117
expected[1] = expected[3] = 0x00335577;
3118
ok(!memcmp(dstBuffer, expected, 16),
3119
"StretchBlt expected { %08X, %08X, %08X, %08X } got { %08X, %08X, %08X, %08X }\n",
3120
expected[0], expected[1], expected[2], expected[3],
3121
dstBuffer[0], dstBuffer[1], dstBuffer[2], dstBuffer[3] );
3123
SelectObject(hdcSrc, oldSrc);
3124
DeleteObject(bmpSrc);
3126
bmpSrc = CreateBitmap( 16, 16, 1, 1, 0 );
3127
oldSrc = SelectObject(hdcSrc, bmpSrc);
3128
SetPixel( hdcSrc, 0, 0, 0 );
3129
SetPixel( hdcSrc, 1, 0, 0xffffff );
3130
SetPixel( hdcSrc, 2, 0, 0xffffff );
3131
SetPixel( hdcSrc, 3, 0, 0 );
3132
memset(dstBuffer, 0xcc, 4 * sizeof(*dstBuffer));
3133
SetTextColor( hdcDst, RGB(0x22,0x44,0x66) );
3134
SetBkColor( hdcDst, RGB(0x65,0x43,0x21) );
3135
StretchBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, 4, 1, SRCCOPY );
3136
expected[0] = expected[3] = 0x00224466;
3137
expected[1] = expected[2] = 0x00654321;
3138
ok(!memcmp(dstBuffer, expected, 16),
3139
"StretchBlt expected { %08X, %08X, %08X, %08X } got { %08X, %08X, %08X, %08X }\n",
3140
expected[0], expected[1], expected[2], expected[3],
3141
dstBuffer[0], dstBuffer[1], dstBuffer[2], dstBuffer[3] );
3143
SelectObject(hdcSrc, oldSrc);
3144
DeleteObject(bmpSrc);
2948
3146
DeleteDC(hdcSrc);
2950
3148
SelectObject(hdcDst, oldDst);
3060
3258
expected[0] = 0xCAFED00D, expected[1] = 0xFEEDFACE;
3061
3259
expected[2] = 0xFEDCBA98, expected[3] = 0x76543210;
3062
3260
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3063
0, 0, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
3261
0, 0, 2, 2, 0, 0, 2, 2, expected, __LINE__);
3065
3263
expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
3066
3264
expected[2] = 0x00000000, expected[3] = 0x00000000;
3067
legacy_expected[0] = 0xFEDCBA98, legacy_expected[1] = 0x00000000;
3068
legacy_expected[2] = 0x00000000, legacy_expected[3] = 0x00000000;
3069
3265
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3070
0, 0, 1, 1, 0, 0, 1, 1, expected, legacy_expected, __LINE__);
3266
0, 0, 1, 1, 0, 0, 1, 1, expected, __LINE__);
3072
3268
expected[0] = 0xFEDCBA98, expected[1] = 0xFEDCBA98;
3073
3269
expected[2] = 0xFEDCBA98, expected[3] = 0xFEDCBA98;
3074
3270
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3075
0, 0, 2, 2, 0, 0, 1, 1, expected, expected, __LINE__);
3271
0, 0, 2, 2, 0, 0, 1, 1, expected, __LINE__);
3077
3273
expected[0] = 0x42441000, expected[1] = 0x00000000;
3078
3274
expected[2] = 0x00000000, expected[3] = 0x00000000;
3079
legacy_expected[0] = 0x00543210, legacy_expected[1] = 0x00000000;
3080
legacy_expected[2] = 0x00000000, legacy_expected[3] = 0x00000000;
3081
todo_wine check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3082
0, 0, 1, 1, 0, 0, 2, 2, expected, legacy_expected, __LINE__);
3084
expected[0] = 0x00000000, expected[1] = 0x00000000;
3085
expected[2] = 0x00000000, expected[3] = 0x00000000;
3086
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3087
0, 0, 2, 2, 1, 1, -2, -2, expected, expected, __LINE__);
3089
expected[0] = 0x00000000, expected[1] = 0x00000000;
3090
expected[2] = 0x00000000, expected[3] = 0x00000000;
3091
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3092
0, 0, 2, 2, 1, 1, -2, -2, expected, expected, __LINE__);
3094
expected[0] = 0x00000000, expected[1] = 0x00000000;
3095
expected[2] = 0x00000000, expected[3] = 0x00000000;
3096
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3097
1, 1, -2, -2, 1, 1, -2, -2, expected, expected, __LINE__);
3275
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3276
0, 0, 1, 1, 0, 0, 2, 2, expected, __LINE__);
3278
expected[0] = 0x00000000, expected[1] = 0x00000000;
3279
expected[2] = 0x00000000, expected[3] = 0x00000000;
3280
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3281
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
3283
expected[0] = 0x00000000, expected[1] = 0x00000000;
3284
expected[2] = 0x00000000, expected[3] = 0x00000000;
3285
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3286
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
3288
expected[0] = 0x00000000, expected[1] = 0x00000000;
3289
expected[2] = 0x00000000, expected[3] = 0x00000000;
3290
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3291
1, 1, -2, -2, 1, 1, -2, -2, expected, __LINE__);
3099
3293
expected[0] = 0x00000000, expected[1] = 0x00000000;
3100
3294
expected[2] = 0x00000000, expected[3] = 0xCAFED00D;
3101
3295
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
3102
1, 1, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
3296
1, 1, 2, 2, 0, 0, 2, 2, expected, __LINE__);
3104
3298
SelectObject(hdcDst, oldDst);
3105
3299
DeleteObject(bmpDst);
3169
3360
blend.SourceConstantAlpha = 128;
3170
3361
blend.AlphaFormat = 0;
3172
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, 0, 20, 20, blend), TRUE, BOOL, "%d");
3173
SetLastError(0xdeadbeef);
3174
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, -1, 0, 10, 10, blend), FALSE, BOOL, "%d");
3175
expect_eq(GetLastError(), ERROR_INVALID_PARAMETER, int, "%d");
3176
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, -1, 10, 10, blend), FALSE, BOOL, "%d");
3177
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 15, 0, 10, 10, blend), FALSE, BOOL, "%d");
3178
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 10, 10, -2, 3, blend), FALSE, BOOL, "%d");
3179
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 10, 10, -2, 3, blend), FALSE, BOOL, "%d");
3363
SetLastError(0xdeadbeef);
3364
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, 0, 20, 20, blend);
3365
ok( ret, "GdiAlphaBlend failed err %u\n", GetLastError() );
3367
SetLastError(0xdeadbeef);
3368
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, -1, 0, 10, 10, blend);
3369
ok( !ret, "GdiAlphaBlend succeeded\n" );
3370
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3372
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, -1, 10, 10, blend);
3373
ok( !ret, "GdiAlphaBlend succeeded\n" );
3374
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 15, 0, 10, 10, blend);
3375
ok( !ret, "GdiAlphaBlend succeeded\n" );
3376
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 10, 10, -2, 3, blend);
3377
ok( !ret, "GdiAlphaBlend succeeded\n" );
3378
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 10, 10, -2, 3, blend);
3379
ok( !ret, "GdiAlphaBlend succeeded\n" );
3181
3381
SetWindowOrgEx(hdcSrc, -10, -10, NULL);
3182
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, -1, 0, 10, 10, blend), TRUE, BOOL, "%d");
3183
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, -1, 10, 10, blend), TRUE, BOOL, "%d");
3382
SetLastError(0xdeadbeef);
3383
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, -1, 0, 10, 10, blend);
3384
ok( ret, "GdiAlphaBlend failed err %u\n", GetLastError() );
3385
SetLastError(0xdeadbeef);
3386
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, -1, 10, 10, blend);
3387
ok( ret, "GdiAlphaBlend failed err %u\n", GetLastError() );
3184
3388
SetMapMode(hdcSrc, MM_ANISOTROPIC);
3185
3389
ScaleWindowExtEx(hdcSrc, 10, 1, 10, 1, NULL);
3186
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, -1, 0, 30, 30, blend), TRUE, BOOL, "%d");
3187
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, -1, 30, 30, blend), TRUE, BOOL, "%d");
3189
SetLastError(0xdeadbeef);
3190
expect_eq(pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, NULL, 0, 0, 20, 20, blend), FALSE, BOOL, "%d");
3191
expect_eq(GetLastError(), 0xdeadbeef, int, "%d");
3390
SetLastError(0xdeadbeef);
3391
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, -1, 0, 30, 30, blend);
3392
ok( ret, "GdiAlphaBlend failed err %u\n", GetLastError() );
3393
SetLastError(0xdeadbeef);
3394
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, -1, 30, 30, blend);
3395
ok( ret, "GdiAlphaBlend failed err %u\n", GetLastError() );
3397
SetLastError(0xdeadbeef);
3398
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, NULL, 0, 0, 20, 20, blend);
3399
ok( !ret, "GdiAlphaBlend succeeded\n" );
3400
ok( GetLastError() == 0xdeadbeef, "wrong error %u\n", GetLastError() );
3402
/* overlapping source and dest not allowed */
3404
SetLastError(0xdeadbeef);
3405
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcDst, 19, 19, 20, 20, blend);
3406
ok( !ret, "GdiAlphaBlend succeeded\n" );
3407
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3409
SetLastError(0xdeadbeef);
3410
ret = pGdiAlphaBlend(hdcDst, 20, 20, 20, 20, hdcDst, 1, 1, 20, 20, blend);
3411
ok( !ret, "GdiAlphaBlend succeeded\n" );
3412
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3414
SetLastError(0xdeadbeef);
3415
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcDst, 20, 10, 20, 20, blend);
3416
ok( ret, "GdiAlphaBlend succeeded\n" );
3417
SetLastError(0xdeadbeef);
3418
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcDst, 10, 20, 20, 20, blend);
3419
ok( ret, "GdiAlphaBlend succeeded\n" );
3421
/* AC_SRC_ALPHA requires 32-bpp BI_RGB format */
3423
blend.AlphaFormat = AC_SRC_ALPHA;
3424
SetLastError(0xdeadbeef);
3425
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, 0, 20, 20, blend);
3426
ok( ret, "GdiAlphaBlend failed err %u\n", GetLastError() );
3428
bmi->bmiHeader.biCompression = BI_BITFIELDS;
3429
((DWORD *)bmi->bmiColors)[0] = 0xff0000;
3430
((DWORD *)bmi->bmiColors)[1] = 0x00ff00;
3431
((DWORD *)bmi->bmiColors)[2] = 0x0000ff;
3432
bmpSrc = CreateDIBSection(hdcDst, bmi, DIB_RGB_COLORS, &bits, NULL, 0);
3433
ok(bmpSrc != NULL, "Couldn't create source bitmap\n");
3434
oldSrc = SelectObject(hdcSrc, bmpSrc);
3435
DeleteObject( oldSrc );
3437
SetLastError(0xdeadbeef);
3438
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, 0, 20, 20, blend);
3439
ok( ret, "GdiAlphaBlend failed err %u\n", GetLastError() );
3441
bmi->bmiHeader.biCompression = BI_BITFIELDS;
3442
((DWORD *)bmi->bmiColors)[0] = 0x0000ff;
3443
((DWORD *)bmi->bmiColors)[1] = 0x00ff00;
3444
((DWORD *)bmi->bmiColors)[2] = 0xff0000;
3445
bmpSrc = CreateDIBSection(hdcDst, bmi, DIB_RGB_COLORS, &bits, NULL, 0);
3446
ok(bmpSrc != NULL, "Couldn't create source bitmap\n");
3447
oldSrc = SelectObject(hdcSrc, bmpSrc);
3448
DeleteObject( oldSrc );
3450
SetLastError(0xdeadbeef);
3451
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, 0, 20, 20, blend);
3452
ok( !ret, "GdiAlphaBlend succeeded\n" );
3453
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3455
bmi->bmiHeader.biBitCount = 24;
3456
bmi->bmiHeader.biCompression = BI_RGB;
3457
bmpSrc = CreateDIBSection(hdcDst, bmi, DIB_RGB_COLORS, &bits, NULL, 0);
3458
ok(bmpSrc != NULL, "Couldn't create source bitmap\n");
3459
oldSrc = SelectObject(hdcSrc, bmpSrc);
3460
DeleteObject( oldSrc );
3462
SetLastError(0xdeadbeef);
3463
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, 0, 20, 20, blend);
3464
ok( !ret, "GdiAlphaBlend succeeded\n" );
3465
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3467
bmi->bmiHeader.biBitCount = 1;
3468
bmpSrc = CreateDIBSection(hdcDst, bmi, DIB_RGB_COLORS, &bits, NULL, 0);
3469
ok(bmpSrc != NULL, "Couldn't create source bitmap\n");
3470
oldSrc = SelectObject(hdcSrc, bmpSrc);
3471
DeleteObject( oldSrc );
3473
SetLastError(0xdeadbeef);
3474
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, 0, 20, 20, blend);
3475
ok( !ret, "GdiAlphaBlend succeeded\n" );
3476
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3478
bmpSrc = CreateBitmap( 100, 100, 1, 1, NULL );
3479
ok(bmpSrc != NULL, "Couldn't create source bitmap\n");
3480
oldSrc = SelectObject(hdcSrc, bmpSrc);
3481
DeleteObject( oldSrc );
3483
SetLastError(0xdeadbeef);
3484
ret = pGdiAlphaBlend(hdcDst, 0, 0, 20, 20, hdcSrc, 0, 0, 20, 20, blend);
3485
ok( !ret, "GdiAlphaBlend succeeded\n" );
3486
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3193
3488
SelectObject(hdcDst, oldDst);
3194
3489
SelectObject(hdcSrc, oldSrc);
3499
static void test_GdiGradientFill(void)
3506
GRADIENT_RECT rect[] = { { 0, 0 }, { 0, 1 }, { 2, 3 } };
3507
GRADIENT_TRIANGLE tri[] = { { 0, 0, 0 }, { 0, 1, 2 }, { 0, 2, 1 }, { 0, 1, 3 } };
3508
TRIVERTEX vt[3] = { { 2, 2, 0xff00, 0x0000, 0x0000, 0x8000 },
3509
{ 10, 10, 0x0000, 0xff00, 0x0000, 0x8000 },
3510
{ 20, 10, 0x0000, 0x0000, 0xff00, 0xff00 } };
3512
if (!pGdiGradientFill)
3514
win_skip( "GdiGradientFill is not implemented\n" );
3518
hdc = CreateCompatibleDC( NULL );
3519
bmi = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, FIELD_OFFSET( BITMAPINFO, bmiColors[3] ));
3520
bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
3521
bmi->bmiHeader.biHeight = 20;
3522
bmi->bmiHeader.biWidth = 20;
3523
bmi->bmiHeader.biBitCount = 32;
3524
bmi->bmiHeader.biPlanes = 1;
3525
bmi->bmiHeader.biCompression = BI_RGB;
3526
bmp = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, &bits, NULL, 0);
3527
ok( bmp != NULL, "couldn't create bitmap\n" );
3528
SelectObject( hdc, bmp );
3530
SetLastError( 0xdeadbeef );
3531
ret = pGdiGradientFill( hdc, vt, 3, rect, 1, GRADIENT_FILL_RECT_H );
3532
ok( ret, "GdiGradientFill failed err %u\n", GetLastError() );
3533
SetLastError( 0xdeadbeef );
3534
ret = pGdiGradientFill( hdc, vt, 3, rect, 1, 3 );
3535
ok( !ret, "GdiGradientFill succeeded\n" );
3536
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3537
SetLastError( 0xdeadbeef );
3538
ret = pGdiGradientFill( (HDC)0xdead, vt, 3, rect, 1, GRADIENT_FILL_RECT_H );
3539
ok( !ret, "GdiGradientFill succeeded\n" );
3540
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3541
SetLastError( 0xdeadbeef );
3542
ret = pGdiGradientFill( NULL, NULL, 0, rect, 1, GRADIENT_FILL_RECT_H );
3543
ok( !ret, "GdiGradientFill succeeded\n" );
3544
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3545
ret = pGdiGradientFill( hdc, NULL, 0, rect, 1, GRADIENT_FILL_RECT_H );
3546
ok( !ret, "GdiGradientFill succeeded\n" );
3547
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3548
SetLastError( 0xdeadbeef );
3549
ret = pGdiGradientFill( hdc, NULL, 3, rect, 1, GRADIENT_FILL_RECT_H );
3550
ok( !ret, "GdiGradientFill succeeded\n" );
3551
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3552
SetLastError( 0xdeadbeef );
3553
ret = pGdiGradientFill( hdc, vt, 3, NULL, 0, GRADIENT_FILL_RECT_H );
3554
ok( !ret, "GdiGradientFill succeeded\n" );
3555
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3556
SetLastError( 0xdeadbeef );
3557
ret = pGdiGradientFill( hdc, vt, 3, NULL, 1, GRADIENT_FILL_RECT_H );
3558
ok( !ret, "GdiGradientFill succeeded\n" );
3559
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3560
SetLastError( 0xdeadbeef );
3561
ret = pGdiGradientFill( hdc, vt, 3, rect, 0, GRADIENT_FILL_RECT_H );
3562
ok( !ret, "GdiGradientFill succeeded\n" );
3563
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3564
SetLastError( 0xdeadbeef );
3565
ret = pGdiGradientFill( hdc, vt, 3, rect, 3, GRADIENT_FILL_RECT_H );
3566
ok( !ret, "GdiGradientFill succeeded\n" );
3567
ok( GetLastError() == 0xdeadbeef, "wrong error %u\n", GetLastError() );
3568
rect[2].UpperLeft = rect[2].LowerRight = 1;
3569
SetLastError( 0xdeadbeef );
3570
ret = pGdiGradientFill( hdc, vt, 3, rect, 3, GRADIENT_FILL_RECT_H );
3571
ok( ret, "GdiGradientFill failed err %u\n", GetLastError() );
3572
SetLastError( 0xdeadbeef );
3573
ret = pGdiGradientFill( hdc, vt, 1, rect, 1, GRADIENT_FILL_RECT_H );
3574
ok( ret, "GdiGradientFill failed err %u\n", GetLastError() );
3575
SetLastError( 0xdeadbeef );
3576
ret = pGdiGradientFill( hdc, vt, 1, tri, 0, GRADIENT_FILL_TRIANGLE );
3577
ok( !ret, "GdiGradientFill succeeded\n" );
3578
ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3579
SetLastError( 0xdeadbeef );
3580
ret = pGdiGradientFill( hdc, vt, 1, tri, 1, GRADIENT_FILL_TRIANGLE );
3581
ok( ret, "GdiGradientFill failed err %u\n", GetLastError() );
3582
SetLastError( 0xdeadbeef );
3583
ret = pGdiGradientFill( hdc, vt, 3, tri, 2, GRADIENT_FILL_TRIANGLE );
3584
ok( ret, "GdiGradientFill failed err %u\n", GetLastError() );
3585
SetLastError( 0xdeadbeef );
3586
ret = pGdiGradientFill( hdc, vt, 3, tri, 3, GRADIENT_FILL_TRIANGLE );
3587
ok( ret, "GdiGradientFill failed err %u\n", GetLastError() );
3588
SetLastError( 0xdeadbeef );
3589
ret = pGdiGradientFill( hdc, vt, 3, tri, 4, GRADIENT_FILL_TRIANGLE );
3590
ok( !ret, "GdiGradientFill succeeded\n" );
3591
ok( GetLastError() == 0xdeadbeef, "wrong error %u\n", GetLastError() );
3593
SetLastError( 0xdeadbeef );
3594
ret = pGdiGradientFill( hdc, vt, 3, tri, 4, GRADIENT_FILL_TRIANGLE );
3595
ok( !ret, "GdiGradientFill succeeded\n" );
3596
ok( GetLastError() == 0xdeadbeef, "wrong error %u\n", GetLastError() );
3598
SetLastError( 0xdeadbeef );
3599
ret = pGdiGradientFill( hdc, vt, 3, tri, 4, GRADIENT_FILL_TRIANGLE );
3600
ok( !ret, "GdiGradientFill succeeded\n" );
3601
ok( GetLastError() == 0xdeadbeef, "wrong error %u\n", GetLastError() );
3602
tri[3].Vertex1 = tri[3].Vertex2 = tri[3].Vertex3 = 1;
3603
SetLastError( 0xdeadbeef );
3604
ret = pGdiGradientFill( hdc, vt, 3, tri, 4, GRADIENT_FILL_TRIANGLE );
3605
ok( ret, "GdiGradientFill failed err %u\n", GetLastError() );
3608
DeleteObject( bmp );
3204
3611
static void test_clipping(void)
3206
3613
HBITMAP bmpDst;