uxtheme: Resize source image if destination smaller than margins.
This commit is contained in:
parent
582b54329d
commit
2b650fa6db
|
@ -663,9 +663,9 @@ static HRESULT UXTHEME_DrawImageBackground(HTHEME hTheme, HDC hdc, int iPartId,
|
||||||
const DTBGOPTS *pOptions)
|
const DTBGOPTS *pOptions)
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
HBITMAP bmpSrc;
|
HBITMAP bmpSrc, bmpSrcResized = NULL;
|
||||||
HGDIOBJ oldSrc;
|
HGDIOBJ oldSrc;
|
||||||
HDC hdcSrc;
|
HDC hdcSrc, hdcOrigSrc = NULL;
|
||||||
RECT rcSrc;
|
RECT rcSrc;
|
||||||
RECT rcDst;
|
RECT rcDst;
|
||||||
POINT dstSize;
|
POINT dstSize;
|
||||||
|
@ -729,6 +729,34 @@ static HRESULT UXTHEME_DrawImageBackground(HTHEME hTheme, HDC hdc, int iPartId,
|
||||||
|
|
||||||
GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_SIZINGMARGINS, NULL, &sm);
|
GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_SIZINGMARGINS, NULL, &sm);
|
||||||
|
|
||||||
|
/* Resize source image if destination smaller than margins */
|
||||||
|
if (sm.cyTopHeight + sm.cyBottomHeight > dstSize.y || sm.cxLeftWidth + sm.cxRightWidth > dstSize.x) {
|
||||||
|
if (sm.cyTopHeight + sm.cyBottomHeight > dstSize.y) {
|
||||||
|
sm.cyTopHeight = MulDiv(sm.cyTopHeight, dstSize.y, srcSize.y);
|
||||||
|
sm.cyBottomHeight = dstSize.y - sm.cyTopHeight;
|
||||||
|
srcSize.y = dstSize.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sm.cxLeftWidth + sm.cxRightWidth > dstSize.x) {
|
||||||
|
sm.cxLeftWidth = MulDiv(sm.cxLeftWidth, dstSize.x, srcSize.x);
|
||||||
|
sm.cxRightWidth = dstSize.x - sm.cxLeftWidth;
|
||||||
|
srcSize.x = dstSize.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
hdcOrigSrc = hdcSrc;
|
||||||
|
hdcSrc = CreateCompatibleDC(NULL);
|
||||||
|
bmpSrcResized = CreateBitmap(srcSize.x, srcSize.y, 1, 32, NULL);
|
||||||
|
SelectObject(hdcSrc, bmpSrcResized);
|
||||||
|
|
||||||
|
UXTHEME_StretchBlt(hdcSrc, 0, 0, srcSize.x, srcSize.y, hdcOrigSrc, rcSrc.left, rcSrc.top,
|
||||||
|
rcSrc.right - rcSrc.left, rcSrc.bottom - rcSrc.top, transparent, transparentcolor);
|
||||||
|
|
||||||
|
rcSrc.left = 0;
|
||||||
|
rcSrc.top = 0;
|
||||||
|
rcSrc.right = srcSize.x;
|
||||||
|
rcSrc.bottom = srcSize.y;
|
||||||
|
}
|
||||||
|
|
||||||
hdcDst = hdc;
|
hdcDst = hdc;
|
||||||
OffsetViewportOrgEx(hdcDst, rcDst.left, rcDst.top, &org);
|
OffsetViewportOrgEx(hdcDst, rcDst.left, rcDst.top, &org);
|
||||||
|
|
||||||
|
@ -833,6 +861,8 @@ draw_error:
|
||||||
}
|
}
|
||||||
SelectObject(hdcSrc, oldSrc);
|
SelectObject(hdcSrc, oldSrc);
|
||||||
DeleteDC(hdcSrc);
|
DeleteDC(hdcSrc);
|
||||||
|
if (bmpSrcResized) DeleteObject(bmpSrcResized);
|
||||||
|
if (hdcOrigSrc) DeleteDC(hdcOrigSrc);
|
||||||
CopyRect(pRect, &rcDst);
|
CopyRect(pRect, &rcDst);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue