[ros-dev] [ros-diffs] [gadamopoulos] 74457: [UXTHEME] -Use GdiDrawStream in UXTHEME_DrawImageGlyph and UXTHEME_DrawImageBackground.
Peter Hater
7element at mail.bg
Thu May 4 14:52:08 UTC 2017
A test program run on windows can prove me wrong, but I doubt it...
Also wrong assumptions are not uncommon, but looking at the struct that is passed I would assume exactly that.
BR,
Peter
> On May 4, 2017, at 17:31, Giannis Adamopoulos <giannis.adamopoulos at reactos.org> wrote:
>
> Hi, are you sure that 1 means original and 9 means nine grid? I kept fields that I don't know what are for as ... unknown.
>
>
> Peter Hater <7element at mail.bg> wrote on Wed, May 3rd, 2017, 8:23 PM:
>> Hi,
>>
>> Why not use constant for 0x44727753 and rename unknown1 and unknown2 to srcImageType and dstImageType (or something similar) and use defines for these types also 1 = OriginalImage, 9 = NineGridImage (or similar).
>> This will make code a little bit less magical :) IMHO
>>
>> BR,
>> Peter
>>
>>> On May 3, 2017, at 14:13, gadamopoulos at svn.reactos.org wrote:
>>>
>>> Author: gadamopoulos
>>> Date: Wed May 3 11:13:23 2017
>>> New Revision: 74457
>>>
>>> URL: http://svn.reactos.org/svn/reactos?rev=74457&view=rev
>>> Log:
>>> [UXTHEME] -Use GdiDrawStream in UXTHEME_DrawImageGlyph and UXTHEME_DrawImageBackground.
>>>
>>> Modified:
>>> trunk/reactos/dll/win32/uxtheme/draw.c
>>> trunk/reactos/dll/win32/uxtheme/uxthemep.h
>>>
>>> Modified: trunk/reactos/dll/win32/uxtheme/draw.c
>>> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/draw.c?rev=74457&r1=74456&r2=74457&view=diff
>>> ==============================================================================
>>> --- trunk/reactos/dll/win32/uxtheme/draw.c [iso-8859-1] (original)
>>> +++ trunk/reactos/dll/win32/uxtheme/draw.c [iso-8859-1] Wed May 3 11:13:23 2017
>>> @@ -269,163 +269,6 @@
>>> return S_OK;
>>> }
>>>
>>> -/***********************************************************************
>>> - * UXTHEME_StretchBlt
>>> - *
>>> - * Pseudo TransparentBlt/StretchBlt
>>> - */
>>> -static inline BOOL UXTHEME_StretchBlt(HDC hdcDst, int nXOriginDst, int nYOriginDst, int nWidthDst, int nHeightDst,
>>> - HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,
>>> - INT transparent, COLORREF transcolor)
>>> -{
>>> - static const BLENDFUNCTION blendFunc =
>>> - {
>>> - AC_SRC_OVER, /* BlendOp */
>>> - 0, /* BlendFlag */
>>> - 255, /* SourceConstantAlpha */
>>> - AC_SRC_ALPHA /* AlphaFormat */
>>> - };
>>> -
>>> - BOOL ret = TRUE;
>>> - int old_stretch_mode;
>>> - POINT old_brush_org;
>>> -
>>> - old_stretch_mode = SetStretchBltMode(hdcDst, HALFTONE);
>>> - SetBrushOrgEx(hdcDst, nXOriginDst, nYOriginDst, &old_brush_org);
>>> -
>>> - if (transparent == ALPHABLEND_BINARY) {
>>> - /* Ensure we don't pass any negative values to TransparentBlt */
>>> - ret = TransparentBlt(hdcDst, nXOriginDst, nYOriginDst, abs(nWidthDst), abs(nHeightDst),
>>> - hdcSrc, nXOriginSrc, nYOriginSrc, abs(nWidthSrc), abs(nHeightSrc),
>>> - transcolor);
>>> - } else if ((transparent == ALPHABLEND_NONE) ||
>>> - !AlphaBlend(hdcDst, nXOriginDst, nYOriginDst, nWidthDst, nHeightDst,
>>> - hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc,
>>> - blendFunc))
>>> - {
>>> - ret = StretchBlt(hdcDst, nXOriginDst, nYOriginDst, nWidthDst, nHeightDst,
>>> - hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc,
>>> - SRCCOPY);
>>> - }
>>> -
>>> - SetBrushOrgEx(hdcDst, old_brush_org.x, old_brush_org.y, NULL);
>>> - SetStretchBltMode(hdcDst, old_stretch_mode);
>>> -
>>> - return ret;
>>> -}
>>> -
>>> -/***********************************************************************
>>> - * UXTHEME_Blt
>>> - *
>>> - * Simplify sending same width/height for both source and dest
>>> - */
>>> -static inline BOOL UXTHEME_Blt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,
>>> - HDC hdcSrc, int nXOriginSrc, int nYOriginSrc,
>>> - INT transparent, COLORREF transcolor)
>>> -{
>>> - return UXTHEME_StretchBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
>>> - hdcSrc, nXOriginSrc, nYOriginSrc, nWidthDest, nHeightDest,
>>> - transparent, transcolor);
>>> -}
>>> -
>>> -/***********************************************************************
>>> - * UXTHEME_SizedBlt
>>> - *
>>> - * Stretches or tiles, depending on sizingtype.
>>> - */
>>> -static inline BOOL UXTHEME_SizedBlt (HDC hdcDst, int nXOriginDst, int nYOriginDst,
>>> - int nWidthDst, int nHeightDst,
>>> - HDC hdcSrc, int nXOriginSrc, int nYOriginSrc,
>>> - int nWidthSrc, int nHeightSrc,
>>> - int sizingtype,
>>> - INT transparent, COLORREF transcolor)
>>> -{
>>> - if (sizingtype == ST_TILE)
>>> - {
>>> - HDC hdcTemp;
>>> - BOOL result = FALSE;
>>> -
>>> - if (!nWidthSrc || !nHeightSrc) return TRUE;
>>> -
>>> - /* For destination width/height less than or equal to source
>>> - width/height, do not bother with memory bitmap optimization */
>>> - if (nWidthSrc >= nWidthDst && nHeightSrc >= nHeightDst)
>>> - {
>>> - int bltWidth = min (nWidthDst, nWidthSrc);
>>> - int bltHeight = min (nHeightDst, nHeightSrc);
>>> -
>>> - return UXTHEME_Blt (hdcDst, nXOriginDst, nYOriginDst, bltWidth, bltHeight,
>>> - hdcSrc, nXOriginSrc, nYOriginSrc,
>>> - transparent, transcolor);
>>> - }
>>> -
>>> - /* Create a DC with a bitmap consisting of a tiling of the source
>>> - bitmap, with standard GDI functions. This is faster than an
>>> - iteration with UXTHEME_Blt(). */
>>> - hdcTemp = CreateCompatibleDC(hdcSrc);
>>> - if (hdcTemp != 0)
>>> - {
>>> - HBITMAP bitmapTemp;
>>> - HBITMAP bitmapOrig;
>>> - int nWidthTemp, nHeightTemp;
>>> - int xOfs, xRemaining;
>>> - int yOfs, yRemaining;
>>> - int growSize;
>>> -
>>> - /* Calculate temp dimensions of integer multiples of source dimensions */
>>> - nWidthTemp = ((nWidthDst + nWidthSrc - 1) / nWidthSrc) * nWidthSrc;
>>> - nHeightTemp = ((nHeightDst + nHeightSrc - 1) / nHeightSrc) * nHeightSrc;
>>> - bitmapTemp = CreateCompatibleBitmap(hdcSrc, nWidthTemp, nHeightTemp);
>>> - bitmapOrig = SelectObject(hdcTemp, bitmapTemp);
>>> -
>>> - /* Initial copy of bitmap */
>>> - BitBlt(hdcTemp, 0, 0, nWidthSrc, nHeightSrc, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
>>> -
>>> - /* Extend bitmap in the X direction. Growth of width is exponential */
>>> - xOfs = nWidthSrc;
>>> - xRemaining = nWidthTemp - nWidthSrc;
>>> - growSize = nWidthSrc;
>>> - while (xRemaining > 0)
>>> - {
>>> - growSize = min(growSize, xRemaining);
>>> - BitBlt(hdcTemp, xOfs, 0, growSize, nHeightSrc, hdcTemp, 0, 0, SRCCOPY);
>>> - xOfs += growSize;
>>> - xRemaining -= growSize;
>>> - growSize *= 2;
>>> - }
>>> -
>>> - /* Extend bitmap in the Y direction. Growth of height is exponential */
>>> - yOfs = nHeightSrc;
>>> - yRemaining = nHeightTemp - nHeightSrc;
>>> - growSize = nHeightSrc;
>>> - while (yRemaining > 0)
>>> - {
>>> - growSize = min(growSize, yRemaining);
>>> - BitBlt(hdcTemp, 0, yOfs, nWidthTemp, growSize, hdcTemp, 0, 0, SRCCOPY);
>>> - yOfs += growSize;
>>> - yRemaining -= growSize;
>>> - growSize *= 2;
>>> - }
>>> -
>>> - /* Use temporary hdc for source */
>>> - result = UXTHEME_Blt (hdcDst, nXOriginDst, nYOriginDst, nWidthDst, nHeightDst,
>>> - hdcTemp, 0, 0,
>>> - transparent, transcolor);
>>> -
>>> - SelectObject(hdcTemp, bitmapOrig);
>>> - DeleteObject(bitmapTemp);
>>> - }
>>> - DeleteDC(hdcTemp);
>>> - return result;
>>> - }
>>> - else
>>> - {
>>> - return UXTHEME_StretchBlt (hdcDst, nXOriginDst, nYOriginDst, nWidthDst, nHeightDst,
>>> - hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc,
>>> - transparent, transcolor);
>>> - }
>>> -}
>>> -
>>> /* Get transparency parameters passed to UXTHEME_StretchBlt() - the parameters
>>> * depend on whether the image has full alpha or whether it is
>>> * color-transparent or just opaque. */
>>> @@ -468,8 +311,6 @@
>>> {
>>> HRESULT hr;
>>> HBITMAP bmpSrc = NULL;
>>> - HDC hdcSrc = NULL;
>>> - HGDIOBJ oldSrc = NULL;
>>> RECT rcSrc;
>>> INT transparent = 0;
>>> COLORREF transparentcolor;
>>> @@ -477,18 +318,13 @@
>>> int halign = HA_CENTER;
>>> POINT dstSize;
>>> POINT srcSize;
>>> - POINT topleft;
>>> BOOL hasAlpha;
>>> + RECT rcDst;
>>> + GDI_DRAW_STREAM DrawStream;
>>>
>>> hr = UXTHEME_LoadImage(hTheme, hdc, iPartId, iStateId, pRect, TRUE,
>>> &bmpSrc, &rcSrc, &hasAlpha);
>>> if(FAILED(hr)) return hr;
>>> - hdcSrc = CreateCompatibleDC(hdc);
>>> - if(!hdcSrc) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - return hr;
>>> - }
>>> - oldSrc = SelectObject(hdcSrc, bmpSrc);
>>>
>>> dstSize.x = pRect->right-pRect->left;
>>> dstSize.y = pRect->bottom-pRect->top;
>>> @@ -500,22 +336,37 @@
>>> GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_VALIGN, &valign);
>>> GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_HALIGN, &halign);
>>>
>>> - topleft.x = pRect->left;
>>> - topleft.y = pRect->top;
>>> - if(halign == HA_CENTER) topleft.x += (dstSize.x/2)-(srcSize.x/2);
>>> - else if(halign == HA_RIGHT) topleft.x += dstSize.x-srcSize.x;
>>> - if(valign == VA_CENTER) topleft.y += (dstSize.y/2)-(srcSize.y/2);
>>> - else if(valign == VA_BOTTOM) topleft.y += dstSize.y-srcSize.y;
>>> -
>>> - if(!UXTHEME_Blt(hdc, topleft.x, topleft.y, srcSize.x, srcSize.y,
>>> - hdcSrc, rcSrc.left, rcSrc.top,
>>> - transparent, transparentcolor)) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - }
>>> -
>>> - SelectObject(hdcSrc, oldSrc);
>>> - DeleteDC(hdcSrc);
>>> - return hr;
>>> + rcDst = *pRect;
>>> + if(halign == HA_CENTER) rcDst.left += (dstSize.x/2)-(srcSize.x/2);
>>> + else if(halign == HA_RIGHT) rcDst.left += dstSize.x-srcSize.x;
>>> + if(valign == VA_CENTER) rcDst.top += (dstSize.y/2)-(srcSize.y/2);
>>> + else if(valign == VA_BOTTOM) rcDst.top += dstSize.y-srcSize.y;
>>> +
>>> + rcDst.right = rcDst.left + srcSize.x;
>>> + rcDst.bottom = rcDst.top + srcSize.y;
>>> +
>>> + DrawStream.signature = 0x44727753;
>>> + DrawStream.reserved = 0;
>>> + DrawStream.unknown1 = 1;
>>> + DrawStream.unknown2 = 9;
>>> + DrawStream.hDC = hdc;
>>> + DrawStream.hImage = bmpSrc;
>>> + DrawStream.crTransparent = transparentcolor;
>>> + DrawStream.rcSrc = rcSrc;
>>> + DrawStream.rcDest = rcDst;
>>> + DrawStream.leftSizingMargin = 0;
>>> + DrawStream.rightSizingMargin = 0;
>>> + DrawStream.topSizingMargin = 0;
>>> + DrawStream.bottomSizingMargin = 0;
>>> + DrawStream.drawOption = DS_TRUESIZE;
>>> +
>>> + if (transparent == ALPHABLEND_FULL)
>>> + DrawStream.drawOption |= DS_TRANSPARENTALPHA;
>>> + else if (transparent == ALPHABLEND_BINARY)
>>> + DrawStream.drawOption |= DS_TRANSPARENTCLR;
>>> +
>>> + GdiDrawStream(hdc, sizeof(DrawStream), &DrawStream);
>>> + return HRESULT_FROM_WIN32(GetLastError());
>>> }
>>>
>>> /***********************************************************************
>>> @@ -655,40 +506,33 @@
>>> const DTBGOPTS *pOptions)
>>> {
>>> HRESULT hr = S_OK;
>>> - HBITMAP bmpSrc, bmpSrcResized = NULL;
>>> - HGDIOBJ oldSrc;
>>> - HDC hdcSrc, hdcOrigSrc = NULL;
>>> + HBITMAP bmpSrc;
>>> RECT rcSrc;
>>> RECT rcDst;
>>> POINT dstSize;
>>> - POINT srcSize;
>>> POINT drawSize;
>>> int sizingtype = ST_STRETCH;
>>> INT transparent;
>>> COLORREF transparentcolor = 0;
>>> BOOL hasAlpha;
>>> -
>>> - hr = UXTHEME_LoadImage(hTheme, hdc, iPartId, iStateId, pRect, FALSE,
>>> - &bmpSrc, &rcSrc, &hasAlpha);
>>> - if(FAILED(hr)) return hr;
>>> - hdcSrc = CreateCompatibleDC(hdc);
>>> - if(!hdcSrc) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> + MARGINS sm;
>>> + GDI_DRAW_STREAM DrawStream;
>>> +
>>> + hr = UXTHEME_LoadImage(hTheme, hdc, iPartId, iStateId, pRect, FALSE, &bmpSrc, &rcSrc, &hasAlpha);
>>> + if(FAILED(hr))
>>> return hr;
>>> - }
>>> - oldSrc = SelectObject(hdcSrc, bmpSrc);
>>> + get_transparency (hTheme, iPartId, iStateId, hasAlpha, &transparent, &transparentcolor, FALSE);
>>>
>>> rcDst = *pRect;
>>> -
>>> - get_transparency (hTheme, iPartId, iStateId, hasAlpha, &transparent,
>>> - &transparentcolor, FALSE);
>>> -
>>> dstSize.x = rcDst.right-rcDst.left;
>>> dstSize.y = rcDst.bottom-rcDst.top;
>>> - srcSize.x = rcSrc.right-rcSrc.left;
>>> - srcSize.y = rcSrc.bottom-rcSrc.top;
>>> -
>>> +
>>> + GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_SIZINGMARGINS, NULL, &sm);
>>> GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_SIZINGTYPE, &sizingtype);
>>> +
>>> + /*FIXME: Is this ever used? */
>>> + /*GetThemeBool(hTheme, iPartId, iStateId, TMT_BORDERONLY, &borderonly);*/
>>> +
>>> if(sizingtype == ST_TRUESIZE) {
>>> int valign = VA_CENTER, halign = HA_CENTER;
>>>
>>> @@ -706,161 +550,36 @@
>>> rcDst.top = rcDst.bottom - drawSize.y;
>>> rcDst.right = rcDst.left + drawSize.x;
>>> rcDst.bottom = rcDst.top + drawSize.y;
>>> - if(!UXTHEME_StretchBlt(hdc, rcDst.left, rcDst.top, drawSize.x, drawSize.y,
>>> - hdcSrc, rcSrc.left, rcSrc.top, srcSize.x, srcSize.y,
>>> - transparent, transparentcolor))
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - }
>>> - else {
>>> - HDC hdcDst = NULL;
>>> - MARGINS sm;
>>> - POINT org;
>>> -
>>> - dstSize.x = abs(dstSize.x);
>>> - dstSize.y = abs(dstSize.y);
>>> -
>>> - GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_SIZINGMARGINS, NULL, &sm);
>>> -
>>> - /* Resize source image if destination smaller than margins */
>>> -#ifndef __REACTOS__
>>> - /* Revert Wine Commit 2b650fa as it breaks themed Explorer Toolbar Separators
>>> - FIXME: Revisit this when the bug is fixed. CORE-9636 and Wine Bug #38538 */
>>> - 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;
>>> - }
>>> -#endif /* __REACTOS__ */
>>> -
>>> - hdcDst = hdc;
>>> - OffsetViewportOrgEx(hdcDst, rcDst.left, rcDst.top, &org);
>>> -
>>> - /* Upper left corner */
>>> - if(!UXTHEME_Blt(hdcDst, 0, 0, sm.cxLeftWidth, sm.cyTopHeight,
>>> - hdcSrc, rcSrc.left, rcSrc.top,
>>> - transparent, transparentcolor)) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - goto draw_error;
>>> - }
>>> - /* Upper right corner */
>>> - if(!UXTHEME_Blt (hdcDst, dstSize.x-sm.cxRightWidth, 0,
>>> - sm.cxRightWidth, sm.cyTopHeight,
>>> - hdcSrc, rcSrc.right-sm.cxRightWidth, rcSrc.top,
>>> - transparent, transparentcolor)) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - goto draw_error;
>>> - }
>>> - /* Lower left corner */
>>> - if(!UXTHEME_Blt (hdcDst, 0, dstSize.y-sm.cyBottomHeight,
>>> - sm.cxLeftWidth, sm.cyBottomHeight,
>>> - hdcSrc, rcSrc.left, rcSrc.bottom-sm.cyBottomHeight,
>>> - transparent, transparentcolor)) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - goto draw_error;
>>> - }
>>> - /* Lower right corner */
>>> - if(!UXTHEME_Blt (hdcDst, dstSize.x-sm.cxRightWidth, dstSize.y-sm.cyBottomHeight,
>>> - sm.cxRightWidth, sm.cyBottomHeight,
>>> - hdcSrc, rcSrc.right-sm.cxRightWidth, rcSrc.bottom-sm.cyBottomHeight,
>>> - transparent, transparentcolor)) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - goto draw_error;
>>> - }
>>> -
>>> - if ((sizingtype == ST_STRETCH) || (sizingtype == ST_TILE)) {
>>> - int destCenterWidth = dstSize.x - (sm.cxLeftWidth + sm.cxRightWidth);
>>> - int srcCenterWidth = srcSize.x - (sm.cxLeftWidth + sm.cxRightWidth);
>>> - int destCenterHeight = dstSize.y - (sm.cyTopHeight + sm.cyBottomHeight);
>>> - int srcCenterHeight = srcSize.y - (sm.cyTopHeight + sm.cyBottomHeight);
>>> -
>>> - if(destCenterWidth > 0) {
>>> - /* Center top */
>>> - if(!UXTHEME_SizedBlt (hdcDst, sm.cxLeftWidth, 0,
>>> - destCenterWidth, sm.cyTopHeight,
>>> - hdcSrc, rcSrc.left+sm.cxLeftWidth, rcSrc.top,
>>> - srcCenterWidth, sm.cyTopHeight,
>>> - sizingtype, transparent, transparentcolor)) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - goto draw_error;
>>> - }
>>> - /* Center bottom */
>>> - if(!UXTHEME_SizedBlt (hdcDst, sm.cxLeftWidth, dstSize.y-sm.cyBottomHeight,
>>> - destCenterWidth, sm.cyBottomHeight,
>>> - hdcSrc, rcSrc.left+sm.cxLeftWidth, rcSrc.bottom-sm.cyBottomHeight,
>>> - srcCenterWidth, sm.cyBottomHeight,
>>> - sizingtype, transparent, transparentcolor)) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - goto draw_error;
>>> - }
>>> - }
>>> - if(destCenterHeight > 0) {
>>> - /* Left center */
>>> - if(!UXTHEME_SizedBlt (hdcDst, 0, sm.cyTopHeight,
>>> - sm.cxLeftWidth, destCenterHeight,
>>> - hdcSrc, rcSrc.left, rcSrc.top+sm.cyTopHeight,
>>> - sm.cxLeftWidth, srcCenterHeight,
>>> - sizingtype,
>>> - transparent, transparentcolor)) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - goto draw_error;
>>> - }
>>> - /* Right center */
>>> - if(!UXTHEME_SizedBlt (hdcDst, dstSize.x-sm.cxRightWidth, sm.cyTopHeight,
>>> - sm.cxRightWidth, destCenterHeight,
>>> - hdcSrc, rcSrc.right-sm.cxRightWidth, rcSrc.top+sm.cyTopHeight,
>>> - sm.cxRightWidth, srcCenterHeight,
>>> - sizingtype, transparent, transparentcolor)) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - goto draw_error;
>>> - }
>>> - }
>>> - if(destCenterHeight > 0 && destCenterWidth > 0) {
>>> - BOOL borderonly = FALSE;
>>> - GetThemeBool(hTheme, iPartId, iStateId, TMT_BORDERONLY, &borderonly);
>>> - if(!borderonly) {
>>> - /* Center */
>>> - if(!UXTHEME_SizedBlt (hdcDst, sm.cxLeftWidth, sm.cyTopHeight,
>>> - destCenterWidth, destCenterHeight,
>>> - hdcSrc, rcSrc.left+sm.cxLeftWidth, rcSrc.top+sm.cyTopHeight,
>>> - srcCenterWidth, srcCenterHeight,
>>> - sizingtype, transparent, transparentcolor)) {
>>> - hr = HRESULT_FROM_WIN32(GetLastError());
>>> - goto draw_error;
>>> - }
>>> - }
>>> - }
>>> - }
>>> -
>>> -draw_error:
>>> - SetViewportOrgEx (hdcDst, org.x, org.y, NULL);
>>> - }
>>> - SelectObject(hdcSrc, oldSrc);
>>> - DeleteDC(hdcSrc);
>>> - if (bmpSrcResized) DeleteObject(bmpSrcResized);
>>> - if (hdcOrigSrc) DeleteDC(hdcOrigSrc);
>>> - *pRect = rcDst;
>>> - return hr;
>>> + *pRect = rcDst;
>>> + }
>>> +
>>> + DrawStream.signature = 0x44727753;
>>> + DrawStream.reserved = 0;
>>> + DrawStream.unknown1 = 1;
>>> + DrawStream.unknown2 = 9;
>>> + DrawStream.hDC = hdc;
>>> + DrawStream.hImage = bmpSrc;
>>> + DrawStream.crTransparent = transparentcolor;
>>> + DrawStream.rcSrc = rcSrc;
>>> + DrawStream.rcDest = rcDst;
>>> + DrawStream.leftSizingMargin = sm.cxLeftWidth;
>>> + DrawStream.rightSizingMargin = sm.cxRightWidth;
>>> + DrawStream.topSizingMargin = sm.cyTopHeight;
>>> + DrawStream.bottomSizingMargin = sm.cyBottomHeight;
>>> + DrawStream.drawOption = 0;
>>> +
>>> + if (transparent == ALPHABLEND_FULL)
>>> + DrawStream.drawOption |= DS_TRANSPARENTALPHA;
>>> + else if (transparent == ALPHABLEND_BINARY)
>>> + DrawStream.drawOption |= DS_TRANSPARENTCLR;
>>> +
>>> + if (sizingtype == ST_TILE)
>>> + DrawStream.drawOption |= DS_TILE;
>>> + else if (sizingtype == ST_TRUESIZE)
>>> + DrawStream.drawOption |= DS_TRUESIZE;
>>> +
>>> + GdiDrawStream(hdc, sizeof(DrawStream), &DrawStream);
>>> + return HRESULT_FROM_WIN32(GetLastError());
>>> }
>>>
>>> /***********************************************************************
>>> @@ -1050,7 +769,9 @@
>>> /* This should never happen, and hence I don't know what to return */
>>> hr = E_FAIL;
>>> }
>>> +#if 0
>>> if(SUCCEEDED(hr))
>>> +#endif
>>> {
>>> RECT rcGlyph = *pRect;
>>> MARGINS margin;
>>>
>>> Modified: trunk/reactos/dll/win32/uxtheme/uxthemep.h
>>> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/uxthemep.h?rev=74457&r1=74456&r2=74457&view=diff
>>> ==============================================================================
>>> --- trunk/reactos/dll/win32/uxtheme/uxthemep.h [iso-8859-1] (original)
>>> +++ trunk/reactos/dll/win32/uxtheme/uxthemep.h [iso-8859-1] Wed May 3 11:13:23 2017
>>> @@ -14,6 +14,7 @@
>>> #include <winnls.h>
>>> #include <windowsx.h>
>>> #include <undocuser.h>
>>> +#include <undocgdi.h>
>>> #include <uxtheme.h>
>>> #include <uxundoc.h>
>>> #include <vfwmsgs.h>
>>>
>>>
>>>
>>
>>
>> _______________________________________________
>> Ros-dev mailing list
>> Ros-dev at reactos.org
>> http://www.reactos.org/mailman/listinfo/ros-dev
>
> _______________________________________________
> Ros-dev mailing list
> Ros-dev at reactos.org
> http://www.reactos.org/mailman/listinfo/ros-dev
>
More information about the Ros-dev
mailing list