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(a)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?r…
==============================================================================
--- 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…
==============================================================================
--- 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>