winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
August 2021
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
1 participants
1051 discussions
Start a n
N
ew thread
Akihiro Sagawa : user32/tests: Test pending redraw state with owner-drawn list box.
by Alexandre Julliard
12 Aug '21
12 Aug '21
Module: wine Branch: master Commit: a70ed810d59dbbcaaa65db515ee92b9b985323ff URL:
https://source.winehq.org/git/wine.git/?a=commit;h=a70ed810d59dbbcaaa65db51…
Author: Akihiro Sagawa <sagawa.aki(a)gmail.com> Date: Thu Aug 12 21:17:40 2021 +0900 user32/tests: Test pending redraw state with owner-drawn list box. Signed-off-by: Akihiro Sagawa <sagawa.aki(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/tests/listbox.c | 51 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/dlls/user32/tests/listbox.c b/dlls/user32/tests/listbox.c index cd372f8ac59..7d0ae5a2157 100644 --- a/dlls/user32/tests/listbox.c +++ b/dlls/user32/tests/listbox.c @@ -238,7 +238,7 @@ static void check_item_height(void) DestroyWindow (hLB); } -static int got_selchange; +static unsigned int got_selchange, got_drawitem; static LRESULT WINAPI main_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { @@ -293,6 +293,7 @@ static LRESULT WINAPI main_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARA trace("item rect %s\n", wine_dbgstr_rect(&rc_item)); ok(EqualRect(&dis->rcItem, &rc_item), "item rects are not equal\n"); + got_drawitem++; break; } @@ -343,6 +344,19 @@ static void test_ownerdraw(void) 0, LBS_NODATA }; + static const struct { + UINT message; + WPARAM wparam; + LPARAM lparam; + UINT drawitem; + } testcase[] = { + { WM_NULL, 0, 0, 0 }, + { WM_PAINT, 0, 0, 0 }, + { LB_GETCOUNT, 0, 0, 0 }, + { LB_SETCOUNT, ARRAY_SIZE(strings), 0, ARRAY_SIZE(strings) }, + { LB_ADDSTRING, 0, (LPARAM)"foo", ARRAY_SIZE(strings)+1 }, + { LB_DELETESTRING, 0, 0, ARRAY_SIZE(strings)-1 }, + }; HWND parent, hLB; INT ret; RECT rc; @@ -405,6 +419,41 @@ static void test_ownerdraw(void) DestroyWindow (hLB); } + + /* test pending redraw state */ + for (i = 0; i < ARRAY_SIZE(testcase); i++) + { + winetest_push_context("%d", i); + hLB = create_listbox(LBS_OWNERDRAWFIXED | LBS_NODATA | WS_CHILD | WS_VISIBLE, parent); + assert(hLB); + + ret = SendMessageA(hLB, WM_SETREDRAW, FALSE, 0); + ok(!ret, "got %d\n", ret); + ret = SendMessageA(hLB, testcase[i].message, testcase[i].wparam, testcase[i].lparam); + if (testcase[i].message >= LB_ADDSTRING && testcase[i].message < LB_MSGMAX && + testcase[i].message != LB_SETCOUNT) + ok(ret > 0, "expected > 0, got %d\n", ret); + else + ok(!ret, "expected 0, got %d\n", ret); + + got_drawitem = 0; + ret = RedrawWindow(hLB, NULL, 0, RDW_UPDATENOW); + ok(ret, "RedrawWindow failed\n"); + ok(!got_drawitem, "got %u\n", got_drawitem); + + ret = SendMessageA(hLB, WM_SETREDRAW, TRUE, 0); + ok(!ret, "got %d\n", ret); + + got_drawitem = 0; + ret = RedrawWindow(hLB, NULL, 0, RDW_UPDATENOW); + ok(ret, "RedrawWindow failed\n"); + todo_wine_if(testcase[i].message == LB_SETCOUNT) + ok(got_drawitem == testcase[i].drawitem, "expected %u, got %u\n", testcase[i].drawitem, got_drawitem); + + DestroyWindow(hLB); + winetest_pop_context(); + } + DestroyWindow(parent); }
1
0
0
0
Jacek Caban : gdi32/tests: Add more metafile blitting tests.
by Alexandre Julliard
12 Aug '21
12 Aug '21
Module: wine Branch: master Commit: 6a14662521aca6b9f63e504875437831bb7cd53f URL:
https://source.winehq.org/git/wine.git/?a=commit;h=6a14662521aca6b9f63e5048…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 12 12:00:39 2021 +0200 gdi32/tests: Add more metafile blitting tests. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/gdi32/tests/metafile.c | 299 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=6a14662521aca6b9f63e…
1
0
0
0
Jacek Caban : gdi32: Use NtGdiAlphaBlend for GdiAlphaBlend.
by Alexandre Julliard
12 Aug '21
12 Aug '21
Module: wine Branch: master Commit: 2f7b9e29e475a3f2e8572439104afe4badd90d8c URL:
https://source.winehq.org/git/wine.git/?a=commit;h=2f7b9e29e475a3f2e8572439…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 12 12:00:31 2021 +0200 gdi32: Use NtGdiAlphaBlend for GdiAlphaBlend. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/gdi32/bitblt.c | 8 ++++---- dlls/gdi32/enhmfdrv/bitblt.c | 13 ++++++++++--- dlls/gdi32/gdi_private.h | 3 +++ dlls/gdi32/gdidc.c | 19 +++++++++++++++++++ include/ntgdi.h | 3 +++ 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c index fd505b13407..0024234ac2d 100644 --- a/dlls/gdi32/bitblt.c +++ b/dlls/gdi32/bitblt.c @@ -935,11 +935,11 @@ error: } /****************************************************************************** - * GdiAlphaBlend [GDI32.@] + * NtGdiAlphaBlend (win32u.@) */ -BOOL WINAPI GdiAlphaBlend(HDC hdcDst, int xDst, int yDst, int widthDst, int heightDst, - HDC hdcSrc, int xSrc, int ySrc, int widthSrc, int heightSrc, - BLENDFUNCTION blendFunction) +BOOL WINAPI NtGdiAlphaBlend( HDC hdcDst, int xDst, int yDst, int widthDst, int heightDst, + HDC hdcSrc, int xSrc, int ySrc, int widthSrc, int heightSrc, + BLENDFUNCTION blendFunction, HANDLE xform ) { BOOL ret = FALSE; DC *dcDst, *dcSrc; diff --git a/dlls/gdi32/enhmfdrv/bitblt.c b/dlls/gdi32/enhmfdrv/bitblt.c index 9d930d17591..73959da2ec4 100644 --- a/dlls/gdi32/enhmfdrv/bitblt.c +++ b/dlls/gdi32/enhmfdrv/bitblt.c @@ -158,12 +158,19 @@ err: return ret; } +BOOL EMFDC_AlphaBlend( DC_ATTR *dc_attr, INT x_dst, INT y_dst, INT width_dst, INT height_dst, + HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src, + BLENDFUNCTION blend_function ) +{ + return emfdrv_stretchblt( dc_attr->emf, x_dst, y_dst, width_dst, height_dst, hdc_src, x_src, y_src, + width_src, height_src, *(DWORD *)&blend_function, EMR_ALPHABLEND ); +} + BOOL CDECL EMFDRV_AlphaBlend( PHYSDEV dev_dst, struct bitblt_coords *dst, PHYSDEV dev_src, struct bitblt_coords *src, BLENDFUNCTION func ) { - return emfdrv_stretchblt( dev_dst, dst->log_x, dst->log_y, dst->log_width, dst->log_height, - dev_src->hdc, src->log_x, src->log_y, src->log_width, src->log_height, - *(DWORD *)&func, EMR_ALPHABLEND ); + /* FIXME: update bound rect */ + return TRUE; } BOOL CDECL EMFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop ) diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 3b99eb49d5d..305dec43c7f 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -112,6 +112,9 @@ extern BOOL METADC_StretchBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width_dst, /* enhanced metafiles */ extern BOOL EMFDC_AbortPath( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN; +extern BOOL EMFDC_AlphaBlend( DC_ATTR *dc_attr, INT x_dst, INT y_dst, INT width_dst, INT height_dst, + HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src, + BLENDFUNCTION blend_function ); extern BOOL EMFDC_AngleArc( DC_ATTR *dc_attr, INT x, INT y, DWORD radius, FLOAT start, FLOAT sweep ) DECLSPEC_HIDDEN; extern BOOL EMFDC_ArcChordPie( DC_ATTR *dc_attr, INT left, INT top, INT right, diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c index 685396f6893..b8faf9fb58c 100644 --- a/dlls/gdi32/gdidc.c +++ b/dlls/gdi32/gdidc.c @@ -1235,6 +1235,25 @@ BOOL WINAPI StretchBlt( HDC hdc, INT x_dst, INT y_dst, INT width_dst, INT height height_src, rop, 0 /* FIXME */ ); } +/****************************************************************************** + * GdiAlphaBlend (GDI32.@) + */ +BOOL WINAPI GdiAlphaBlend( HDC hdc_dst, int x_dst, int y_dst, int width_dst, int height_dst, + HDC hdc_src, int x_src, int y_src, int width_src, int height_src, + BLENDFUNCTION blend_function) +{ + DC_ATTR *dc_attr; + + if (!(dc_attr = get_dc_attr( hdc_dst ))) return FALSE; + if (dc_attr->emf && !EMFDC_AlphaBlend( dc_attr, x_dst, y_dst, width_dst, height_dst, + hdc_src, x_src, y_src, width_src, + height_src, blend_function )) + return FALSE; + return NtGdiAlphaBlend( hdc_dst, x_dst, y_dst, width_dst, height_dst, + hdc_src, x_src, y_src, width_src, height_src, + blend_function, 0 /* FIXME */ ); +} + /*********************************************************************** * BeginPath (GDI32.@) */ diff --git a/include/ntgdi.h b/include/ntgdi.h index 63547f5bd4a..5d67798052a 100644 --- a/include/ntgdi.h +++ b/include/ntgdi.h @@ -145,6 +145,9 @@ typedef struct DC_ATTR INT WINAPI NtGdiAbortDoc( HDC hdc ); BOOL WINAPI NtGdiAbortPath( HDC hdc ); +BOOL WINAPI NtGdiAlphaBlend( HDC hdc_dst, int x_dst, int y_dst, int width_dst, int height_dst, + HDC hdc_src, int x_src, int y_src, int width_src, int height_src, + BLENDFUNCTION blend_function, HANDLE xform ); BOOL WINAPI NtGdiAngleArc( HDC hdc, INT x, INT y, DWORD radius, FLOAT start_angle, FLOAT sweep_angle ); BOOL WINAPI NtGdiArcInternal( UINT type, HDC hdc, INT left, INT top, INT right, INT bottom,
1
0
0
0
Jacek Caban : gdi32: Use NtGdiBitBlt for BitBlt.
by Alexandre Julliard
12 Aug '21
12 Aug '21
Module: wine Branch: master Commit: 23ac1c6e62849e616c333238f093eae5c7cd516c URL:
https://source.winehq.org/git/wine.git/?a=commit;h=23ac1c6e62849e616c333238…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 12 12:00:25 2021 +0200 gdi32: Use NtGdiBitBlt for BitBlt. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/gdi32/bitblt.c | 9 ++++----- dlls/gdi32/enhmfdrv/bitblt.c | 12 ++++++++---- dlls/gdi32/gdi_private.h | 4 ++++ dlls/gdi32/gdidc.c | 18 ++++++++++++++++++ dlls/gdi32/mfdrv/bitblt.c | 42 +++++++++++++++++++++++++++--------------- include/ntgdi.h | 2 ++ 6 files changed, 63 insertions(+), 24 deletions(-) diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c index df3c658c53b..fd505b13407 100644 --- a/dlls/gdi32/bitblt.c +++ b/dlls/gdi32/bitblt.c @@ -569,12 +569,11 @@ BOOL WINAPI NtGdiPatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWOR /*********************************************************************** * BitBlt (GDI32.@) */ -BOOL WINAPI DECLSPEC_HOTPATCH BitBlt( HDC hdcDst, INT xDst, INT yDst, INT width, - INT height, HDC hdcSrc, INT xSrc, INT ySrc, DWORD rop ) +BOOL WINAPI NtGdiBitBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width, INT height, + HDC hdc_src, INT x_src, INT y_src, DWORD rop, DWORD bk_color, FLONG fl ) { - if (!rop_uses_src( rop )) return PatBlt( hdcDst, xDst, yDst, width, height, rop ); - else return StretchBlt( hdcDst, xDst, yDst, width, height, - hdcSrc, xSrc, ySrc, width, height, rop ); + return NtGdiStretchBlt( hdc_dst, x_dst, y_dst, width, height, + hdc_src, x_src, y_src, width, height, rop, bk_color ); } diff --git a/dlls/gdi32/enhmfdrv/bitblt.c b/dlls/gdi32/enhmfdrv/bitblt.c index 8bd30ffb671..9d930d17591 100644 --- a/dlls/gdi32/enhmfdrv/bitblt.c +++ b/dlls/gdi32/enhmfdrv/bitblt.c @@ -215,15 +215,19 @@ static inline BOOL rop_uses_src( DWORD rop ) return ((rop >> 2) & 0x330000) != (rop & 0x330000); } +BOOL EMFDC_BitBlt( DC_ATTR *dc_attr, INT x_dst, INT y_dst, INT width, INT height, + HDC hdc_src, INT x_src, INT y_src, DWORD rop ) +{ + if (!rop_uses_src( rop )) return EMFDC_PatBlt( dc_attr, x_dst, y_dst, width, height, rop ); + return emfdrv_stretchblt( dc_attr->emf, x_dst, y_dst, width, height, + hdc_src, x_src, y_src, width, height, rop, EMR_BITBLT ); +} + BOOL EMFDC_StretchBlt( DC_ATTR *dc_attr, INT x_dst, INT y_dst, INT width_dst, INT height_dst, HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src, DWORD rop ) { if (!rop_uses_src( rop )) return EMFDC_PatBlt( dc_attr, x_dst, y_dst, width_dst, height_dst, rop ); - if (width_src == width_dst && height_src == height_dst) - return emfdrv_stretchblt( dc_attr->emf, x_dst, y_dst, width_dst, height_dst, - hdc_src, x_src, y_src, width_src, - height_src, rop, EMR_BITBLT ); return emfdrv_stretchblt( dc_attr->emf, x_dst, y_dst, width_dst, height_dst, hdc_src, x_src, y_src, width_src, height_src, rop, EMR_STRETCHBLT ); diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 44542f4ca26..3b99eb49d5d 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -48,6 +48,8 @@ static inline BOOL is_meta_dc( HDC hdc ) extern BOOL METADC_Arc( HDC hdc, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN; +extern BOOL METADC_BitBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width, INT height, + HDC hdc_src, INT x_src, INT y_src, DWORD rop ); extern BOOL METADC_Chord( HDC hdc, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN; extern BOOL METADC_Ellipse( HDC hdc, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; @@ -116,6 +118,8 @@ extern BOOL EMFDC_ArcChordPie( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend, DWORD type ) DECLSPEC_HIDDEN; extern BOOL EMFDC_BeginPath( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN; +extern BOOL EMFDC_BitBlt( DC_ATTR *dc_attr, INT x_dst, INT y_dst, INT width, INT height, + HDC hdc_src, INT x_src, INT y_src, DWORD rop ); extern BOOL EMFDC_CloseFigure( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN; extern BOOL EMFDC_Ellipse( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c index f0b46fda854..685396f6893 100644 --- a/dlls/gdi32/gdidc.c +++ b/dlls/gdi32/gdidc.c @@ -1195,6 +1195,24 @@ BOOL WINAPI PatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop return NtGdiPatBlt( hdc, left, top, width, height, rop ); } +/*********************************************************************** + * BitBlt (GDI32.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH BitBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width, INT height, + HDC hdc_src, INT x_src, INT y_src, DWORD rop ) +{ + DC_ATTR *dc_attr; + + if (is_meta_dc( hdc_dst )) return METADC_BitBlt( hdc_dst, x_dst, y_dst, width, height, + hdc_src, x_src, y_src, rop ); + if (!(dc_attr = get_dc_attr( hdc_dst ))) return FALSE; + if (dc_attr->emf && !EMFDC_BitBlt( dc_attr, x_dst, y_dst, width, height, + hdc_src, x_src, y_src, rop )) + return FALSE; + return NtGdiBitBlt( hdc_dst, x_dst, y_dst, width, height, + hdc_src, x_src, y_src, rop, 0 /* FIXME */, 0 /* FIXME */ ); +} + /*********************************************************************** * StretchBlt (GDI32.@) */ diff --git a/dlls/gdi32/mfdrv/bitblt.c b/dlls/gdi32/mfdrv/bitblt.c index 9bbecff9283..def8b5f9ee1 100644 --- a/dlls/gdi32/mfdrv/bitblt.c +++ b/dlls/gdi32/mfdrv/bitblt.c @@ -37,10 +37,11 @@ BOOL METADC_PatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop static BOOL metadc_stretchblt( HDC hdc, INT x_dst, INT y_dst, INT width_dst, INT height_dst, HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src, - DWORD rop ) + DWORD rop, WORD type ) { BITMAPINFO src_info = {{ sizeof( src_info.bmiHeader ) }}; UINT bmi_size, size, bpp; + int i = 0, bitmap_offset; BITMAPINFO *bmi; METARECORD *mr; HBITMAP bitmap; @@ -57,11 +58,12 @@ static BOOL metadc_stretchblt( HDC hdc, INT x_dst, INT y_dst, INT width_dst, INT else bmi_size = sizeof(BITMAPINFOHEADER); - size = FIELD_OFFSET( METARECORD, rdParm[10] ) + bmi_size + + bitmap_offset = type == META_DIBBITBLT ? 8 : 10; + size = FIELD_OFFSET( METARECORD, rdParm[bitmap_offset] ) + bmi_size + src_info.bmiHeader.biSizeImage; if (!(mr = HeapAlloc( GetProcessHeap(), 0, size ))) return FALSE; - mr->rdFunction = META_DIBSTRETCHBLT; - bmi = (BITMAPINFO *)&mr->rdParm[10]; + mr->rdFunction = type; + bmi = (BITMAPINFO *)&mr->rdParm[bitmap_offset]; bmi->bmiHeader = src_info.bmiHeader; TRACE( "size = %u rop=%x\n", size, rop ); @@ -70,16 +72,19 @@ static BOOL metadc_stretchblt( HDC hdc, INT x_dst, INT y_dst, INT width_dst, INT if (ret) { mr->rdSize = size / sizeof(WORD); - mr->rdParm[0] = LOWORD(rop); - mr->rdParm[1] = HIWORD(rop); - mr->rdParm[2] = height_src; - mr->rdParm[3] = width_src; - mr->rdParm[4] = y_src; - mr->rdParm[5] = x_src; - mr->rdParm[6] = height_dst; - mr->rdParm[7] = width_dst; - mr->rdParm[8] = y_dst; - mr->rdParm[9] = x_dst; + mr->rdParm[i++] = LOWORD(rop); + mr->rdParm[i++] = HIWORD(rop); + if (bitmap_offset > 8) + { + mr->rdParm[i++] = height_src; + mr->rdParm[i++] = width_src; + } + mr->rdParm[i++] = y_src; + mr->rdParm[i++] = x_src; + mr->rdParm[i++] = height_dst; + mr->rdParm[i++] = width_dst; + mr->rdParm[i++] = y_dst; + mr->rdParm[i++] = x_dst; ret = metadc_record( hdc, mr, size ); } @@ -88,6 +93,13 @@ static BOOL metadc_stretchblt( HDC hdc, INT x_dst, INT y_dst, INT width_dst, INT } +BOOL METADC_BitBlt( HDC hdc, INT x_dst, INT y_dst, INT width, INT height, + HDC hdc_src, INT x_src, INT y_src, DWORD rop ) +{ + return metadc_stretchblt( hdc, x_dst, y_dst, width, height, + hdc_src, x_src, y_src, width, height, rop, META_DIBBITBLT ); +} + /*********************************************************************** * METADC_StretchBlt */ @@ -96,7 +108,7 @@ BOOL METADC_StretchBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width_dst, INT he DWORD rop ) { return metadc_stretchblt( hdc_dst, x_dst, y_dst, width_dst, height_dst, - hdc_src, x_src, y_src, width_src, height_src, rop ); + hdc_src, x_src, y_src, width_src, height_src, rop, META_DIBSTRETCHBLT ); } /*********************************************************************** diff --git a/include/ntgdi.h b/include/ntgdi.h index 37d627d4666..63547f5bd4a 100644 --- a/include/ntgdi.h +++ b/include/ntgdi.h @@ -150,6 +150,8 @@ BOOL WINAPI NtGdiAngleArc( HDC hdc, INT x, INT y, DWORD radius, FLOAT start_ BOOL WINAPI NtGdiArcInternal( UINT type, HDC hdc, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ); BOOL WINAPI NtGdiBeginPath( HDC hdc ); +BOOL WINAPI NtGdiBitBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width, INT height, HDC hdc_src, + INT x_src, INT y_src, DWORD rop, DWORD bk_color, FLONG fl ); BOOL WINAPI NtGdiCancelDC( HDC hdc ); BOOL WINAPI NtGdiCloseFigure( HDC hdc ); INT WINAPI NtGdiCombineRgn( HRGN dest, HRGN src1, HRGN src2, INT mode );
1
0
0
0
Jacek Caban : gdi32: Use NtGdiStretchBlt for StretchBlt.
by Alexandre Julliard
12 Aug '21
12 Aug '21
Module: wine Branch: master Commit: 8b5ae114216c26bbe9e1334758bf971b54ed742a URL:
https://source.winehq.org/git/wine.git/?a=commit;h=8b5ae114216c26bbe9e13347…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 12 12:00:13 2021 +0200 gdi32: Use NtGdiStretchBlt for StretchBlt. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/gdi32/bitblt.c | 9 +++++---- dlls/gdi32/enhmfdrv/bitblt.c | 25 ++++++++++++++++--------- dlls/gdi32/enhmfdrv/enhmetafiledrv.h | 2 -- dlls/gdi32/enhmfdrv/init.c | 2 +- dlls/gdi32/gdi_private.h | 6 ++++++ dlls/gdi32/gdidc.c | 22 ++++++++++++++++++++++ dlls/gdi32/mfdrv/bitblt.c | 12 ++++++------ dlls/gdi32/mfdrv/init.c | 2 +- dlls/gdi32/mfdrv/metafiledrv.h | 2 -- include/ntgdi.h | 3 +++ 10 files changed, 60 insertions(+), 25 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=8b5ae114216c26bbe9e1…
1
0
0
0
Jacek Caban : gdi32: Use GetDIBits instead of GetObject in MFDRV_StretchBlt.
by Alexandre Julliard
12 Aug '21
12 Aug '21
Module: wine Branch: master Commit: 7f9d847b9bcc21fc03fdd6beb2cb3285c2285b2b URL:
https://source.winehq.org/git/wine.git/?a=commit;h=7f9d847b9bcc21fc03fdd6be…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 12 12:00:05 2021 +0200 gdi32: Use GetDIBits instead of GetObject in MFDRV_StretchBlt. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/gdi32/mfdrv/bitblt.c | 130 +++++++++++++++++++--------------------------- 1 file changed, 52 insertions(+), 78 deletions(-) diff --git a/dlls/gdi32/mfdrv/bitblt.c b/dlls/gdi32/mfdrv/bitblt.c index a08d6ef6608..a3ebd2feadd 100644 --- a/dlls/gdi32/mfdrv/bitblt.c +++ b/dlls/gdi32/mfdrv/bitblt.c @@ -35,96 +35,70 @@ BOOL METADC_PatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop } -/*********************************************************************** - * MFDRV_StretchBlt - * this function contains TWO ways for processing StretchBlt in metafiles, - * decide between rdFunction values META_STRETCHBLT or META_DIBSTRETCHBLT - * via #define STRETCH_VIA_DIB - */ -#define STRETCH_VIA_DIB - -BOOL CDECL MFDRV_StretchBlt( PHYSDEV devDst, struct bitblt_coords *dst, - PHYSDEV devSrc, struct bitblt_coords *src, DWORD rop ) +static BOOL metadc_stretchblt( HDC hdc, INT x_dst, INT y_dst, INT width_dst, INT height_dst, + HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src, + DWORD rop ) { - BOOL ret; - DWORD len; + BITMAPINFO src_info = {{ sizeof( src_info.bmiHeader ) }}; + UINT bmi_size, size, bpp; + BITMAPINFO *bmi; METARECORD *mr; - BITMAP BM; -#ifdef STRETCH_VIA_DIB - LPBITMAPINFOHEADER lpBMI; - WORD nBPP; -#endif - HBITMAP hBitmap = GetCurrentObject(devSrc->hdc, OBJ_BITMAP); + HBITMAP bitmap; + BOOL ret; - if (devSrc->funcs == devDst->funcs) return FALSE; /* can't use a metafile DC as source */ + if (!(bitmap = GetCurrentObject( hdc_src, OBJ_BITMAP ))) return FALSE; + if (!GetDIBits( hdc_src, bitmap, 0, INT_MAX, NULL, &src_info, DIB_RGB_COLORS )) return FALSE; - if (GetObjectW(hBitmap, sizeof(BITMAP), &BM) != sizeof(BITMAP)) - { - WARN("bad bitmap object %p passed for hdc %p\n", hBitmap, devSrc->hdc); - return FALSE; - } -#ifdef STRETCH_VIA_DIB - nBPP = BM.bmPlanes * BM.bmBitsPixel; - if(nBPP > 8) nBPP = 24; /* FIXME Can't get 16bpp to work for some reason */ - len = sizeof(METARECORD) + 10 * sizeof(INT16) - + sizeof(BITMAPINFOHEADER) + (nBPP <= 8 ? 1 << nBPP: 0) * sizeof(RGBQUAD) - + get_dib_stride( BM.bmWidth, nBPP ) * BM.bmHeight; - if (!(mr = HeapAlloc( GetProcessHeap(), 0, len))) - return FALSE; + bpp = src_info.bmiHeader.biBitCount; + if (bpp <= 8) + bmi_size = sizeof(BITMAPINFOHEADER) + (1 << bpp) * sizeof(RGBQUAD); + else if (bpp == 16 || bpp == 32) + bmi_size = sizeof(BITMAPINFOHEADER) + 3 * sizeof(RGBQUAD); + else + bmi_size = sizeof(BITMAPINFOHEADER); + + size = FIELD_OFFSET( METARECORD, rdParm[10] ) + bmi_size + + src_info.bmiHeader.biSizeImage; + if (!(mr = HeapAlloc( GetProcessHeap(), 0, size ))) return FALSE; mr->rdFunction = META_DIBSTRETCHBLT; - lpBMI=(LPBITMAPINFOHEADER)(mr->rdParm+10); - lpBMI->biSize = sizeof(BITMAPINFOHEADER); - lpBMI->biWidth = BM.bmWidth; - lpBMI->biHeight = BM.bmHeight; - lpBMI->biPlanes = 1; - lpBMI->biBitCount = nBPP; - lpBMI->biSizeImage = get_dib_image_size( (BITMAPINFO *)lpBMI ); - lpBMI->biClrUsed = nBPP <= 8 ? 1 << nBPP : 0; - lpBMI->biCompression = BI_RGB; - lpBMI->biXPelsPerMeter = MulDiv(GetDeviceCaps(devSrc->hdc,LOGPIXELSX),3937,100); - lpBMI->biYPelsPerMeter = MulDiv(GetDeviceCaps(devSrc->hdc,LOGPIXELSY),3937,100); - lpBMI->biClrImportant = 0; /* 1 meter = 39.37 inch */ - - TRACE("MF_StretchBltViaDIB->len = %d rop=%x PixYPM=%d Caps=%d\n", - len,rop,lpBMI->biYPelsPerMeter,GetDeviceCaps(devSrc->hdc, LOGPIXELSY)); - - if (GetDIBits(devSrc->hdc, hBitmap, 0, (UINT)lpBMI->biHeight, - (LPSTR)lpBMI + get_dib_info_size( (BITMAPINFO *)lpBMI, DIB_RGB_COLORS ), - (LPBITMAPINFO)lpBMI, DIB_RGB_COLORS)) -#else - len = sizeof(METARECORD) + 15 * sizeof(INT16) + BM.bmWidthBytes * BM.bmHeight; - if (!(mr = HeapAlloc( GetProcessHeap(), 0, len ))) - return FALSE; - mr->rdFunction = META_STRETCHBLT; - *(mr->rdParm +10) = BM.bmWidth; - *(mr->rdParm +11) = BM.bmHeight; - *(mr->rdParm +12) = BM.bmWidthBytes; - *(mr->rdParm +13) = BM.bmPlanes; - *(mr->rdParm +14) = BM.bmBitsPixel; - TRACE("len = %ld rop=%lx\n", len, rop); - if (GetBitmapBits( hBitmap, BM.bmWidthBytes * BM.bmHeight, mr->rdParm + 15)) -#endif + bmi = (BITMAPINFO *)&mr->rdParm[10]; + bmi->bmiHeader = src_info.bmiHeader; + TRACE( "size = %u rop=%x\n", size, rop ); + + ret = GetDIBits( hdc_src, bitmap, 0, src_info.bmiHeader.biHeight, (BYTE *)bmi + bmi_size, + bmi, DIB_RGB_COLORS ); + if (ret) { - mr->rdSize = len / sizeof(INT16); - *(mr->rdParm) = LOWORD(rop); - *(mr->rdParm + 1) = HIWORD(rop); - *(mr->rdParm + 2) = src->log_height; - *(mr->rdParm + 3) = src->log_width; - *(mr->rdParm + 4) = src->log_y; - *(mr->rdParm + 5) = src->log_x; - *(mr->rdParm + 6) = dst->log_height; - *(mr->rdParm + 7) = dst->log_width; - *(mr->rdParm + 8) = dst->log_y; - *(mr->rdParm + 9) = dst->log_x; - ret = MFDRV_WriteRecord( devDst, mr, mr->rdSize * 2); + mr->rdSize = size / sizeof(WORD); + mr->rdParm[0] = LOWORD(rop); + mr->rdParm[1] = HIWORD(rop); + mr->rdParm[2] = height_src; + mr->rdParm[3] = width_src; + mr->rdParm[4] = y_src; + mr->rdParm[5] = x_src; + mr->rdParm[6] = height_dst; + mr->rdParm[7] = width_dst; + mr->rdParm[8] = y_dst; + mr->rdParm[9] = x_dst; + ret = metadc_record( hdc, mr, size ); } - else - ret = FALSE; + HeapFree( GetProcessHeap(), 0, mr); return ret; } +/*********************************************************************** + * MFDRV_StretchBlt + */ +BOOL CDECL MFDRV_StretchBlt( PHYSDEV devDst, struct bitblt_coords *dst, + PHYSDEV devSrc, struct bitblt_coords *src, DWORD rop ) +{ + return metadc_stretchblt( devDst->hdc, dst->log_x, dst->log_y, dst->log_width, dst->log_height, + devSrc->hdc, src->log_x, src->log_y, src->log_width, src->log_height, + rop ); +} + /*********************************************************************** * MFDRV_StretchDIBits */
1
0
0
0
Jacek Caban : gdi32: Don't use bitblt_coords in emfdrv_stretchblt.
by Alexandre Julliard
12 Aug '21
12 Aug '21
Module: wine Branch: master Commit: 7659c6ff7dacc594c29916571c87fb6f349c9db7 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=7659c6ff7dacc594c2991657…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 12 11:59:59 2021 +0200 gdi32: Don't use bitblt_coords in emfdrv_stretchblt. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/gdi32/enhmfdrv/bitblt.c | 46 +++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/dlls/gdi32/enhmfdrv/bitblt.c b/dlls/gdi32/enhmfdrv/bitblt.c index e1d90c281c4..87c6fc22300 100644 --- a/dlls/gdi32/enhmfdrv/bitblt.c +++ b/dlls/gdi32/enhmfdrv/bitblt.c @@ -28,8 +28,9 @@ #include "enhmetafiledrv.h" /* Generate an EMRBITBLT, EMRSTRETCHBLT or EMRALPHABLEND record depending on the type parameter */ -static BOOL emfdrv_stretchblt( PHYSDEV dev_dst, struct bitblt_coords *dst, HDC hdc_src, - struct bitblt_coords *src, DWORD rop, DWORD type ) +static BOOL emfdrv_stretchblt( PHYSDEV dev_dst, INT x_dst, INT y_dst, INT width_dst, INT height_dst, + HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src, + DWORD rop, DWORD type ) { BITMAPINFO src_info = {{ sizeof( src_info.bmiHeader ) }}; UINT bmi_size, emr_size, size, bpp; @@ -115,21 +116,21 @@ static BOOL emfdrv_stretchblt( PHYSDEV dev_dst, struct bitblt_coords *dst, HDC h emr->emr.iType = type; emr->emr.nSize = size; - emr->rclBounds.left = dst->log_x; - emr->rclBounds.top = dst->log_y; - emr->rclBounds.right = dst->log_x + dst->log_width - 1; - emr->rclBounds.bottom = dst->log_y + dst->log_height - 1; - emr->xDest = dst->log_x; - emr->yDest = dst->log_y; - emr->cxDest = dst->log_width; - emr->cyDest = dst->log_height; - emr->xSrc = src->log_x; - emr->ySrc = src->log_y; + emr->rclBounds.left = x_dst; + emr->rclBounds.top = y_dst; + emr->rclBounds.right = x_dst + width_dst - 1; + emr->rclBounds.bottom = y_dst + height_dst - 1; + emr->xDest = x_dst; + emr->yDest = y_dst; + emr->cxDest = width_dst; + emr->cyDest = height_dst; + emr->xSrc = x_src; + emr->ySrc = y_src; if (type == EMR_STRETCHBLT || type == EMR_ALPHABLEND) { EMRSTRETCHBLT *emr_stretchblt = (EMRSTRETCHBLT *)emr; - emr_stretchblt->cxSrc = src->log_width; - emr_stretchblt->cySrc = src->log_height; + emr_stretchblt->cxSrc = width_src; + emr_stretchblt->cySrc = height_src; } emr->dwRop = rop; NtGdiGetTransform( hdc_src, 0x204, &emr->xformSrc ); @@ -160,7 +161,9 @@ err: BOOL CDECL EMFDRV_AlphaBlend( PHYSDEV dev_dst, struct bitblt_coords *dst, PHYSDEV dev_src, struct bitblt_coords *src, BLENDFUNCTION func ) { - return emfdrv_stretchblt( dev_dst, dst, dev_src->hdc, src, *(DWORD *)&func, EMR_ALPHABLEND ); + return emfdrv_stretchblt( dev_dst, dst->log_x, dst->log_y, dst->log_width, dst->log_height, + dev_src->hdc, src->log_x, src->log_y, src->log_width, src->log_height, + *(DWORD *)&func, EMR_ALPHABLEND ); } BOOL CDECL EMFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop ) @@ -207,13 +210,16 @@ BOOL EMFDC_PatBlt( DC_ATTR *dc_attr, INT left, INT top, INT width, INT height, D return ret; } -BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, struct bitblt_coords *dst, - PHYSDEV devSrc, struct bitblt_coords *src, DWORD rop ) +BOOL CDECL EMFDRV_StretchBlt( PHYSDEV dev_dst, struct bitblt_coords *dst, + PHYSDEV dev_src, struct bitblt_coords *src, DWORD rop ) { if (src->log_width == dst->log_width && src->log_height == dst->log_height) - return emfdrv_stretchblt( devDst, dst, devSrc->hdc, src, rop, EMR_BITBLT ); - else - return emfdrv_stretchblt( devDst, dst, devSrc->hdc, src, rop, EMR_STRETCHBLT ); + return emfdrv_stretchblt( dev_dst, dst->log_x, dst->log_y, dst->log_width, dst->log_height, + dev_src->hdc, src->log_x, src->log_y, src->log_width, src->log_height, + rop, EMR_BITBLT ); + return emfdrv_stretchblt( dev_dst, dst->log_x, dst->log_y, dst->log_width, dst->log_height, + dev_src->hdc, src->log_x, src->log_y, src->log_width, src->log_height, + rop, EMR_STRETCHBLT ); } INT CDECL EMFDRV_StretchDIBits( PHYSDEV dev, INT xDst, INT yDst, INT widthDst, INT heightDst,
1
0
0
0
Jacek Caban : gdi32: Use GetDIBits in emfdrv_stretchblt.
by Alexandre Julliard
12 Aug '21
12 Aug '21
Module: wine Branch: master Commit: 77c97174149a53ba06f6826fe6f4451c48adeef8 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=77c97174149a53ba06f6826f…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 12 11:59:53 2021 +0200 gdi32: Use GetDIBits in emfdrv_stretchblt. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/gdi32/enhmfdrv/bitblt.c | 133 +++++++++++++++++++++++++++---------------- 1 file changed, 84 insertions(+), 49 deletions(-) diff --git a/dlls/gdi32/enhmfdrv/bitblt.c b/dlls/gdi32/enhmfdrv/bitblt.c index ca3455459e5..e1d90c281c4 100644 --- a/dlls/gdi32/enhmfdrv/bitblt.c +++ b/dlls/gdi32/enhmfdrv/bitblt.c @@ -20,51 +20,98 @@ #include <stdarg.h> #include <string.h> +#include <assert.h> #include "windef.h" #include "winbase.h" #include "wingdi.h" #include "enhmetafiledrv.h" -#include "wine/debug.h" /* Generate an EMRBITBLT, EMRSTRETCHBLT or EMRALPHABLEND record depending on the type parameter */ -static BOOL emfdrv_stretchblt( PHYSDEV dev_dst, struct bitblt_coords *dst, PHYSDEV dev_src, +static BOOL emfdrv_stretchblt( PHYSDEV dev_dst, struct bitblt_coords *dst, HDC hdc_src, struct bitblt_coords *src, DWORD rop, DWORD type ) { - unsigned char src_buffer[FIELD_OFFSET(BITMAPINFO, bmiColors[256])]; - BITMAPINFO *src_info = (BITMAPINFO *)src_buffer; - UINT bits_size, bmi_size, emr_size, size, bpp; - EMRSTRETCHBLT *emr_stretchblt; - struct gdi_image_bits bits; + BITMAPINFO src_info = {{ sizeof( src_info.bmiHeader ) }}; + UINT bmi_size, emr_size, size, bpp; + HBITMAP bitmap, blit_bitmap = NULL; + EMRBITBLT *emr = NULL; BITMAPINFO *bmi; - EMRBITBLT *emr; - DC *dc_src; - DWORD err; + DIBSECTION dib; + HDC blit_dc; + int info_size; BOOL ret = FALSE; - dc_src = get_physdev_dc(dev_src); - dev_src = GET_DC_PHYSDEV(dc_src, pGetImage); - err = dev_src->funcs->pGetImage(dev_src, src_info, &bits, src); - if (err) + if (!(bitmap = GetCurrentObject( hdc_src, OBJ_BITMAP ))) return FALSE; + if (!(info_size = GetObjectW( bitmap, sizeof(dib), &dib ))) return FALSE; + + if (info_size == sizeof(DIBSECTION)) { - SetLastError(err); - return FALSE; + blit_dc = hdc_src; + blit_bitmap = bitmap; } + else + { + unsigned char dib_info_buffer[FIELD_OFFSET(BITMAPINFO, bmiColors[256])]; + BITMAPINFO *dib_info = (BITMAPINFO *)dib_info_buffer; + BITMAP bmp = dib.dsBm; + HPALETTE palette; + void *bits; + + assert( info_size == sizeof(BITMAP) ); + + dib_info->bmiHeader.biSize = sizeof(dib_info->bmiHeader); + dib_info->bmiHeader.biWidth = bmp.bmWidth; + dib_info->bmiHeader.biHeight = bmp.bmHeight; + dib_info->bmiHeader.biPlanes = 1; + dib_info->bmiHeader.biBitCount = bmp.bmBitsPixel; + dib_info->bmiHeader.biCompression = BI_RGB; + dib_info->bmiHeader.biSizeImage = 0; + dib_info->bmiHeader.biXPelsPerMeter = 0; + dib_info->bmiHeader.biYPelsPerMeter = 0; + dib_info->bmiHeader.biClrUsed = 0; + dib_info->bmiHeader.biClrImportant = 0; + switch (dib_info->bmiHeader.biBitCount) + { + case 16: + ((DWORD *)dib_info->bmiColors)[0] = 0xf800; + ((DWORD *)dib_info->bmiColors)[1] = 0x07e0; + ((DWORD *)dib_info->bmiColors)[2] = 0x001f; + break; + case 32: + ((DWORD *)dib_info->bmiColors)[0] = 0xff0000; + ((DWORD *)dib_info->bmiColors)[1] = 0x00ff00; + ((DWORD *)dib_info->bmiColors)[2] = 0x0000ff; + break; + default: + if (dib_info->bmiHeader.biBitCount > 8) break; + if (!(palette = GetCurrentObject( hdc_src, OBJ_PAL ))) return FALSE; + if (!GetPaletteEntries( palette, 0, 256, (PALETTEENTRY *)dib_info->bmiColors )) + return FALSE; + } + + if (!(blit_dc = NtGdiCreateCompatibleDC( hdc_src ))) return FALSE; + if (!(blit_bitmap = CreateDIBSection( blit_dc, dib_info, DIB_RGB_COLORS, &bits, NULL, 0 ))) + goto err; + if (!SelectObject( blit_dc, blit_bitmap )) goto err; + if (!BitBlt( blit_dc, 0, 0, bmp.bmWidth, bmp.bmHeight, hdc_src, 0, 0, SRCCOPY )) + goto err; + } + if (!GetDIBits( blit_dc, blit_bitmap, 0, INT_MAX, NULL, &src_info, DIB_RGB_COLORS )) + goto err; - bpp = src_info->bmiHeader.biBitCount; + bpp = src_info.bmiHeader.biBitCount; if (bpp <= 8) bmi_size = sizeof(BITMAPINFOHEADER) + (1 << bpp) * sizeof(RGBQUAD); else if (bpp == 16 || bpp == 32) bmi_size = sizeof(BITMAPINFOHEADER) + 3 * sizeof(RGBQUAD); else bmi_size = sizeof(BITMAPINFOHEADER); + /* EMRSTRETCHBLT and EMRALPHABLEND have the same structure */ emr_size = type == EMR_BITBLT ? sizeof(EMRBITBLT) : sizeof(EMRSTRETCHBLT); - bits_size = src_info->bmiHeader.biSizeImage; - size = emr_size + bmi_size + bits_size; + size = emr_size + bmi_size + src_info.bmiHeader.biSizeImage; - emr = HeapAlloc(GetProcessHeap(), 0, size); - if (!emr) goto err; + if (!(emr = HeapAlloc(GetProcessHeap(), 0, size))) goto err; emr->emr.iType = type; emr->emr.nSize = size; @@ -80,52 +127,40 @@ static BOOL emfdrv_stretchblt( PHYSDEV dev_dst, struct bitblt_coords *dst, PHYSD emr->ySrc = src->log_y; if (type == EMR_STRETCHBLT || type == EMR_ALPHABLEND) { - emr_stretchblt = (EMRSTRETCHBLT *)emr; + EMRSTRETCHBLT *emr_stretchblt = (EMRSTRETCHBLT *)emr; emr_stretchblt->cxSrc = src->log_width; emr_stretchblt->cySrc = src->log_height; } emr->dwRop = rop; - NtGdiGetTransform( dev_src->hdc, 0x204, &emr->xformSrc ); - emr->crBkColorSrc = GetBkColor(dev_src->hdc); + NtGdiGetTransform( hdc_src, 0x204, &emr->xformSrc ); + emr->crBkColorSrc = GetBkColor( hdc_src ); emr->iUsageSrc = DIB_RGB_COLORS; emr->offBmiSrc = emr_size; emr->cbBmiSrc = bmi_size; emr->offBitsSrc = emr_size + bmi_size; - emr->cbBitsSrc = bits_size; + emr->cbBitsSrc = src_info.bmiHeader.biSizeImage; bmi = (BITMAPINFO *)((BYTE *)emr + emr->offBmiSrc); - memcpy(bmi, src_info, bmi_size); - memcpy((BYTE *)emr + emr->offBitsSrc, bits.ptr, bits_size); - - bmi->bmiHeader.biClrUsed = 0; - if (bmi->bmiHeader.biCompression == BI_RGB && bmi->bmiHeader.biBitCount == 16) - { - bmi->bmiHeader.biCompression = BI_BITFIELDS; - ((DWORD *)bmi->bmiColors)[0] = 0xf800; - ((DWORD *)bmi->bmiColors)[1] = 0x07e0; - ((DWORD *)bmi->bmiColors)[2] = 0x001f; - } - else if (bmi->bmiHeader.biCompression == BI_RGB && bmi->bmiHeader.biBitCount == 32) + bmi->bmiHeader = src_info.bmiHeader; + ret = GetDIBits( blit_dc, blit_bitmap, 0, src_info.bmiHeader.biHeight, (BYTE *)emr + emr->offBitsSrc, + bmi, DIB_RGB_COLORS ); + if (ret) { - bmi->bmiHeader.biCompression = BI_BITFIELDS; - ((DWORD *)bmi->bmiColors)[0] = 0xff0000; - ((DWORD *)bmi->bmiColors)[1] = 0x00ff00; - ((DWORD *)bmi->bmiColors)[2] = 0x0000ff; + ret = EMFDRV_WriteRecord( dev_dst, (EMR *)emr ); + if (ret) EMFDRV_UpdateBBox( dev_dst, &emr->rclBounds ); } - ret = EMFDRV_WriteRecord(dev_dst, (EMR *)emr); - if (ret) EMFDRV_UpdateBBox(dev_dst, &emr->rclBounds); - err: - HeapFree(GetProcessHeap(), 0, emr); - if (bits.free) bits.free(&bits); + HeapFree( GetProcessHeap(), 0, emr ); + if (blit_bitmap && blit_bitmap != bitmap) DeleteObject( blit_bitmap ); + if (blit_dc && blit_dc != hdc_src) DeleteDC( blit_dc ); return ret; } BOOL CDECL EMFDRV_AlphaBlend( PHYSDEV dev_dst, struct bitblt_coords *dst, PHYSDEV dev_src, struct bitblt_coords *src, BLENDFUNCTION func ) { - return emfdrv_stretchblt(dev_dst, dst, dev_src, src, *(DWORD *)&func, EMR_ALPHABLEND); + return emfdrv_stretchblt( dev_dst, dst, dev_src->hdc, src, *(DWORD *)&func, EMR_ALPHABLEND ); } BOOL CDECL EMFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop ) @@ -176,9 +211,9 @@ BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, struct bitblt_coords *dst, PHYSDEV devSrc, struct bitblt_coords *src, DWORD rop ) { if (src->log_width == dst->log_width && src->log_height == dst->log_height) - return emfdrv_stretchblt(devDst, dst, devSrc, src, rop, EMR_BITBLT); + return emfdrv_stretchblt( devDst, dst, devSrc->hdc, src, rop, EMR_BITBLT ); else - return emfdrv_stretchblt(devDst, dst, devSrc, src, rop, EMR_STRETCHBLT); + return emfdrv_stretchblt( devDst, dst, devSrc->hdc, src, rop, EMR_STRETCHBLT ); } INT CDECL EMFDRV_StretchDIBits( PHYSDEV dev, INT xDst, INT yDst, INT widthDst, INT heightDst,
1
0
0
0
Huw Davies : nsiproxy: Don't use the key size to determine the address family as it can be zero.
by Alexandre Julliard
12 Aug '21
12 Aug '21
Module: wine Branch: master Commit: 8f37560faf130eecd137c14db39555952edf9aaa URL:
https://source.winehq.org/git/wine.git/?a=commit;h=8f37560faf130eecd137c14d…
Author: Huw Davies <huw(a)codeweavers.com> Date: Thu Aug 12 10:38:18 2021 +0100 nsiproxy: Don't use the key size to determine the address family as it can be zero. Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/nsiproxy.sys/ip.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/dlls/nsiproxy.sys/ip.c b/dlls/nsiproxy.sys/ip.c index ae3e23960de..c5d98fa93f2 100644 --- a/dlls/nsiproxy.sys/ip.c +++ b/dlls/nsiproxy.sys/ip.c @@ -722,7 +722,7 @@ static void unicast_fill_entry( struct ifaddrs *entry, void *key, struct nsi_ip_ if (stat) stat->creation_time = get_boot_time(); } -static NTSTATUS ip_unicast_enumerate_all( void *key_data, DWORD key_size, void *rw_data, DWORD rw_size, +static NTSTATUS ip_unicast_enumerate_all( int family, void *key_data, DWORD key_size, void *rw_data, DWORD rw_size, void *dynamic_data, DWORD dynamic_size, void *static_data, DWORD static_size, DWORD_PTR *count ) { @@ -730,7 +730,6 @@ static NTSTATUS ip_unicast_enumerate_all( void *key_data, DWORD key_size, void * NTSTATUS status = STATUS_SUCCESS; BOOL want_data = key_size || rw_size || dynamic_size || static_size; struct ifaddrs *addrs, *entry; - int family = (key_size == sizeof(struct nsi_ipv4_unicast_key)) ? AF_INET : AF_INET6; TRACE( "%p %d %p %d %p %d %p %d %p\n", key_data, key_size, rw_data, rw_size, dynamic_data, dynamic_size, static_data, static_size, count ); @@ -760,6 +759,22 @@ static NTSTATUS ip_unicast_enumerate_all( void *key_data, DWORD key_size, void * return status; } +static NTSTATUS ipv4_unicast_enumerate_all( void *key_data, DWORD key_size, void *rw_data, DWORD rw_size, + void *dynamic_data, DWORD dynamic_size, + void *static_data, DWORD static_size, DWORD_PTR *count ) +{ + return ip_unicast_enumerate_all( AF_INET, key_data, key_size, rw_data, rw_size, + dynamic_data, dynamic_size, static_data, static_size, count ); +} + +static NTSTATUS ipv6_unicast_enumerate_all( void *key_data, DWORD key_size, void *rw_data, DWORD rw_size, + void *dynamic_data, DWORD dynamic_size, + void *static_data, DWORD static_size, DWORD_PTR *count ) +{ + return ip_unicast_enumerate_all( AF_INET6, key_data, key_size, rw_data, rw_size, + dynamic_data, dynamic_size, static_data, static_size, count ); +} + static NTSTATUS ip_unicast_get_all_parameters( const void *key, DWORD key_size, void *rw_data, DWORD rw_size, void *dynamic_data, DWORD dynamic_size, void *static_data, DWORD static_size ) @@ -1263,7 +1278,7 @@ static struct module_table ipv4_tables[] = sizeof(struct nsi_ipv4_unicast_key), sizeof(struct nsi_ip_unicast_rw), sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static) }, - ip_unicast_enumerate_all, + ipv4_unicast_enumerate_all, ip_unicast_get_all_parameters, }, { @@ -1328,7 +1343,7 @@ static struct module_table ipv6_tables[] = sizeof(struct nsi_ipv6_unicast_key), sizeof(struct nsi_ip_unicast_rw), sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static) }, - ip_unicast_enumerate_all, + ipv6_unicast_enumerate_all, ip_unicast_get_all_parameters, }, {
1
0
0
0
Huw Davies : iphlpapi: Implement GetIcmpStatistics() on top of GetIcmpStatisticsEx().
by Alexandre Julliard
12 Aug '21
12 Aug '21
Module: wine Branch: master Commit: 5b99e791cebd17a265db205a3d57dc7242117c98 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=5b99e791cebd17a265db205a…
Author: Huw Davies <huw(a)codeweavers.com> Date: Thu Aug 12 10:38:17 2021 +0100 iphlpapi: Implement GetIcmpStatistics() on top of GetIcmpStatisticsEx(). Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/iphlpapi/iphlpapi_main.c | 41 ++++++++++ dlls/iphlpapi/ipstats.c | 170 ------------------------------------------ 2 files changed, 41 insertions(+), 170 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=5b99e791cebd17a265db…
1
0
0
0
← Newer
1
...
62
63
64
65
66
67
68
...
106
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
Results per page:
10
25
50
100
200