ReactOS  0.4.13-dev-259-g5ca9c9c
draw.c File Reference
#include "uxthemep.h"
#include <stdlib.h>
Include dependency graph for draw.c:

Go to the source code of this file.

Macros

#define RBInnerSoft   RBInnerNormal /* These are the same */
 
#define RBOuterSoft   RBOuterNormal
 
#define PT_IN_RECT(lprc, x, y)
 

Typedefs

typedef int(WINAPIDRAWSHADOWTEXT) (HDC hdc, LPCWSTR pszText, UINT cch, RECT *prc, DWORD dwFlags, COLORREF crText, COLORREF crShadow, int ixOffset, int iyOffset)
 

Enumerations

enum  {
  EDGE_LIGHT, EDGE_HIGHLIGHT, EDGE_SHADOW, EDGE_DARKSHADOW,
  EDGE_FILL, EDGE_WINDOW, EDGE_WINDOWFRAME, EDGE_NUMCOLORS
}
 

Functions

HRESULT WINAPI EnableThemeDialogTexture (HWND hwnd, DWORD dwFlags)
 
BOOL WINAPI IsThemeDialogTextureEnabled (HWND hwnd)
 
HRESULT WINAPI DrawThemeParentBackground (HWND hwnd, HDC hdc, RECT *prc)
 
HRESULT WINAPI DrawThemeBackground (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect)
 
static PTHEME_PROPERTY UXTHEME_SelectImage (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph)
 
HRESULT UXTHEME_LoadImage (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph, HBITMAP *hBmp, RECT *bmpRect, BOOL *hasImageAlpha)
 
static void get_transparency (HTHEME hTheme, int iPartId, int iStateId, BOOL hasImageAlpha, INT *transparent, COLORREF *transparentcolor, BOOL glyph)
 
static HRESULT UXTHEME_DrawImageGlyph (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *pRect, const DTBGOPTS *pOptions)
 
static HRESULT UXTHEME_DrawGlyph (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *pRect, const DTBGOPTS *pOptions)
 
static HRESULT get_image_part_size (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *prc, THEMESIZE eSize, POINT *psz)
 
static HRESULT UXTHEME_DrawImageBackground (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *pRect, const DTBGOPTS *pOptions)
 
static HRESULT UXTHEME_DrawBorderRectangle (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *pRect, const DTBGOPTS *pOptions)
 
static HRESULT UXTHEME_DrawBackgroundFill (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *pRect, const DTBGOPTS *pOptions)
 
static HRESULT UXTHEME_DrawBorderBackground (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const DTBGOPTS *pOptions)
 
HRESULT WINAPI DrawThemeBackgroundEx (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const DTBGOPTS *pOptions)
 
static COLORREF get_edge_color (int edgeType, HTHEME theme, int part, int state)
 
static HPEN get_edge_pen (int edgeType, HTHEME theme, int part, int state)
 
static HBRUSH get_edge_brush (int edgeType, HTHEME theme, int part, int state)
 
static HRESULT draw_diag_edge (HDC hdc, HTHEME theme, int part, int state, const RECT *rc, UINT uType, UINT uFlags, LPRECT contentsRect)
 
static HRESULT draw_rect_edge (HDC hdc, HTHEME theme, int part, int state, const RECT *rc, UINT uType, UINT uFlags, LPRECT contentsRect)
 
HRESULT WINAPI DrawThemeEdge (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pDestRect, UINT uEdge, UINT uFlags, RECT *pContentRect)
 
HRESULT WINAPI DrawThemeIcon (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, HIMAGELIST himl, int iImageIndex)
 
HRESULT WINAPI DrawThemeText (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, const RECT *pRect)
 
HRESULT WINAPI GetThemeBackgroundContentRect (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pBoundingRect, RECT *pContentRect)
 
HRESULT WINAPI GetThemeBackgroundExtent (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pContentRect, RECT *pExtentRect)
 
static HBITMAP UXTHEME_DrawThemePartToDib (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCRECT pRect)
 
static HRGN UXTHEME_RegionFromDibBits (RGBQUAD *pBuffer, RGBQUAD *pclrTransparent, LPCRECT pRect)
 
HRESULT UXTHEME_GetImageBackBackgroundRegion (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCRECT pRect, HRGN *pRegion)
 
HRESULT WINAPI GetThemeBackgroundRegion (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, HRGN *pRegion)
 
static HRESULT get_border_background_size (HTHEME hTheme, int iPartId, int iStateId, THEMESIZE eSize, POINT *psz)
 
HRESULT WINAPI GetThemePartSize (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *prc, THEMESIZE eSize, SIZE *psz)
 
HRESULT WINAPI GetThemeTextExtent (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, const RECT *pBoundingRect, RECT *pExtentRect)
 
HRESULT WINAPI GetThemeTextMetrics (HTHEME hTheme, HDC hdc, int iPartId, int iStateId, TEXTMETRICW *ptm)
 
BOOL WINAPI IsThemeBackgroundPartiallyTransparent (HTHEME hTheme, int iPartId, int iStateId)
 

Variables

ATOM atDialogThemeEnabled
 
struct {
   int   themeProp
 
   int   sysColor
 
EdgeColorMap [EDGE_NUMCOLORS]
 
static const signed char LTInnerNormal []
 
static const signed char LTOuterNormal []
 
static const signed char RBInnerNormal []
 
static const signed char RBOuterNormal []
 
static const signed char LTInnerSoft []
 
static const signed char LTOuterSoft []
 
static const signed char LTRBOuterMono []
 
static const signed char LTRBInnerMono []
 
static const signed char LTRBOuterFlat []
 
static const signed char LTRBInnerFlat []
 

Macro Definition Documentation

◆ PT_IN_RECT

#define PT_IN_RECT (   lprc,
  x,
  y 
)
Value:
( x >= lprc->left && x < lprc->right && \
y >= lprc->top && y < lprc->bottom)
_In_ int _Inout_ LPRECT lprc
Definition: winuser.h:4334
LONG top
Definition: windef.h:292
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
LONG bottom
Definition: windef.h:294

Definition at line 1607 of file draw.c.

◆ RBInnerSoft

#define RBInnerSoft   RBInnerNormal /* These are the same */

Definition at line 885 of file draw.c.

◆ RBOuterSoft

#define RBOuterSoft   RBOuterNormal

Definition at line 886 of file draw.c.

Typedef Documentation

◆ DRAWSHADOWTEXT

typedef int(WINAPI * DRAWSHADOWTEXT) (HDC hdc, LPCWSTR pszText, UINT cch, RECT *prc, DWORD dwFlags, COLORREF crText, COLORREF crShadow, int ixOffset, int iyOffset)

Definition at line 1371 of file draw.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
EDGE_LIGHT 
EDGE_HIGHLIGHT 
EDGE_SHADOW 
EDGE_DARKSHADOW 
EDGE_FILL 
EDGE_WINDOW 
EDGE_WINDOWFRAME 
EDGE_NUMCOLORS 

Definition at line 815 of file draw.c.

816 {
817  EDGE_LIGHT,
819  EDGE_SHADOW,
821  EDGE_FILL,
822 
823  EDGE_WINDOW,
825 
827 };

Function Documentation

◆ draw_diag_edge()

static HRESULT draw_diag_edge ( HDC  hdc,
HTHEME  theme,
int  part,
int  state,
const RECT rc,
UINT  uType,
UINT  uFlags,
LPRECT  contentsRect 
)
static

Definition at line 941 of file draw.c.

944 {
945  POINT Points[4];
946  signed char InnerI, OuterI;
947  HPEN InnerPen, OuterPen;
948  POINT SavePoint;
949  HPEN SavePen;
950  int spx, spy;
951  int epx, epy;
952  int Width = rc->right - rc->left;
953  int Height= rc->bottom - rc->top;
954  int SmallDiam = Width > Height ? Height : Width;
955  HRESULT retval = (((uType & BDR_INNER) == BDR_INNER
956  || (uType & BDR_OUTER) == BDR_OUTER)
957  && !(uFlags & (BF_FLAT|BF_MONO)) ) ? E_FAIL : S_OK;
958  int add = (LTRBInnerMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0)
959  + (LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0);
960 
961  /* Init some vars */
962  OuterPen = InnerPen = GetStockObject(NULL_PEN);
963  SavePen = SelectObject(hdc, InnerPen);
964  spx = spy = epx = epy = 0; /* Satisfy the compiler... */
965 
966  /* Determine the colors of the edges */
967  if(uFlags & BF_MONO)
968  {
969  InnerI = LTRBInnerMono[uType & (BDR_INNER|BDR_OUTER)];
970  OuterI = LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)];
971  }
972  else if(uFlags & BF_FLAT)
973  {
974  InnerI = LTRBInnerFlat[uType & (BDR_INNER|BDR_OUTER)];
975  OuterI = LTRBOuterFlat[uType & (BDR_INNER|BDR_OUTER)];
976  }
977  else if(uFlags & BF_SOFT)
978  {
979  if(uFlags & BF_BOTTOM)
980  {
981  InnerI = RBInnerSoft[uType & (BDR_INNER|BDR_OUTER)];
982  OuterI = RBOuterSoft[uType & (BDR_INNER|BDR_OUTER)];
983  }
984  else
985  {
986  InnerI = LTInnerSoft[uType & (BDR_INNER|BDR_OUTER)];
987  OuterI = LTOuterSoft[uType & (BDR_INNER|BDR_OUTER)];
988  }
989  }
990  else
991  {
992  if(uFlags & BF_BOTTOM)
993  {
994  InnerI = RBInnerNormal[uType & (BDR_INNER|BDR_OUTER)];
995  OuterI = RBOuterNormal[uType & (BDR_INNER|BDR_OUTER)];
996  }
997  else
998  {
999  InnerI = LTInnerNormal[uType & (BDR_INNER|BDR_OUTER)];
1000  OuterI = LTOuterNormal[uType & (BDR_INNER|BDR_OUTER)];
1001  }
1002  }
1003 
1004  if(InnerI != -1) InnerPen = get_edge_pen (InnerI, theme, part, state);
1005  if(OuterI != -1) OuterPen = get_edge_pen (OuterI, theme, part, state);
1006 
1007  MoveToEx(hdc, 0, 0, &SavePoint);
1008 
1009  /* Don't ask me why, but this is what is visible... */
1010  /* This must be possible to do much simpler, but I fail to */
1011  /* see the logic in the MS implementation (sigh...). */
1012  /* So, this might look a bit brute force here (and it is), but */
1013  /* it gets the job done;) */
1014 
1015  switch(uFlags & BF_RECT)
1016  {
1017  case 0:
1018  case BF_LEFT:
1019  case BF_BOTTOM:
1020  case BF_BOTTOMLEFT:
1021  /* Left bottom endpoint */
1022  epx = rc->left-1;
1023  spx = epx + SmallDiam;
1024  epy = rc->bottom;
1025  spy = epy - SmallDiam;
1026  break;
1027 
1028  case BF_TOPLEFT:
1029  case BF_BOTTOMRIGHT:
1030  /* Left top endpoint */
1031  epx = rc->left-1;
1032  spx = epx + SmallDiam;
1033  epy = rc->top-1;
1034  spy = epy + SmallDiam;
1035  break;
1036 
1037  case BF_TOP:
1038  case BF_RIGHT:
1039  case BF_TOPRIGHT:
1040  case BF_RIGHT|BF_LEFT:
1041  case BF_RIGHT|BF_LEFT|BF_TOP:
1042  case BF_BOTTOM|BF_TOP:
1043  case BF_BOTTOM|BF_TOP|BF_LEFT:
1044  case BF_BOTTOMRIGHT|BF_LEFT:
1045  case BF_BOTTOMRIGHT|BF_TOP:
1046  case BF_RECT:
1047  /* Right top endpoint */
1048  spx = rc->left;
1049  epx = spx + SmallDiam;
1050  spy = rc->bottom-1;
1051  epy = spy - SmallDiam;
1052  break;
1053  }
1054 
1055  MoveToEx(hdc, spx, spy, NULL);
1056  SelectObject(hdc, OuterPen);
1057  LineTo(hdc, epx, epy);
1058 
1059  SelectObject(hdc, InnerPen);
1060 
1061  switch(uFlags & (BF_RECT|BF_DIAGONAL))
1062  {
1064  case (BF_DIAGONAL|BF_BOTTOM):
1065  case BF_DIAGONAL:
1066  case (BF_DIAGONAL|BF_LEFT):
1067  MoveToEx(hdc, spx-1, spy, NULL);
1068  LineTo(hdc, epx, epy-1);
1069  Points[0].x = spx-add;
1070  Points[0].y = spy;
1071  Points[1].x = rc->left;
1072  Points[1].y = rc->top;
1073  Points[2].x = epx+1;
1074  Points[2].y = epy-1-add;
1075  Points[3] = Points[2];
1076  break;
1077 
1079  MoveToEx(hdc, spx-1, spy, NULL);
1080  LineTo(hdc, epx, epy+1);
1081  Points[0].x = spx-add;
1082  Points[0].y = spy;
1083  Points[1].x = rc->left;
1084  Points[1].y = rc->bottom-1;
1085  Points[2].x = epx+1;
1086  Points[2].y = epy+1+add;
1087  Points[3] = Points[2];
1088  break;
1089 
1094  MoveToEx(hdc, spx+1, spy, NULL);
1095  LineTo(hdc, epx, epy+1);
1096  Points[0].x = epx-1;
1097  Points[0].y = epy+1+add;
1098  Points[1].x = rc->right-1;
1099  Points[1].y = rc->top+add;
1100  Points[2].x = rc->right-1;
1101  Points[2].y = rc->bottom-1;
1102  Points[3].x = spx+add;
1103  Points[3].y = spy;
1104  break;
1105 
1107  MoveToEx(hdc, spx, spy-1, NULL);
1108  LineTo(hdc, epx+1, epy);
1109  Points[0].x = epx+1+add;
1110  Points[0].y = epy+1;
1111  Points[1].x = rc->right-1;
1112  Points[1].y = rc->top;
1113  Points[2].x = rc->right-1;
1114  Points[2].y = rc->bottom-1-add;
1115  Points[3].x = spx;
1116  Points[3].y = spy-add;
1117  break;
1118 
1119  case (BF_DIAGONAL|BF_TOP):
1120  case (BF_DIAGONAL|BF_BOTTOM|BF_TOP):
1122  MoveToEx(hdc, spx+1, spy-1, NULL);
1123  LineTo(hdc, epx, epy);
1124  Points[0].x = epx-1;
1125  Points[0].y = epy+1;
1126  Points[1].x = rc->right-1;
1127  Points[1].y = rc->top;
1128  Points[2].x = rc->right-1;
1129  Points[2].y = rc->bottom-1-add;
1130  Points[3].x = spx+add;
1131  Points[3].y = spy-add;
1132  break;
1133 
1134  case (BF_DIAGONAL|BF_RIGHT):
1135  case (BF_DIAGONAL|BF_RIGHT|BF_LEFT):
1137  MoveToEx(hdc, spx, spy, NULL);
1138  LineTo(hdc, epx-1, epy+1);
1139  Points[0].x = spx;
1140  Points[0].y = spy;
1141  Points[1].x = rc->left;
1142  Points[1].y = rc->top+add;
1143  Points[2].x = epx-1-add;
1144  Points[2].y = epy+1+add;
1145  Points[3] = Points[2];
1146  break;
1147  }
1148 
1149  /* Fill the interior if asked */
1150  if((uFlags & BF_MIDDLE) && retval)
1151  {
1152  HBRUSH hbsave;
1153  HBRUSH hb = get_edge_brush ((uFlags & BF_MONO) ? EDGE_WINDOW : EDGE_FILL,
1154  theme, part, state);
1155  HPEN hpsave;
1156  HPEN hp = get_edge_pen ((uFlags & BF_MONO) ? EDGE_WINDOW : EDGE_FILL,
1157  theme, part, state);
1158  hbsave = SelectObject(hdc, hb);
1159  hpsave = SelectObject(hdc, hp);
1160  Polygon(hdc, Points, 4);
1161  SelectObject(hdc, hbsave);
1162  SelectObject(hdc, hpsave);
1163  DeleteObject (hp);
1164  DeleteObject (hb);
1165  }
1166 
1167  /* Adjust rectangle if asked */
1168  if(uFlags & BF_ADJUST)
1169  {
1170  *contentsRect = *rc;
1171  if(uFlags & BF_LEFT) contentsRect->left += add;
1172  if(uFlags & BF_RIGHT) contentsRect->right -= add;
1173  if(uFlags & BF_TOP) contentsRect->top += add;
1174  if(uFlags & BF_BOTTOM) contentsRect->bottom -= add;
1175  }
1176 
1177  /* Cleanup */
1178  SelectObject(hdc, SavePen);
1179  MoveToEx(hdc, SavePoint.x, SavePoint.y, NULL);
1180  if(InnerI != -1) DeleteObject (InnerPen);
1181  if(OuterI != -1) DeleteObject (OuterPen);
1182 
1183  return retval;
1184 }
#define BF_FLAT
Definition: winuser.h:471
HGDIOBJ WINAPI GetStockObject(_In_ int)
int add
Definition: i386-dis.c:3122
#define BF_DIAGONAL_ENDTOPLEFT
Definition: winuser.h:465
#define BF_MIDDLE
Definition: winuser.h:468
long y
Definition: polytest.cpp:48
BOOL Polygon(CONST PPOINT UnsafePoints, int Count, int polyFillMode)
Definition: polytest.cpp:730
long x
Definition: polytest.cpp:48
#define BDR_INNER
Definition: winuser.h:447
#define RBOuterSoft
Definition: draw.c:886
#define BF_DIAGONAL_ENDTOPRIGHT
Definition: winuser.h:464
#define BF_BOTTOM
Definition: winuser.h:457
LONG top
Definition: windef.h:292
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
#define BF_BOTTOMLEFT
Definition: winuser.h:460
static const signed char LTOuterSoft[]
Definition: draw.c:878
LONG left
Definition: windef.h:291
UINT uFlags
Definition: api.c:60
LONG right
Definition: windef.h:293
#define E_FAIL
Definition: ddrawi.h:102
static const signed char RBInnerNormal[]
Definition: draw.c:857
#define BF_ADJUST
Definition: winuser.h:470
#define BF_TOPLEFT
Definition: winuser.h:458
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
#define BF_RECT
Definition: winuser.h:462
static HBRUSH get_edge_brush(int edgeType, HTHEME theme, int part, int state)
Definition: draw.c:931
#define BF_DIAGONAL_ENDBOTTOMLEFT
Definition: winuser.h:466
static const signed char LTRBOuterFlat[]
Definition: draw.c:902
#define BF_MONO
Definition: winuser.h:472
#define NULL_PEN
Definition: wingdi.h:903
#define BF_BOTTOMRIGHT
Definition: winuser.h:461
smooth NULL
Definition: ftsmooth.c:416
static HPEN get_edge_pen(int edgeType, HTHEME theme, int part, int state)
Definition: draw.c:926
LONG HRESULT
Definition: typedefs.h:77
#define BF_RIGHT
Definition: winuser.h:456
#define RBInnerSoft
Definition: draw.c:885
#define BF_DIAGONAL_ENDBOTTOMRIGHT
Definition: winuser.h:467
#define BF_TOPRIGHT
Definition: winuser.h:459
static const signed char LTRBOuterMono[]
Definition: draw.c:888
HDC hdc
Definition: main.c:9
static int state
Definition: maze.c:121
static const signed char LTInnerSoft[]
Definition: draw.c:871
#define S_OK
Definition: intsafe.h:59
#define BF_SOFT
Definition: winuser.h:469
#define BDR_OUTER
Definition: winuser.h:446
#define BF_DIAGONAL
Definition: winuser.h:463
static const signed char LTRBInnerMono[]
Definition: draw.c:895
#define BF_TOP
Definition: winuser.h:455
static const signed char RBOuterNormal[]
Definition: draw.c:864
static const signed char LTOuterNormal[]
Definition: draw.c:850
LONG bottom
Definition: windef.h:294
static const signed char LTInnerNormal[]
Definition: draw.c:843
#define BF_LEFT
Definition: winuser.h:454
static const signed char LTRBInnerFlat[]
Definition: draw.c:909

Referenced by DrawThemeEdge().

◆ draw_rect_edge()

static HRESULT draw_rect_edge ( HDC  hdc,
HTHEME  theme,
int  part,
int  state,
const RECT rc,
UINT  uType,
UINT  uFlags,
LPRECT  contentsRect 
)
static

Definition at line 1191 of file draw.c.

1194 {
1195  signed char LTInnerI, LTOuterI;
1196  signed char RBInnerI, RBOuterI;
1197  HPEN LTInnerPen, LTOuterPen;
1198  HPEN RBInnerPen, RBOuterPen;
1199  RECT InnerRect = *rc;
1200  POINT SavePoint;
1201  HPEN SavePen;
1202  int LBpenplus = 0;
1203  int LTpenplus = 0;
1204  int RTpenplus = 0;
1205  int RBpenplus = 0;
1206  HRESULT retval = (((uType & BDR_INNER) == BDR_INNER
1207  || (uType & BDR_OUTER) == BDR_OUTER)
1208  && !(uFlags & (BF_FLAT|BF_MONO)) ) ? E_FAIL : S_OK;
1209 
1210  /* Init some vars */
1211  LTInnerPen = LTOuterPen = RBInnerPen = RBOuterPen = GetStockObject(NULL_PEN);
1212  SavePen = SelectObject(hdc, LTInnerPen);
1213 
1214  /* Determine the colors of the edges */
1215  if(uFlags & BF_MONO)
1216  {
1217  LTInnerI = RBInnerI = LTRBInnerMono[uType & (BDR_INNER|BDR_OUTER)];
1218  LTOuterI = RBOuterI = LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)];
1219  }
1220  else if(uFlags & BF_FLAT)
1221  {
1222  LTInnerI = RBInnerI = LTRBInnerFlat[uType & (BDR_INNER|BDR_OUTER)];
1223  LTOuterI = RBOuterI = LTRBOuterFlat[uType & (BDR_INNER|BDR_OUTER)];
1224 
1225  if( LTInnerI != -1 ) LTInnerI = RBInnerI = EDGE_FILL;
1226  }
1227  else if(uFlags & BF_SOFT)
1228  {
1229  LTInnerI = LTInnerSoft[uType & (BDR_INNER|BDR_OUTER)];
1230  LTOuterI = LTOuterSoft[uType & (BDR_INNER|BDR_OUTER)];
1231  RBInnerI = RBInnerSoft[uType & (BDR_INNER|BDR_OUTER)];
1232  RBOuterI = RBOuterSoft[uType & (BDR_INNER|BDR_OUTER)];
1233  }
1234  else
1235  {
1236  LTInnerI = LTInnerNormal[uType & (BDR_INNER|BDR_OUTER)];
1237  LTOuterI = LTOuterNormal[uType & (BDR_INNER|BDR_OUTER)];
1238  RBInnerI = RBInnerNormal[uType & (BDR_INNER|BDR_OUTER)];
1239  RBOuterI = RBOuterNormal[uType & (BDR_INNER|BDR_OUTER)];
1240  }
1241 
1242  if((uFlags & BF_BOTTOMLEFT) == BF_BOTTOMLEFT) LBpenplus = 1;
1243  if((uFlags & BF_TOPRIGHT) == BF_TOPRIGHT) RTpenplus = 1;
1244  if((uFlags & BF_BOTTOMRIGHT) == BF_BOTTOMRIGHT) RBpenplus = 1;
1245  if((uFlags & BF_TOPLEFT) == BF_TOPLEFT) LTpenplus = 1;
1246 
1247  if(LTInnerI != -1) LTInnerPen = get_edge_pen (LTInnerI, theme, part, state);
1248  if(LTOuterI != -1) LTOuterPen = get_edge_pen (LTOuterI, theme, part, state);
1249  if(RBInnerI != -1) RBInnerPen = get_edge_pen (RBInnerI, theme, part, state);
1250  if(RBOuterI != -1) RBOuterPen = get_edge_pen (RBOuterI, theme, part, state);
1251 
1252  MoveToEx(hdc, 0, 0, &SavePoint);
1253 
1254  /* Draw the outer edge */
1255  SelectObject(hdc, LTOuterPen);
1256  if(uFlags & BF_TOP)
1257  {
1258  MoveToEx(hdc, InnerRect.left, InnerRect.top, NULL);
1259  LineTo(hdc, InnerRect.right, InnerRect.top);
1260  }
1261  if(uFlags & BF_LEFT)
1262  {
1263  MoveToEx(hdc, InnerRect.left, InnerRect.top, NULL);
1264  LineTo(hdc, InnerRect.left, InnerRect.bottom);
1265  }
1266  SelectObject(hdc, RBOuterPen);
1267  if(uFlags & BF_BOTTOM)
1268  {
1269  MoveToEx(hdc, InnerRect.right-1, InnerRect.bottom-1, NULL);
1270  LineTo(hdc, InnerRect.left-1, InnerRect.bottom-1);
1271  }
1272  if(uFlags & BF_RIGHT)
1273  {
1274  MoveToEx(hdc, InnerRect.right-1, InnerRect.bottom-1, NULL);
1275  LineTo(hdc, InnerRect.right-1, InnerRect.top-1);
1276  }
1277 
1278  /* Draw the inner edge */
1279  SelectObject(hdc, LTInnerPen);
1280  if(uFlags & BF_TOP)
1281  {
1282  MoveToEx(hdc, InnerRect.left+LTpenplus, InnerRect.top+1, NULL);
1283  LineTo(hdc, InnerRect.right-RTpenplus, InnerRect.top+1);
1284  }
1285  if(uFlags & BF_LEFT)
1286  {
1287  MoveToEx(hdc, InnerRect.left+1, InnerRect.top+LTpenplus, NULL);
1288  LineTo(hdc, InnerRect.left+1, InnerRect.bottom-LBpenplus);
1289  }
1290  SelectObject(hdc, RBInnerPen);
1291  if(uFlags & BF_BOTTOM)
1292  {
1293  MoveToEx(hdc, InnerRect.right-1-RBpenplus, InnerRect.bottom-2, NULL);
1294  LineTo(hdc, InnerRect.left-1+LBpenplus, InnerRect.bottom-2);
1295  }
1296  if(uFlags & BF_RIGHT)
1297  {
1298  MoveToEx(hdc, InnerRect.right-2, InnerRect.bottom-1-RBpenplus, NULL);
1299  LineTo(hdc, InnerRect.right-2, InnerRect.top-1+RTpenplus);
1300  }
1301 
1302  if( ((uFlags & BF_MIDDLE) && retval) || (uFlags & BF_ADJUST) )
1303  {
1304  int add = (LTRBInnerMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0)
1305  + (LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0);
1306 
1307  if(uFlags & BF_LEFT) InnerRect.left += add;
1308  if(uFlags & BF_RIGHT) InnerRect.right -= add;
1309  if(uFlags & BF_TOP) InnerRect.top += add;
1310  if(uFlags & BF_BOTTOM) InnerRect.bottom -= add;
1311 
1312  if((uFlags & BF_MIDDLE) && retval)
1313  {
1314  HBRUSH br = get_edge_brush ((uFlags & BF_MONO) ? EDGE_WINDOW : EDGE_FILL,
1315  theme, part, state);
1316  FillRect(hdc, &InnerRect, br);
1317  DeleteObject (br);
1318  }
1319 
1320  if(uFlags & BF_ADJUST)
1321  *contentsRect = InnerRect;
1322  }
1323 
1324  /* Cleanup */
1325  SelectObject(hdc, SavePen);
1326  MoveToEx(hdc, SavePoint.x, SavePoint.y, NULL);
1327  if(LTInnerI != -1) DeleteObject (LTInnerPen);
1328  if(LTOuterI != -1) DeleteObject (LTOuterPen);
1329  if(RBInnerI != -1) DeleteObject (RBInnerPen);
1330  if(RBOuterI != -1) DeleteObject (RBOuterPen);
1331  return retval;
1332 }
#define BF_FLAT
Definition: winuser.h:471
HGDIOBJ WINAPI GetStockObject(_In_ int)
int add
Definition: i386-dis.c:3122
#define BF_MIDDLE
Definition: winuser.h:468
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define BDR_INNER
Definition: winuser.h:447
#define RBOuterSoft
Definition: draw.c:886
#define BF_BOTTOM
Definition: winuser.h:457
LONG top
Definition: windef.h:292
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
#define BF_BOTTOMLEFT
Definition: winuser.h:460
static const signed char LTOuterSoft[]
Definition: draw.c:878
LONG left
Definition: windef.h:291
UINT uFlags
Definition: api.c:60
LONG right
Definition: windef.h:293
#define E_FAIL
Definition: ddrawi.h:102
INT WINAPI FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr)
Definition: draw.c:1041
static const signed char RBInnerNormal[]
Definition: draw.c:857
#define BF_ADJUST
Definition: winuser.h:470
#define BF_TOPLEFT
Definition: winuser.h:458
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
static HBRUSH get_edge_brush(int edgeType, HTHEME theme, int part, int state)
Definition: draw.c:931
static const signed char LTRBOuterFlat[]
Definition: draw.c:902
#define BF_MONO
Definition: winuser.h:472
#define NULL_PEN
Definition: wingdi.h:903
#define BF_BOTTOMRIGHT
Definition: winuser.h:461
smooth NULL
Definition: ftsmooth.c:416
static HPEN get_edge_pen(int edgeType, HTHEME theme, int part, int state)
Definition: draw.c:926
LONG HRESULT
Definition: typedefs.h:77
#define BF_RIGHT
Definition: winuser.h:456
#define RBInnerSoft
Definition: draw.c:885
#define BF_TOPRIGHT
Definition: winuser.h:459
static const signed char LTRBOuterMono[]
Definition: draw.c:888
HDC hdc
Definition: main.c:9
static int state
Definition: maze.c:121
static const signed char LTInnerSoft[]
Definition: draw.c:871
#define S_OK
Definition: intsafe.h:59
#define BF_SOFT
Definition: winuser.h:469
#define BDR_OUTER
Definition: winuser.h:446
static const signed char LTRBInnerMono[]
Definition: draw.c:895
#define BF_TOP
Definition: winuser.h:455
static const signed char RBOuterNormal[]
Definition: draw.c:864
static const signed char LTOuterNormal[]
Definition: draw.c:850
LONG bottom
Definition: windef.h:294
static const signed char LTInnerNormal[]
Definition: draw.c:843
#define BF_LEFT
Definition: winuser.h:454
static const signed char LTRBInnerFlat[]
Definition: draw.c:909

Referenced by DrawThemeEdge().

◆ DrawThemeBackground()

HRESULT WINAPI DrawThemeBackground ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
const RECT pRect,
const RECT pClipRect 
)

Definition at line 128 of file draw.c.

131 {
132  DTBGOPTS opts;
133  opts.dwSize = sizeof(DTBGOPTS);
134  opts.dwFlags = 0;
135  if(pClipRect) {
136  opts.dwFlags |= DTBG_CLIPRECT;
137  opts.rcClip = *pClipRect;
138  }
139  return DrawThemeBackgroundEx(hTheme, hdc, iPartId, iStateId, pRect, &opts);
140 }
HRESULT WINAPI DrawThemeBackgroundEx(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const DTBGOPTS *pOptions)
Definition: draw.c:740
HDC hdc
Definition: main.c:9

Referenced by CB_ThemedPaint(), COMBO_ThemedPaint(), draw_theme_bar_H(), draw_theme_bar_V(), draw_theme_bkg_H(), draw_theme_bkg_V(), CTrayWindow::DrawSizerWithTheme(), EDIT_WM_NCPaint(), CTrayWindow::EraseBackgroundWithTheme(), GB_ThemedPaint(), CTaskSwitchWnd::HandleItemPaint(), HEADER_FillItemFrame(), HEADER_Refresh(), IPADDRESS_Draw(), LISTBOX_NCPaint(), LISTVIEW_NCPaint(), MONTHCAL_PaintButton(), nc_paint(), CTrayNotifyWnd::OnEraseBackground(), OSK_ThemeHandler(), paint(), paint_scrollbar(), PaintControl(), PB_ThemedPaint(), PROGRESS_Draw(), REBAR_DrawBand(), REBAR_EraseBkGnd(), SCROLL_ThemeDrawPart(), STATUSBAR_DrawPart(), STATUSBAR_DrawSizeGrip(), STATUSBAR_Refresh(), STATUSBAR_RefreshPart(), TAB_DrawBorder(), TAB_DrawItem(), Theme_Start(), ThemeDrawBorders(), ThemeDrawCaption(), ThemeDrawCaptionButton(), ThemeDrawScrollBarsGrip(), THEMING_DialogSubclassProc(), TOOLBAR_DrawButton(), TRACKBAR_DrawChannel(), TRACKBAR_DrawThumb(), TREEVIEW_DrawItemLines(), TREEVIEW_NCPaint(), UPDOWN_Draw(), UPDOWN_DrawBuddyBackground(), and UXTHEME_DrawThemePartToDib().

◆ DrawThemeBackgroundEx()

HRESULT WINAPI DrawThemeBackgroundEx ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
const RECT pRect,
const DTBGOPTS *  pOptions 
)

Definition at line 740 of file draw.c.

743 {
744  HRESULT hr;
745  const DTBGOPTS defaultOpts = {sizeof(DTBGOPTS), 0, {0,0,0,0}};
746  const DTBGOPTS *opts;
747  HRGN clip = NULL;
748  int hasClip = -1;
749  int bgtype = BT_BORDERFILL;
750  RECT rt;
751 
752  TRACE("(%p,%p,%d,%d,%d,%d)\n", hTheme, hdc, iPartId, iStateId,pRect->left,pRect->top);
753  if(!hTheme)
754  return E_HANDLE;
755 
756  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_BGTYPE, &bgtype);
757  if (bgtype == BT_NONE) return S_OK;
758 
759  /* Ensure we have a DTBGOPTS structure available, simplifies some of the code */
760  opts = pOptions;
761  if(!opts) opts = &defaultOpts;
762 
763  if(opts->dwFlags & DTBG_CLIPRECT) {
764  clip = CreateRectRgn(0,0,1,1);
765  hasClip = GetClipRgn(hdc, clip);
766  if(hasClip == -1)
767  TRACE("Failed to get original clipping region\n");
768  else
769  IntersectClipRect(hdc, opts->rcClip.left, opts->rcClip.top, opts->rcClip.right, opts->rcClip.bottom);
770  }
771  rt = *pRect;
772 
773  if(bgtype == BT_IMAGEFILE)
774  hr = UXTHEME_DrawImageBackground(hTheme, hdc, iPartId, iStateId, &rt, opts);
775  else if(bgtype == BT_BORDERFILL)
776  hr = UXTHEME_DrawBorderBackground(hTheme, hdc, iPartId, iStateId, pRect, opts);
777  else {
778  FIXME("Unknown background type\n");
779  /* This should never happen, and hence I don't know what to return */
780  hr = E_FAIL;
781  }
782 #if 0
783  if(SUCCEEDED(hr))
784 #endif
785  {
786  RECT rcGlyph = *pRect;
787  MARGINS margin;
788  hr = GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_CONTENTMARGINS, NULL, &margin);
789  if(SUCCEEDED(hr))
790  {
791  rcGlyph.left += margin.cxLeftWidth;
792  rcGlyph.right -= margin.cxRightWidth;
793  rcGlyph.top += margin.cyTopHeight;
794  rcGlyph.bottom -= margin.cyBottomHeight;
795  }
796  hr = UXTHEME_DrawGlyph(hTheme, hdc, iPartId, iStateId, &rcGlyph, opts);
797  }
798  if(opts->dwFlags & DTBG_CLIPRECT) {
799  if(hasClip == 0)
801  else if(hasClip == 1)
802  SelectClipRgn(hdc, clip);
803  DeleteObject(clip);
804  }
805  return hr;
806 }
static HRESULT UXTHEME_DrawBorderBackground(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const DTBGOPTS *pOptions)
Definition: draw.c:722
#define E_HANDLE
Definition: winerror.h:2850
int WINAPI SelectClipRgn(_In_ HDC, _In_opt_ HRGN)
HRESULT hr
Definition: shlfolder.c:183
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
LONG top
Definition: windef.h:292
int WINAPI IntersectClipRect(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
#define E_FAIL
Definition: ddrawi.h:102
Definition: misc.c:279
#define TMT_CONTENTMARGINS
Definition: vssym32.h:324
int cyBottomHeight
Definition: misc.c:283
#define FIXME(fmt,...)
Definition: debug.h:110
smooth NULL
Definition: ftsmooth.c:416
static HRESULT UXTHEME_DrawGlyph(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *pRect, const DTBGOPTS *pOptions)
Definition: draw.c:387
HRGN WINAPI CreateRectRgn(_In_ int, _In_ int, _In_ int, _In_ int)
#define TRACE(s)
Definition: solgame.cpp:4
int cyTopHeight
Definition: misc.c:282
LONG HRESULT
Definition: typedefs.h:77
int cxLeftWidth
Definition: misc.c:280
HDC hdc
Definition: main.c:9
HRESULT WINAPI GetThemeMargins(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, int iPropId, RECT *prc, MARGINS *pMargins)
Definition: property.c:216
#define S_OK
Definition: intsafe.h:59
LONG bottom
Definition: windef.h:294
int cxRightWidth
Definition: misc.c:281
int WINAPI GetClipRgn(_In_ HDC, _In_ HRGN)
#define TMT_BGTYPE
Definition: vssym32.h:353
#define SUCCEEDED(hr)
Definition: intsafe.h:57
static HRESULT UXTHEME_DrawImageBackground(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *pRect, const DTBGOPTS *pOptions)
Definition: draw.c:514

Referenced by DrawThemeBackground().

◆ DrawThemeEdge()

HRESULT WINAPI DrawThemeEdge ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
const RECT pDestRect,
UINT  uEdge,
UINT  uFlags,
RECT pContentRect 
)

Definition at line 1342 of file draw.c.

1345 {
1346  TRACE("%d %d 0x%08x 0x%08x\n", iPartId, iStateId, uEdge, uFlags);
1347  if(!hTheme)
1348  return E_HANDLE;
1349 
1350  if(uFlags & BF_DIAGONAL)
1351  return draw_diag_edge (hdc, hTheme, iPartId, iStateId, pDestRect,
1352  uEdge, uFlags, pContentRect);
1353  else
1354  return draw_rect_edge (hdc, hTheme, iPartId, iStateId, pDestRect,
1355  uEdge, uFlags, pContentRect);
1356 }
static HRESULT draw_rect_edge(HDC hdc, HTHEME theme, int part, int state, const RECT *rc, UINT uType, UINT uFlags, LPRECT contentsRect)
Definition: draw.c:1191
#define E_HANDLE
Definition: winerror.h:2850
UINT uFlags
Definition: api.c:60
#define TRACE(s)
Definition: solgame.cpp:4
HDC hdc
Definition: main.c:9
static HRESULT draw_diag_edge(HDC hdc, HTHEME theme, int part, int state, const RECT *rc, UINT uType, UINT uFlags, LPRECT contentsRect)
Definition: draw.c:941
#define BF_DIAGONAL
Definition: winuser.h:463

Referenced by REBAR_EraseBkGnd(), and REBAR_NCPaint().

◆ DrawThemeIcon()

HRESULT WINAPI DrawThemeIcon ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
const RECT pRect,
HIMAGELIST  himl,
int  iImageIndex 
)

Definition at line 1362 of file draw.c.

1364 {
1365  FIXME("%d %d: stub\n", iPartId, iStateId);
1366  if(!hTheme)
1367  return E_HANDLE;
1368  return E_NOTIMPL;
1369 }
#define E_HANDLE
Definition: winerror.h:2850
#define FIXME(fmt,...)
Definition: debug.h:110
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DrawThemeParentBackground()

HRESULT WINAPI DrawThemeParentBackground ( HWND  hwnd,
HDC  hdc,
RECT prc 
)

Definition at line 72 of file draw.c.

73 {
74  RECT rt;
75  POINT org;
76  HWND hParent;
77  HRGN clip = NULL;
78  int hasClip = -1;
79 
80  TRACE("(%p,%p,%p)\n", hwnd, hdc, prc);
81 
82  if (!IsWindow(hwnd) || !hdc)
83  return E_HANDLE;
84 
85  if (prc && IsBadReadPtr (prc, sizeof(RECT)))
86  return E_POINTER;
87 
89  if(!hParent)
90  return S_OK;
91 
92  if(prc) {
93  rt = *prc;
95 
96  clip = CreateRectRgn(0,0,1,1);
97  hasClip = GetClipRgn(hdc, clip);
98  if(hasClip == -1)
99  TRACE("Failed to get original clipping region\n");
100  else
102  }
103  else {
104  GetClientRect(hwnd, &rt);
105  MapWindowPoints(hwnd, hParent, (LPPOINT)&rt, 2);
106  }
107 
108  OffsetViewportOrgEx(hdc, -rt.left, -rt.top, &org);
109 
112 
113  SetViewportOrgEx(hdc, org.x, org.y, NULL);
114  if(prc) {
115  if(hasClip == 0)
117  else if(hasClip == 1)
118  SelectClipRgn(hdc, clip);
119  DeleteObject(clip);
120  }
121  return S_OK;
122 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
BOOL WINAPI SetViewportOrgEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
Definition: coord.c:655
#define E_HANDLE
Definition: winerror.h:2850
int WINAPI SelectClipRgn(_In_ HDC, _In_opt_ HRGN)
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
BOOL WINAPI IsWindow(_In_opt_ HWND)
LONG top
Definition: windef.h:292
BOOL WINAPI OffsetViewportOrgEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
Definition: coord.c:849
int WINAPI IntersectClipRect(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
UINT_PTR WPARAM
Definition: windef.h:207
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
#define WM_PRINTCLIENT
Definition: richedit.h:70
static char org[]
Definition: encode.c:7456
smooth NULL
Definition: ftsmooth.c:416
HRGN WINAPI CreateRectRgn(_In_ int, _In_ int, _In_ int, _In_ int)
#define TRACE(s)
Definition: solgame.cpp:4
HDC hdc
Definition: main.c:9
const DOCKBAR PVOID HWND hParent
Definition: tooldock.h:22
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
HWND WINAPI GetParent(_In_ HWND)
#define S_OK
Definition: intsafe.h:59
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI IsBadReadPtr(IN LPCVOID lp, IN UINT_PTR ucb)
Definition: except.c:807
LONG bottom
Definition: windef.h:294
int WINAPI GetClipRgn(_In_ HDC, _In_ HRGN)
#define WM_ERASEBKGND
Definition: winuser.h:1607
#define PRF_CLIENT
Definition: winuser.h:2479
#define E_POINTER
Definition: winerror.h:2365
_Out_ LPRECT prc
Definition: ntgdi.h:1658

Referenced by CB_ThemedPaint(), CTrayClockWnd::DrawBackground(), EDIT_WM_NCPaint(), GB_ThemedPaint(), IPADDRESS_Draw(), LISTBOX_NCPaint(), LISTVIEW_NCPaint(), nc_paint(), CSysPagerWnd::OnEraseBackground(), CTrayNotifyWnd::OnEraseBackground(), CTaskSwitchWnd::OnEraseBackground(), OSK_ThemeHandler(), PB_ThemedPaint(), PROGRESS_Draw(), REBAR_EraseBkGnd(), Test_Messages(), Test_Params(), Theme_Start(), THEMING_DialogSubclassProc(), TRACKBAR_Refresh(), and TREEVIEW_NCPaint().

◆ DrawThemeText()

HRESULT WINAPI DrawThemeText ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
LPCWSTR  pszText,
int  iCharCount,
DWORD  dwTextFlags,
DWORD  dwTextFlags2,
const RECT pRect 
)

Definition at line 1377 of file draw.c.

1380 {
1381  HRESULT hr;
1382  HFONT hFont = NULL;
1383  HGDIOBJ oldFont = NULL;
1384  LOGFONTW logfont;
1385  COLORREF textColor;
1386  COLORREF oldTextColor;
1387  COLORREF shadowColor;
1388  POINT ptShadowOffset;
1389  int oldBkMode;
1390  RECT rt;
1391  int iShadowType;
1392 
1393  TRACE("%d %d: stub\n", iPartId, iStateId);
1394  if(!hTheme)
1395  return E_HANDLE;
1396 
1397  hr = GetThemeFont(hTheme, hdc, iPartId, iStateId, TMT_FONT, &logfont);
1398  if(SUCCEEDED(hr))
1399  {
1400  hFont = CreateFontIndirectW(&logfont);
1401  if(!hFont)
1402  {
1403  ERR("Failed to create font\n");
1404  }
1405  }
1406 
1407  CopyRect(&rt, pRect);
1408  if(hFont)
1409  oldFont = SelectObject(hdc, hFont);
1410 
1411  oldBkMode = SetBkMode(hdc, TRANSPARENT);
1412 
1413  if(dwTextFlags2 & DTT_GRAYED)
1414  textColor = GetSysColor(COLOR_GRAYTEXT);
1415  else {
1416  if(FAILED(GetThemeColor(hTheme, iPartId, iStateId, TMT_TEXTCOLOR, &textColor)))
1417  textColor = GetTextColor(hdc);
1418  }
1419 
1420  hr = GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_TEXTSHADOWTYPE, &iShadowType);
1421  if (SUCCEEDED(hr))
1422  {
1423  hr = GetThemeColor(hTheme, iPartId, iStateId, TMT_TEXTSHADOWCOLOR, &shadowColor);
1424  if (FAILED(hr))
1425  {
1426  ERR("GetThemeColor failed\n");
1427  }
1428 
1429  hr = GetThemePosition(hTheme, iPartId, iStateId, TMT_TEXTSHADOWOFFSET, &ptShadowOffset);
1430  if (FAILED(hr))
1431  {
1432  ERR("GetThemePosition failed\n");
1433  }
1434 
1435  if (iShadowType == TST_SINGLE)
1436  {
1437  oldTextColor = SetTextColor(hdc, shadowColor);
1438  OffsetRect(&rt, ptShadowOffset.x, ptShadowOffset.y);
1439  DrawTextW(hdc, pszText, iCharCount, &rt, dwTextFlags);
1440  OffsetRect(&rt, -ptShadowOffset.x, -ptShadowOffset.y);
1441  SetTextColor(hdc, oldTextColor);
1442  }
1443  else if (iShadowType == TST_CONTINUOUS)
1444  {
1445  HANDLE hcomctl32 = GetModuleHandleW(L"comctl32.dll");
1446  DRAWSHADOWTEXT pDrawShadowText;
1447  if (!hcomctl32)
1448  {
1449  hcomctl32 = LoadLibraryW(L"comctl32.dll");
1450  if (!hcomctl32)
1451  ERR("Failed to load comctl32\n");
1452  }
1453 
1454  pDrawShadowText = (DRAWSHADOWTEXT)GetProcAddress(hcomctl32, "DrawShadowText");
1455  if (pDrawShadowText)
1456  {
1457  pDrawShadowText(hdc, pszText, iCharCount, &rt, dwTextFlags, textColor, shadowColor, ptShadowOffset.x, ptShadowOffset.y);
1458  goto cleanup;
1459  }
1460  }
1461  }
1462 
1463  oldTextColor = SetTextColor(hdc, textColor);
1464  DrawTextW(hdc, pszText, iCharCount, &rt, dwTextFlags);
1465  SetTextColor(hdc, oldTextColor);
1466 cleanup:
1467  SetBkMode(hdc, oldBkMode);
1468 
1469  if(hFont) {
1470  SelectObject(hdc, oldFont);
1472  }
1473  return S_OK;
1474 }
#define E_HANDLE
Definition: winerror.h:2850
long y
Definition: polytest.cpp:48
HRESULT hr
Definition: shlfolder.c:183
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
long x
Definition: polytest.cpp:48
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
HRESULT WINAPI GetThemePosition(HTHEME hTheme, int iPartId, int iStateId, int iPropId, POINT *pPoint)
Definition: property.c:162
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
#define TMT_TEXTSHADOWOFFSET
Definition: vssym32.h:315
HRESULT WINAPI GetThemeFont(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, int iPropId, LOGFONTW *pFont)
Definition: property.c:108
#define TMT_TEXTSHADOWCOLOR
Definition: vssym32.h:343
DWORD WINAPI GetSysColor(_In_ int)
HFONT hFont
Definition: main.c:53
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1032
#define TRANSPARENT
Definition: wingdi.h:949
#define TMT_TEXTCOLOR
Definition: vssym32.h:328
COLORREF WINAPI GetTextColor(_In_ HDC)
Definition: text.c:829
#define LoadLibraryW(x)
Definition: compat.h:404
smooth NULL
Definition: ftsmooth.c:416
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
#define TMT_FONT
Definition: vssym32.h:144
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:77
DWORD COLORREF
Definition: windef.h:285
#define COLOR_GRAYTEXT
Definition: winuser.h:922
static const WCHAR L[]
Definition: oid.c:1250
HDC hdc
Definition: main.c:9
HRESULT WINAPI GetThemeColor(HTHEME hTheme, int iPartId, int iStateId, int iPropId, COLORREF *pColor)
Definition: property.c:45
#define TMT_TEXTSHADOWTYPE
Definition: vssym32.h:362
int(WINAPI * DRAWSHADOWTEXT)(HDC hdc, LPCWSTR pszText, UINT cch, RECT *prc, DWORD dwFlags, COLORREF crText, COLORREF crShadow, int ixOffset, int iyOffset)
Definition: draw.c:1371
#define ERR(fmt,...)
Definition: debug.h:109
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:886
#define S_OK
Definition: intsafe.h:59
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
BOOL WINAPI CopyRect(_Out_ LPRECT, _In_ LPCRECT)
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:845
char * cleanup(char *str)
Definition: wpickclick.c:99
#define GetProcAddress(x, y)
Definition: compat.h:410
#define SUCCEEDED(hr)
Definition: intsafe.h:57
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:17

Referenced by CB_ThemedPaint(), GB_ThemedPaint(), HEADER_DrawItem(), IPADDRESS_Draw(), PB_ThemedPaint(), REBAR_DrawBand(), STATUSBAR_DrawPart(), TAB_DrawItemInterior(), ThemeDrawCaptionText(), and TOOLBAR_DrawString().

◆ EnableThemeDialogTexture()

HRESULT WINAPI EnableThemeDialogTexture ( HWND  hwnd,
DWORD  dwFlags 
)

Definition at line 36 of file draw.c.

37 {
38  static const WCHAR szTab[] = { 'T','a','b',0 };
39  BOOL res;
40 
41  TRACE("(%p,0x%08x\n", hwnd, dwFlags);
43  UlongToHandle(dwFlags|0x80000000));
44  /* 0x80000000 serves as a "flags set" flag */
45  if (!res)
48  return SetWindowTheme (hwnd, NULL, szTab);
49  else
50  return S_OK;
51 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define ETDT_USETABTEXTURE
Definition: dxdiag.c:29
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
unsigned int BOOL
Definition: ntddk_ex.h:94
HRESULT WINAPI SetWindowTheme(_In_ HWND hwnd, _In_ LPCWSTR pszSubAppName, _In_ LPCWSTR pszSubIdList)
Definition: uxthemesupp.c:69
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
BOOL WINAPI SetPropW(_In_ HWND, _In_ LPCWSTR, _In_opt_ HANDLE)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define UlongToHandle(ul)
Definition: basetsd.h:97
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
ATOM atDialogThemeEnabled
Definition: system.c:46
#define S_OK
Definition: intsafe.h:59
GLuint res
Definition: glext.h:9613
#define MAKEINTATOM(i)
Definition: winbase.h:1416

◆ get_border_background_size()

static HRESULT get_border_background_size ( HTHEME  hTheme,
int  iPartId,
int  iStateId,
THEMESIZE  eSize,
POINT psz 
)
static

Definition at line 1755 of file draw.c.

1757 {
1758  HRESULT hr = S_OK;
1759  int bordersize = 1;
1760 
1761  if (SUCCEEDED (hr = GetThemeInt(hTheme, iPartId, iStateId, TMT_BORDERSIZE,
1762  &bordersize)))
1763  {
1764  psz->x = psz->y = 2*bordersize;
1765  if (eSize != TS_MIN)
1766  {
1767  psz->x++;
1768  psz->y++;
1769  }
1770  }
1771  return hr;
1772 }
long y
Definition: polytest.cpp:48
HRESULT hr
Definition: shlfolder.c:183
long x
Definition: polytest.cpp:48
LONG HRESULT
Definition: typedefs.h:77
#define S_OK
Definition: intsafe.h:59
#define TMT_BORDERSIZE
Definition: vssym32.h:274
HRESULT WINAPI GetThemeInt(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:126
#define SUCCEEDED(hr)
Definition: intsafe.h:57

Referenced by GetThemePartSize().

◆ get_edge_brush()

static HBRUSH get_edge_brush ( int  edgeType,
HTHEME  theme,
int  part,
int  state 
)
inlinestatic

Definition at line 931 of file draw.c.

932 {
933  return CreateSolidBrush (get_edge_color (edgeType, theme, part, state));
934 }
static int state
Definition: maze.c:121
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
static COLORREF get_edge_color(int edgeType, HTHEME theme, int part, int state)
Definition: draw.c:916

Referenced by draw_diag_edge(), and draw_rect_edge().

◆ get_edge_color()

static COLORREF get_edge_color ( int  edgeType,
HTHEME  theme,
int  part,
int  state 
)
static

Definition at line 916 of file draw.c.

917 {
918  COLORREF col;
919  if ((EdgeColorMap[edgeType].themeProp == -1)
920  || FAILED (GetThemeColor (theme, part, state,
921  EdgeColorMap[edgeType].themeProp, &col)))
922  col = GetSysColor (EdgeColorMap[edgeType].sysColor);
923  return col;
924 }
int sysColor
Definition: draw.c:832
DWORD WINAPI GetSysColor(_In_ int)
DWORD COLORREF
Definition: windef.h:285
int themeProp
Definition: draw.c:831
static int state
Definition: maze.c:121
HRESULT WINAPI GetThemeColor(HTHEME hTheme, int iPartId, int iStateId, int iPropId, COLORREF *pColor)
Definition: property.c:45
static const struct @537 EdgeColorMap[EDGE_NUMCOLORS]

Referenced by get_edge_brush(), and get_edge_pen().

◆ get_edge_pen()

static HPEN get_edge_pen ( int  edgeType,
HTHEME  theme,
int  part,
int  state 
)
inlinestatic

Definition at line 926 of file draw.c.

927 {
928  return CreatePen (PS_SOLID, 1, get_edge_color (edgeType, theme, part, state));
929 }
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
#define PS_SOLID
Definition: wingdi.h:585
static int state
Definition: maze.c:121
static COLORREF get_edge_color(int edgeType, HTHEME theme, int part, int state)
Definition: draw.c:916

Referenced by draw_diag_edge(), and draw_rect_edge().

◆ get_image_part_size()

static HRESULT get_image_part_size ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
RECT prc,
THEMESIZE  eSize,
POINT psz 
)
static

Definition at line 410 of file draw.c.

413 {
414  HRESULT hr = S_OK;
415  HBITMAP bmpSrc;
416  RECT rcSrc;
417  BOOL hasAlpha;
418 
419  hr = UXTHEME_LoadImage(hTheme, hdc, iPartId, iStateId, prc, FALSE,
420  &bmpSrc, &rcSrc, &hasAlpha);
421  if (FAILED(hr)) return hr;
422 
423  switch (eSize)
424  {
425  case TS_DRAW:
426  if (prc != NULL)
427  {
428  RECT rcDst;
429  POINT dstSize;
430  POINT srcSize;
431  int sizingtype = ST_STRETCH;
432  BOOL uniformsizing = FALSE;
433 
434  rcDst = *prc;
435 
436  dstSize.x = rcDst.right-rcDst.left;
437  dstSize.y = rcDst.bottom-rcDst.top;
438  srcSize.x = rcSrc.right-rcSrc.left;
439  srcSize.y = rcSrc.bottom-rcSrc.top;
440 
441  GetThemeBool(hTheme, iPartId, iStateId, TMT_UNIFORMSIZING, &uniformsizing);
442  if(uniformsizing) {
443  /* Scale height and width equally */
444  if (dstSize.x*srcSize.y < dstSize.y*srcSize.x)
445  {
446  dstSize.y = MulDiv (srcSize.y, dstSize.x, srcSize.x);
447  rcDst.bottom = rcDst.top + dstSize.y;
448  }
449  else
450  {
451  dstSize.x = MulDiv (srcSize.x, dstSize.y, srcSize.y);
452  rcDst.right = rcDst.left + dstSize.x;
453  }
454  }
455 
456  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_SIZINGTYPE, &sizingtype);
457  if(sizingtype == ST_TRUESIZE) {
458  int truesizestretchmark = 100;
459 
460  if(dstSize.x < 0 || dstSize.y < 0) {
461  BOOL mirrorimage = TRUE;
462  GetThemeBool(hTheme, iPartId, iStateId, TMT_MIRRORIMAGE, &mirrorimage);
463  if(mirrorimage) {
464  if(dstSize.x < 0) {
465  rcDst.left += dstSize.x;
466  rcDst.right += dstSize.x;
467  }
468  if(dstSize.y < 0) {
469  rcDst.top += dstSize.y;
470  rcDst.bottom += dstSize.y;
471  }
472  }
473  }
474  /* Whatever TrueSizeStretchMark does - it does not seem to
475  * be what's outlined below. It appears as if native
476  * uxtheme always stretches if dest is smaller than source
477  * (ie as if TrueSizeStretchMark==100 with the code below) */
478 #if 0
479  /* Only stretch when target exceeds source by truesizestretchmark percent */
480  GetThemeInt(hTheme, iPartId, iStateId, TMT_TRUESIZESTRETCHMARK, &truesizestretchmark);
481 #endif
482  if(dstSize.x < 0 || dstSize.y < 0 ||
483  (MulDiv(srcSize.x, 100, dstSize.x) > truesizestretchmark &&
484  MulDiv(srcSize.y, 100, dstSize.y) > truesizestretchmark)) {
485  memcpy (psz, &dstSize, sizeof (SIZE));
486  }
487  else {
488  memcpy (psz, &srcSize, sizeof (SIZE));
489  }
490  }
491  else
492  {
493  psz->x = abs(dstSize.x);
494  psz->y = abs(dstSize.y);
495  }
496  break;
497  }
498  /* else fall through */
499  case TS_MIN:
500  /* FIXME: couldn't figure how native uxtheme computes min size */
501  case TS_TRUE:
502  psz->x = rcSrc.right - rcSrc.left;
503  psz->y = rcSrc.bottom - rcSrc.top;
504  break;
505  }
506  return hr;
507 }
#define abs(i)
Definition: fconv.c:206
#define TRUE
Definition: types.h:120
HRESULT UXTHEME_LoadImage(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph, HBITMAP *hBmp, RECT *bmpRect, BOOL *hasImageAlpha)
Definition: draw.c:230
long y
Definition: polytest.cpp:48
HRESULT hr
Definition: shlfolder.c:183
long x
Definition: polytest.cpp:48
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
LONG top
Definition: windef.h:292
HRESULT WINAPI GetThemeBool(HTHEME hTheme, int iPartId, int iStateId, int iPropId, BOOL *pfVal)
Definition: property.c:26
#define TMT_UNIFORMSIZING
Definition: vssym32.h:261
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
#define TMT_SIZINGTYPE
Definition: vssym32.h:356
LONG HRESULT
Definition: typedefs.h:77
HDC hdc
Definition: main.c:9
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define TMT_TRUESIZESTRETCHMARK
Definition: vssym32.h:290
#define S_OK
Definition: intsafe.h:59
#define TMT_MIRRORIMAGE
Definition: vssym32.h:260
LONG bottom
Definition: windef.h:294
static HBITMAP
Definition: button.c:44
_Out_ LPRECT prc
Definition: ntgdi.h:1658
#define MulDiv(x, y, z)
Definition: gdifloat.h:86
HRESULT WINAPI GetThemeInt(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:126

Referenced by GetThemePartSize(), and UXTHEME_DrawImageBackground().

◆ get_transparency()

static void get_transparency ( HTHEME  hTheme,
int  iPartId,
int  iStateId,
BOOL  hasImageAlpha,
INT transparent,
COLORREF transparentcolor,
BOOL  glyph 
)
inlinestatic

Definition at line 285 of file draw.c.

288 {
289  if (hasImageAlpha)
290  {
291  *transparent = ALPHABLEND_FULL;
292  *transparentcolor = RGB (255, 0, 255);
293  }
294  else
295  {
296  BOOL trans = FALSE;
297  GetThemeBool(hTheme, iPartId, iStateId,
298  glyph ? TMT_GLYPHTRANSPARENT : TMT_TRANSPARENT, &trans);
299  if(trans) {
300  *transparent = ALPHABLEND_BINARY;
301  if(FAILED(GetThemeColor(hTheme, iPartId, iStateId,
303  transparentcolor))) {
304  /* If image is transparent, but no color was specified, use magenta */
305  *transparentcolor = RGB(255, 0, 255);
306  }
307  }
308  else
309  *transparent = ALPHABLEND_NONE;
310  }
311 }
HRESULT WINAPI GetThemeBool(HTHEME hTheme, int iPartId, int iStateId, int iPropId, BOOL *pfVal)
Definition: property.c:26
#define ALPHABLEND_BINARY
Definition: uxthemep.h:267
unsigned int BOOL
Definition: ntddk_ex.h:94
#define ALPHABLEND_NONE
Definition: uxthemep.h:265
#define RGB(r, g, b)
Definition: wingdi.h:2918
#define TMT_TRANSPARENT
Definition: vssym32.h:252
HRESULT WINAPI GetThemeColor(HTHEME hTheme, int iPartId, int iStateId, int iPropId, COLORREF *pColor)
Definition: property.c:45
#define TMT_GLYPHTRANSPARENTCOLOR
Definition: vssym32.h:345
#define TMT_TRANSPARENTCOLOR
Definition: vssym32.h:334
#define ALPHABLEND_FULL
Definition: uxthemep.h:269
#define TMT_GLYPHTRANSPARENT
Definition: vssym32.h:257

Referenced by IsThemeBackgroundPartiallyTransparent(), UXTHEME_DrawImageBackground(), and UXTHEME_DrawImageGlyph().

◆ GetThemeBackgroundContentRect()

HRESULT WINAPI GetThemeBackgroundContentRect ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
const RECT pBoundingRect,
RECT pContentRect 
)

Definition at line 1479 of file draw.c.

1483 {
1484  MARGINS margin;
1485  HRESULT hr;
1486 
1487  TRACE("(%d,%d)\n", iPartId, iStateId);
1488  if(!hTheme)
1489  return E_HANDLE;
1490 
1491  /* try content margins property... */
1492  hr = GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_CONTENTMARGINS, NULL, &margin);
1493  if(SUCCEEDED(hr)) {
1494  pContentRect->left = pBoundingRect->left + margin.cxLeftWidth;
1495  pContentRect->top = pBoundingRect->top + margin.cyTopHeight;
1496  pContentRect->right = pBoundingRect->right - margin.cxRightWidth;
1497  pContentRect->bottom = pBoundingRect->bottom - margin.cyBottomHeight;
1498  } else {
1499  /* otherwise, try to determine content rect from the background type and props */
1500  int bgtype = BT_BORDERFILL;
1501  *pContentRect = *pBoundingRect;
1502 
1503  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_BGTYPE, &bgtype);
1504  if(bgtype == BT_BORDERFILL) {
1505  int bordersize = 1;
1506 
1507  GetThemeInt(hTheme, iPartId, iStateId, TMT_BORDERSIZE, &bordersize);
1508  InflateRect(pContentRect, -bordersize, -bordersize);
1509  } else if ((bgtype == BT_IMAGEFILE)
1510  && (SUCCEEDED(hr = GetThemeMargins(hTheme, hdc, iPartId, iStateId,
1511  TMT_SIZINGMARGINS, NULL, &margin)))) {
1512  pContentRect->left = pBoundingRect->left + margin.cxLeftWidth;
1513  pContentRect->top = pBoundingRect->top + margin.cyTopHeight;
1514  pContentRect->right = pBoundingRect->right - margin.cxRightWidth;
1515  pContentRect->bottom = pBoundingRect->bottom - margin.cyBottomHeight;
1516  }
1517  /* If nothing was found, leave unchanged */
1518  }
1519 
1520  TRACE("%s\n", wine_dbgstr_rect(pContentRect));
1521 
1522  return S_OK;
1523 }
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define E_HANDLE
Definition: winerror.h:2850
HRESULT hr
Definition: shlfolder.c:183
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
LONG top
Definition: windef.h:292
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
Definition: misc.c:279
#define TMT_CONTENTMARGINS
Definition: vssym32.h:324
int cyBottomHeight
Definition: misc.c:283
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
int cyTopHeight
Definition: misc.c:282
#define TMT_SIZINGMARGINS
Definition: vssym32.h:323
LONG HRESULT
Definition: typedefs.h:77
int cxLeftWidth
Definition: misc.c:280
const char * wine_dbgstr_rect(const RECT *rect)
HDC hdc
Definition: main.c:9
HRESULT WINAPI GetThemeMargins(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, int iPropId, RECT *prc, MARGINS *pMargins)
Definition: property.c:216
#define S_OK
Definition: intsafe.h:59
LONG bottom
Definition: windef.h:294
int cxRightWidth
Definition: misc.c:281
#define TMT_BGTYPE
Definition: vssym32.h:353
#define TMT_BORDERSIZE
Definition: vssym32.h:274
HRESULT WINAPI GetThemeInt(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:126
#define SUCCEEDED(hr)
Definition: intsafe.h:57

Referenced by CB_ThemedPaint(), GB_ThemedPaint(), get_client_rect(), HEADER_FillItemFrame(), PB_ThemedPaint(), PROGRESS_Draw(), and TAB_DrawItem().

◆ GetThemeBackgroundExtent()

HRESULT WINAPI GetThemeBackgroundExtent ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
const RECT pContentRect,
RECT pExtentRect 
)

Definition at line 1528 of file draw.c.

1531 {
1532  MARGINS margin;
1533  HRESULT hr;
1534 
1535  TRACE("(%d,%d)\n", iPartId, iStateId);
1536  if(!hTheme)
1537  return E_HANDLE;
1538 
1539  /* try content margins property... */
1540  hr = GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_CONTENTMARGINS, NULL, &margin);
1541  if(SUCCEEDED(hr)) {
1542  pExtentRect->left = pContentRect->left - margin.cxLeftWidth;
1543  pExtentRect->top = pContentRect->top - margin.cyTopHeight;
1544  pExtentRect->right = pContentRect->right + margin.cxRightWidth;
1545  pExtentRect->bottom = pContentRect->bottom + margin.cyBottomHeight;
1546  } else {
1547  /* otherwise, try to determine content rect from the background type and props */
1548  int bgtype = BT_BORDERFILL;
1549  *pExtentRect = *pContentRect;
1550 
1551  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_BGTYPE, &bgtype);
1552  if(bgtype == BT_BORDERFILL) {
1553  int bordersize = 1;
1554 
1555  GetThemeInt(hTheme, iPartId, iStateId, TMT_BORDERSIZE, &bordersize);
1556  InflateRect(pExtentRect, bordersize, bordersize);
1557  } else if ((bgtype == BT_IMAGEFILE)
1558  && (SUCCEEDED(hr = GetThemeMargins(hTheme, hdc, iPartId, iStateId,
1559  TMT_SIZINGMARGINS, NULL, &margin)))) {
1560  pExtentRect->left = pContentRect->left - margin.cxLeftWidth;
1561  pExtentRect->top = pContentRect->top - margin.cyTopHeight;
1562  pExtentRect->right = pContentRect->right + margin.cxRightWidth;
1563  pExtentRect->bottom = pContentRect->bottom + margin.cyBottomHeight;
1564  }
1565  /* If nothing was found, leave unchanged */
1566  }
1567 
1568  TRACE("%s\n", wine_dbgstr_rect(pExtentRect));
1569 
1570  return S_OK;
1571 }
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define E_HANDLE
Definition: winerror.h:2850
HRESULT hr
Definition: shlfolder.c:183
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
LONG top
Definition: windef.h:292
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
Definition: misc.c:279
#define TMT_CONTENTMARGINS
Definition: vssym32.h:324
int cyBottomHeight
Definition: misc.c:283
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
int cyTopHeight
Definition: misc.c:282
#define TMT_SIZINGMARGINS
Definition: vssym32.h:323
LONG HRESULT
Definition: typedefs.h:77
int cxLeftWidth
Definition: misc.c:280
const char * wine_dbgstr_rect(const RECT *rect)
HDC hdc
Definition: main.c:9
HRESULT WINAPI GetThemeMargins(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, int iPropId, RECT *prc, MARGINS *pMargins)
Definition: property.c:216
#define S_OK
Definition: intsafe.h:59
LONG bottom
Definition: windef.h:294
int cxRightWidth
Definition: misc.c:281
#define TMT_BGTYPE
Definition: vssym32.h:353
#define TMT_BORDERSIZE
Definition: vssym32.h:274
HRESULT WINAPI GetThemeInt(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:126
#define SUCCEEDED(hr)
Definition: intsafe.h:57

Referenced by REBAR_DrawBand(), and STATUSBAR_ComputeHeight().

◆ GetThemeBackgroundRegion()

HRESULT WINAPI GetThemeBackgroundRegion ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
const RECT pRect,
HRGN *  pRegion 
)

Definition at line 1724 of file draw.c.

1727 {
1728  HRESULT hr = S_OK;
1729  int bgtype = BT_BORDERFILL;
1730 
1731  TRACE("(%p,%p,%d,%d)\n", hTheme, hdc, iPartId, iStateId);
1732  if(!hTheme)
1733  return E_HANDLE;
1734  if(!pRect || !pRegion)
1735  return E_POINTER;
1736 
1737  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_BGTYPE, &bgtype);
1738  if(bgtype == BT_IMAGEFILE) {
1739  hr = UXTHEME_GetImageBackBackgroundRegion(hTheme, hdc, iPartId, iStateId, pRect, pRegion);
1740  }
1741  else if(bgtype == BT_BORDERFILL) {
1742  *pRegion = CreateRectRgn(pRect->left, pRect->top, pRect->right, pRect->bottom);
1743  if(!*pRegion)
1745  }
1746  else {
1747  FIXME("Unknown background type\n");
1748  /* This should never happen, and hence I don't know what to return */
1749  hr = E_FAIL;
1750  }
1751  return hr;
1752 }
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define E_HANDLE
Definition: winerror.h:2850
HRESULT hr
Definition: shlfolder.c:183
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
LONG top
Definition: windef.h:292
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
#define E_FAIL
Definition: ddrawi.h:102
#define FIXME(fmt,...)
Definition: debug.h:110
HRGN WINAPI CreateRectRgn(_In_ int, _In_ int, _In_ int, _In_ int)
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:77
HDC hdc
Definition: main.c:9
#define S_OK
Definition: intsafe.h:59
HRESULT UXTHEME_GetImageBackBackgroundRegion(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCRECT pRect, HRGN *pRegion)
Definition: draw.c:1697
LONG bottom
Definition: windef.h:294
#define E_POINTER
Definition: winerror.h:2365
#define TMT_BGTYPE
Definition: vssym32.h:353

Referenced by SetThemeRegion().

◆ GetThemePartSize()

HRESULT WINAPI GetThemePartSize ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
RECT prc,
THEMESIZE  eSize,
SIZE psz 
)

Definition at line 1777 of file draw.c.

1780 {
1781  int bgtype = BT_BORDERFILL;
1782  HRESULT hr = S_OK;
1783  POINT size = {1, 1};
1784 
1785  if(!hTheme)
1786  return E_HANDLE;
1787 
1788  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_BGTYPE, &bgtype);
1789  if (bgtype == BT_NONE)
1790  /* do nothing */;
1791  else if(bgtype == BT_IMAGEFILE)
1792  hr = get_image_part_size (hTheme, hdc, iPartId, iStateId, prc, eSize, &size);
1793  else if(bgtype == BT_BORDERFILL)
1794  hr = get_border_background_size (hTheme, iPartId, iStateId, eSize, &size);
1795  else {
1796  FIXME("Unknown background type\n");
1797  /* This should never happen, and hence I don't know what to return */
1798  hr = E_FAIL;
1799  }
1800  psz->cx = size.x;
1801  psz->cy = size.y;
1802  return hr;
1803 }
#define E_HANDLE
Definition: winerror.h:2850
HRESULT hr
Definition: shlfolder.c:183
static HRESULT get_image_part_size(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *prc, THEMESIZE eSize, POINT *psz)
Definition: draw.c:410
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
#define E_FAIL
Definition: ddrawi.h:102
#define FIXME(fmt,...)
Definition: debug.h:110
LONG cx
Definition: windef.h:319
GLsizeiptr size
Definition: glext.h:5919
LONG HRESULT
Definition: typedefs.h:77
static HRESULT get_border_background_size(HTHEME hTheme, int iPartId, int iStateId, THEMESIZE eSize, POINT *psz)
Definition: draw.c:1755
HDC hdc
Definition: main.c:9
#define S_OK
Definition: intsafe.h:59
#define TMT_BGTYPE
Definition: vssym32.h:353
_Out_ LPRECT prc
Definition: ntgdi.h:1658
LONG cy
Definition: windef.h:320

Referenced by CTrayWindow::AdjustSizerRect(), CB_ThemedPaint(), CTrayWindow::DrawSizerWithTheme(), hit_test(), paint_scrollbar(), redraw_part(), STATUSBAR_DrawSizeGrip(), and ThemeCalculateCaptionButtonsPos().

◆ GetThemeTextExtent()

HRESULT WINAPI GetThemeTextExtent ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
LPCWSTR  pszText,
int  iCharCount,
DWORD  dwTextFlags,
const RECT pBoundingRect,
RECT pExtentRect 
)

Definition at line 1809 of file draw.c.

1813 {
1814  HRESULT hr;
1815  HFONT hFont = NULL;
1816  HGDIOBJ oldFont = NULL;
1817  LOGFONTW logfont;
1818  RECT rt = {0,0,0xFFFF,0xFFFF};
1819 
1820  TRACE("%d %d: stub\n", iPartId, iStateId);
1821  if(!hTheme)
1822  return E_HANDLE;
1823 
1824  if(pBoundingRect)
1825  rt = *pBoundingRect;
1826 
1827  hr = GetThemeFont(hTheme, hdc, iPartId, iStateId, TMT_FONT, &logfont);
1828  if(SUCCEEDED(hr)) {
1829  hFont = CreateFontIndirectW(&logfont);
1830  if(!hFont)
1831  TRACE("Failed to create font\n");
1832  }
1833  if(hFont)
1834  oldFont = SelectObject(hdc, hFont);
1835 
1836  DrawTextW(hdc, pszText, iCharCount, &rt, dwTextFlags|DT_CALCRECT);
1837  *pExtentRect = rt;
1838 
1839  if(hFont) {
1840  SelectObject(hdc, oldFont);
1842  }
1843  return S_OK;
1844 }
#define E_HANDLE
Definition: winerror.h:2850
HRESULT hr
Definition: shlfolder.c:183
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
HRESULT WINAPI GetThemeFont(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, int iPropId, LOGFONTW *pFont)
Definition: property.c:108
HFONT hFont
Definition: main.c:53
#define DT_CALCRECT
Definition: winuser.h:526
smooth NULL
Definition: ftsmooth.c:416
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
#define TMT_FONT
Definition: vssym32.h:144
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:77
HDC hdc
Definition: main.c:9
#define S_OK
Definition: intsafe.h:59
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
#define SUCCEEDED(hr)
Definition: intsafe.h:57
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:17

Referenced by HEADER_DrawItem().

◆ GetThemeTextMetrics()

HRESULT WINAPI GetThemeTextMetrics ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
TEXTMETRICW ptm 
)

Definition at line 1849 of file draw.c.

1851 {
1852  HRESULT hr;
1853  HFONT hFont = NULL;
1854  HGDIOBJ oldFont = NULL;
1855  LOGFONTW logfont;
1856 
1857  TRACE("(%p, %p, %d, %d)\n", hTheme, hdc, iPartId, iStateId);
1858  if(!hTheme)
1859  return E_HANDLE;
1860 
1861  hr = GetThemeFont(hTheme, hdc, iPartId, iStateId, TMT_FONT, &logfont);
1862  if(SUCCEEDED(hr)) {
1863  hFont = CreateFontIndirectW(&logfont);
1864  if(!hFont)
1865  TRACE("Failed to create font\n");
1866  }
1867  if(hFont)
1868  oldFont = SelectObject(hdc, hFont);
1869 
1870  if(!GetTextMetricsW(hdc, ptm))
1872 
1873  if(hFont) {
1874  SelectObject(hdc, oldFont);
1876  }
1877  return hr;
1878 }
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
BOOL WINAPI GetTextMetricsW(_In_ HDC, _Out_ LPTEXTMETRICW)
Definition: text.c:221
#define E_HANDLE
Definition: winerror.h:2850
HRESULT hr
Definition: shlfolder.c:183
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
HRESULT WINAPI GetThemeFont(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, int iPropId, LOGFONTW *pFont)
Definition: property.c:108
HFONT hFont
Definition: main.c:53
smooth NULL
Definition: ftsmooth.c:416
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
#define TMT_FONT
Definition: vssym32.h:144
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:77
HDC hdc
Definition: main.c:9
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
#define SUCCEEDED(hr)
Definition: intsafe.h:57

◆ IsThemeBackgroundPartiallyTransparent()

BOOL WINAPI IsThemeBackgroundPartiallyTransparent ( HTHEME  hTheme,
int  iPartId,
int  iStateId 
)

Definition at line 1883 of file draw.c.

1885 {
1886  int bgtype = BT_BORDERFILL;
1887  RECT rect = {0, 0, 0, 0};
1888  HBITMAP bmpSrc;
1889  RECT rcSrc;
1890  BOOL hasAlpha;
1891  INT transparent;
1892  COLORREF transparentcolor;
1893 
1894  TRACE("(%d,%d)\n", iPartId, iStateId);
1895 
1896  if(!hTheme)
1897  return FALSE;
1898 
1899  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_BGTYPE, &bgtype);
1900 
1901 #ifdef __REACTOS__
1902  if (bgtype == BT_NONE) return TRUE;
1903 #endif
1904  if (bgtype != BT_IMAGEFILE) return FALSE;
1905 
1906  if(FAILED (UXTHEME_LoadImage (hTheme, 0, iPartId, iStateId, &rect, FALSE,
1907  &bmpSrc, &rcSrc, &hasAlpha)))
1908  return FALSE;
1909 
1910  get_transparency (hTheme, iPartId, iStateId, hasAlpha, &transparent,
1911  &transparentcolor, FALSE);
1912  return (transparent != ALPHABLEND_NONE);
1913 }
#define TRUE
Definition: types.h:120
HRESULT UXTHEME_LoadImage(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph, HBITMAP *hBmp, RECT *bmpRect, BOOL *hasImageAlpha)
Definition: draw.c:230
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
static void get_transparency(HTHEME hTheme, int iPartId, int iStateId, BOOL hasImageAlpha, INT *transparent, COLORREF *transparentcolor, BOOL glyph)
Definition: draw.c:285
int32_t INT
Definition: typedefs.h:56
& rect
Definition: startmenu.cpp:1413
unsigned int BOOL
Definition: ntddk_ex.h:94
#define ALPHABLEND_NONE
Definition: uxthemep.h:265
#define TRACE(s)
Definition: solgame.cpp:4
DWORD COLORREF
Definition: windef.h:285
static HBITMAP
Definition: button.c:44
#define TMT_BGTYPE
Definition: vssym32.h:353

Referenced by EDIT_WM_NCPaint(), GB_ThemedPaint(), IPADDRESS_Draw(), LISTBOX_NCPaint(), LISTVIEW_NCPaint(), nc_paint(), CTrayNotifyWnd::OnEraseBackground(), OSK_ThemeHandler(), PB_ThemedPaint(), PROGRESS_Draw(), REBAR_EraseBkGnd(), Theme_Start(), TREEVIEW_NCPaint(), and UPDOWN_Draw().

◆ IsThemeDialogTextureEnabled()

BOOL WINAPI IsThemeDialogTextureEnabled ( HWND  hwnd)

Definition at line 56 of file draw.c.

57 {
58  DWORD dwDialogTextureFlags;
59  TRACE("(%p)\n", hwnd);
60 
61  dwDialogTextureFlags = HandleToUlong( GetPropW( hwnd, (LPCWSTR)MAKEINTATOM(atDialogThemeEnabled) ));
62  if (dwDialogTextureFlags == 0)
63  /* Means EnableThemeDialogTexture wasn't called for this dialog */
64  return FALSE;
65 
66  return (dwDialogTextureFlags & ETDT_ENABLE) && !(dwDialogTextureFlags & ETDT_DISABLE);
67 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define HandleToUlong(h)
Definition: basetsd.h:79
#define ETDT_ENABLE
Definition: dxdiag.c:28
#define TRACE(s)
Definition: solgame.cpp:4
unsigned long DWORD
Definition: ntddk_ex.h:95
ATOM atDialogThemeEnabled
Definition: system.c:46
#define ETDT_DISABLE
Definition: dxdiag.c:27
HANDLE WINAPI GetPropW(_In_ HWND, _In_ LPCWSTR)
#define MAKEINTATOM(i)
Definition: winbase.h:1416

Referenced by ThemeDlgPostWindowProc(), and THEMING_DialogSubclassProc().

◆ UXTHEME_DrawBackgroundFill()

static HRESULT UXTHEME_DrawBackgroundFill ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
RECT pRect,
const DTBGOPTS *  pOptions 
)
static

Definition at line 647 of file draw.c.

650 {
651  HRESULT hr = S_OK;
652  int filltype = FT_SOLID;
653 
654  TRACE("(%d,%d,%d)\n", iPartId, iStateId, pOptions->dwFlags);
655 
656  if(pOptions->dwFlags & DTBG_OMITCONTENT)
657  return S_OK;
658 
659  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_FILLTYPE, &filltype);
660 
661  if(filltype == FT_SOLID) {
662  HBRUSH hBrush;
663  COLORREF fillcolor = RGB(255,255,255);
664 
665  GetThemeColor(hTheme, iPartId, iStateId, TMT_FILLCOLOR, &fillcolor);
666  hBrush = CreateSolidBrush(fillcolor);
667  if(!FillRect(hdc, pRect, hBrush))
669  DeleteObject(hBrush);
670  }
671  else if(filltype == FT_VERTGRADIENT || filltype == FT_HORZGRADIENT) {
672  /* FIXME: This only accounts for 2 gradient colors (out of 5) and ignores
673  the gradient ratios (no idea how those work)
674  Few themes use this, and the ones I've seen only use 2 colors with
675  a gradient ratio of 0 and 255 respectively
676  */
677 
678  COLORREF gradient1 = RGB(0,0,0);
679  COLORREF gradient2 = RGB(255,255,255);
680  TRIVERTEX vert[2];
681  GRADIENT_RECT gRect;
682 
683  FIXME("Gradient implementation not complete\n");
684 
685  GetThemeColor(hTheme, iPartId, iStateId, TMT_GRADIENTCOLOR1, &gradient1);
686  GetThemeColor(hTheme, iPartId, iStateId, TMT_GRADIENTCOLOR2, &gradient2);
687 
688  vert[0].x = pRect->left;
689  vert[0].y = pRect->top;
690  vert[0].Red = GetRValue(gradient1) << 8;
691  vert[0].Green = GetGValue(gradient1) << 8;
692  vert[0].Blue = GetBValue(gradient1) << 8;
693  vert[0].Alpha = 0xff00;
694 
695  vert[1].x = pRect->right;
696  vert[1].y = pRect->bottom;
697  vert[1].Red = GetRValue(gradient2) << 8;
698  vert[1].Green = GetGValue(gradient2) << 8;
699  vert[1].Blue = GetBValue(gradient2) << 8;
700  vert[1].Alpha = 0xff00;
701 
702  gRect.UpperLeft = 0;
703  gRect.LowerRight = 1;
704  GradientFill(hdc,vert,2,&gRect,1,filltype==FT_HORZGRADIENT?GRADIENT_FILL_RECT_H:GRADIENT_FILL_RECT_V);
705  }
706  else if(filltype == FT_RADIALGRADIENT) {
707  /* I've never seen this used in a theme */
708  FIXME("Radial gradient\n");
709  }
710  else if(filltype == FT_TILEIMAGE) {
711  /* I've never seen this used in a theme */
712  FIXME("Tile image\n");
713  }
714  return hr;
715 }
ULONG UpperLeft
Definition: wingdi.h:2783
ULONG LowerRight
Definition: wingdi.h:2784
#define TMT_GRADIENTCOLOR2
Definition: vssym32.h:336
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
HRESULT hr
Definition: shlfolder.c:183
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
#define GetRValue(rgb)
Definition: wingdi.h:2913
LONG top
Definition: windef.h:292
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
INT WINAPI FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr)
Definition: draw.c:1041
#define GetGValue(rgb)
Definition: wingdi.h:2914
LONG y
Definition: wingdi.h:2763
#define FIXME(fmt,...)
Definition: debug.h:110
#define TRACE(s)
Definition: solgame.cpp:4
LONG x
Definition: wingdi.h:2762
LONG HRESULT
Definition: typedefs.h:77
DWORD COLORREF
Definition: windef.h:285
#define RGB(r, g, b)
Definition: wingdi.h:2918
HDC hdc
Definition: main.c:9
#define TMT_GRADIENTCOLOR1
Definition: vssym32.h:335
HRESULT WINAPI GetThemeColor(HTHEME hTheme, int iPartId, int iStateId, int iPropId, COLORREF *pColor)
Definition: property.c:45
#define S_OK
Definition: intsafe.h:59
#define TMT_FILLTYPE
Definition: vssym32.h:355
COLOR16 Alpha
Definition: wingdi.h:2767
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
COLOR16 Red
Definition: wingdi.h:2764
COLOR16 Blue
Definition: wingdi.h:2766
LONG bottom
Definition: windef.h:294
#define GetBValue(rgb)
Definition: wingdi.h:2915
COLOR16 Green
Definition: wingdi.h:2765
#define TMT_FILLCOLOR
Definition: vssym32.h:327

Referenced by UXTHEME_DrawBorderBackground().

◆ UXTHEME_DrawBorderBackground()

static HRESULT UXTHEME_DrawBorderBackground ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
const RECT pRect,
const DTBGOPTS *  pOptions 
)
static

Definition at line 722 of file draw.c.

725 {
726  HRESULT hr;
727  RECT rt;
728 
729  rt = *pRect;
730 
731  hr = UXTHEME_DrawBorderRectangle(hTheme, hdc, iPartId, iStateId, &rt, pOptions);
732  if(FAILED(hr))
733  return hr;
734  return UXTHEME_DrawBackgroundFill(hTheme, hdc, iPartId, iStateId, &rt, pOptions);
735 }
static HRESULT UXTHEME_DrawBackgroundFill(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *pRect, const DTBGOPTS *pOptions)
Definition: draw.c:647
HRESULT hr
Definition: shlfolder.c:183
static HRESULT UXTHEME_DrawBorderRectangle(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *pRect, const DTBGOPTS *pOptions)
Definition: draw.c:600
LONG HRESULT
Definition: typedefs.h:77
HDC hdc
Definition: main.c:9

Referenced by DrawThemeBackgroundEx().

◆ UXTHEME_DrawBorderRectangle()

static HRESULT UXTHEME_DrawBorderRectangle ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
RECT pRect,
const DTBGOPTS *  pOptions 
)
static

Definition at line 600 of file draw.c.

603 {
604  HRESULT hr = S_OK;
605  HPEN hPen;
606  HGDIOBJ oldPen;
607  COLORREF bordercolor = RGB(0,0,0);
608  int bordersize = 1;
609 
610  GetThemeInt(hTheme, iPartId, iStateId, TMT_BORDERSIZE, &bordersize);
611  if(bordersize > 0) {
612  POINT ptCorners[5];
613  ptCorners[0].x = pRect->left;
614  ptCorners[0].y = pRect->top;
615  ptCorners[1].x = pRect->right-1;
616  ptCorners[1].y = pRect->top;
617  ptCorners[2].x = pRect->right-1;
618  ptCorners[2].y = pRect->bottom-1;
619  ptCorners[3].x = pRect->left;
620  ptCorners[3].y = pRect->bottom-1;
621  ptCorners[4].x = pRect->left;
622  ptCorners[4].y = pRect->top;
623 
624  InflateRect(pRect, -bordersize, -bordersize);
625  if(pOptions->dwFlags & DTBG_OMITBORDER)
626  return S_OK;
627  GetThemeColor(hTheme, iPartId, iStateId, TMT_BORDERCOLOR, &bordercolor);
628  hPen = CreatePen(PS_SOLID, bordersize, bordercolor);
629  if(!hPen)
631  oldPen = SelectObject(hdc, hPen);
632 
633  if(!Polyline(hdc, ptCorners, 5))
635 
636  SelectObject(hdc, oldPen);
637  DeleteObject(hPen);
638  }
639  return hr;
640 }
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
long y
Definition: polytest.cpp:48
HRESULT hr
Definition: shlfolder.c:183
long x
Definition: polytest.cpp:48
LONG top
Definition: windef.h:292
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
#define TMT_BORDERCOLOR
Definition: vssym32.h:326
#define PS_SOLID
Definition: wingdi.h:585
LONG HRESULT
Definition: typedefs.h:77
DWORD COLORREF
Definition: windef.h:285
#define RGB(r, g, b)
Definition: wingdi.h:2918
HDC hdc
Definition: main.c:9
HRESULT WINAPI GetThemeColor(HTHEME hTheme, int iPartId, int iStateId, int iPropId, COLORREF *pColor)
Definition: property.c:45
#define S_OK
Definition: intsafe.h:59
BOOL WINAPI Polyline(_In_ HDC hdc, _In_reads_(cpt) const POINT *apt, _In_ int cpt)
LONG bottom
Definition: windef.h:294
#define TMT_BORDERSIZE
Definition: vssym32.h:274
HRESULT WINAPI GetThemeInt(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:126

Referenced by UXTHEME_DrawBorderBackground().

◆ UXTHEME_DrawGlyph()

static HRESULT UXTHEME_DrawGlyph ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
RECT pRect,
const DTBGOPTS *  pOptions 
)
static

Definition at line 387 of file draw.c.

390 {
391  int glyphtype = GT_NONE;
392 
393  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_GLYPHTYPE, &glyphtype);
394 
395  if(glyphtype == GT_IMAGEGLYPH) {
396  return UXTHEME_DrawImageGlyph(hTheme, hdc, iPartId, iStateId, pRect, pOptions);
397  }
398  else if(glyphtype == GT_FONTGLYPH) {
399  /* I don't know what a font glyph is, I've never seen it used in any themes */
400  FIXME("Font glyph\n");
401  }
402  return S_OK;
403 }
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
#define FIXME(fmt,...)
Definition: debug.h:110
HDC hdc
Definition: main.c:9
static HRESULT UXTHEME_DrawImageGlyph(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *pRect, const DTBGOPTS *pOptions)
Definition: draw.c:318
#define S_OK
Definition: intsafe.h:59
#define TMT_GLYPHTYPE
Definition: vssym32.h:364

Referenced by DrawThemeBackgroundEx().

◆ UXTHEME_DrawImageBackground()

static HRESULT UXTHEME_DrawImageBackground ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
RECT pRect,
const DTBGOPTS *  pOptions 
)
static

Definition at line 514 of file draw.c.

517 {
518  HRESULT hr = S_OK;
519  HBITMAP bmpSrc;
520  RECT rcSrc;
521  RECT rcDst;
522  POINT dstSize;
523  POINT drawSize;
524  int sizingtype = ST_STRETCH;
525  INT transparent;
526  COLORREF transparentcolor = 0;
527  BOOL hasAlpha;
528  MARGINS sm;
529  GDI_DRAW_STREAM DrawStream;
530 
531  hr = UXTHEME_LoadImage(hTheme, hdc, iPartId, iStateId, pRect, FALSE, &bmpSrc, &rcSrc, &hasAlpha);
532  if(FAILED(hr))
533  return hr;
534  get_transparency (hTheme, iPartId, iStateId, hasAlpha, &transparent, &transparentcolor, FALSE);
535 
536  rcDst = *pRect;
537  dstSize.x = rcDst.right-rcDst.left;
538  dstSize.y = rcDst.bottom-rcDst.top;
539 
540  GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_SIZINGMARGINS, NULL, &sm);
541  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_SIZINGTYPE, &sizingtype);
542 
543  /*FIXME: Is this ever used? */
544  /*GetThemeBool(hTheme, iPartId, iStateId, TMT_BORDERONLY, &borderonly);*/
545 
546  if(sizingtype == ST_TRUESIZE) {
547  int valign = VA_CENTER, halign = HA_CENTER;
548 
549  get_image_part_size (hTheme, hdc, iPartId, iStateId, pRect, TS_DRAW, &drawSize);
550  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_VALIGN, &valign);
551  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_HALIGN, &halign);
552 
553  if (halign == HA_CENTER)
554  rcDst.left += (dstSize.x/2)-(drawSize.x/2);
555  else if (halign == HA_RIGHT)
556  rcDst.left = rcDst.right - drawSize.x;
557  if (valign == VA_CENTER)
558  rcDst.top += (dstSize.y/2)-(drawSize.y/2);
559  else if (valign == VA_BOTTOM)
560  rcDst.top = rcDst.bottom - drawSize.y;
561  rcDst.right = rcDst.left + drawSize.x;
562  rcDst.bottom = rcDst.top + drawSize.y;
563  *pRect = rcDst;
564  }
565 
566  DrawStream.signature = 0x44727753;
567  DrawStream.reserved = 0;
568  DrawStream.unknown1 = 1;
569  DrawStream.unknown2 = 9;
570  DrawStream.hDC = hdc;
571  DrawStream.hImage = bmpSrc;
572  DrawStream.crTransparent = transparentcolor;
573  DrawStream.rcSrc = rcSrc;
574  DrawStream.rcDest = rcDst;
575  DrawStream.leftSizingMargin = sm.cxLeftWidth;
576  DrawStream.rightSizingMargin = sm.cxRightWidth;
577  DrawStream.topSizingMargin = sm.cyTopHeight;
578  DrawStream.bottomSizingMargin = sm.cyBottomHeight;
579  DrawStream.drawOption = 0;
580 
581  if (transparent == ALPHABLEND_FULL)
582  DrawStream.drawOption |= DS_TRANSPARENTALPHA;
583  else if (transparent == ALPHABLEND_BINARY)
584  DrawStream.drawOption |= DS_TRANSPARENTCLR;
585 
586  if (sizingtype == ST_TILE)
587  DrawStream.drawOption |= DS_TILE;
588  else if (sizingtype == ST_TRUESIZE)
589  DrawStream.drawOption |= DS_TRUESIZE;
590 
591  GdiDrawStream(hdc, sizeof(DrawStream), &DrawStream);
593 }
#define DS_TRANSPARENTALPHA
Definition: undocgdi.h:6
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
HRESULT UXTHEME_LoadImage(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph, HBITMAP *hBmp, RECT *bmpRect, BOOL *hasImageAlpha)
Definition: draw.c:230
long y
Definition: polytest.cpp:48
HRESULT hr
Definition: shlfolder.c:183
static HRESULT get_image_part_size(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *prc, THEMESIZE eSize, POINT *psz)
Definition: draw.c:410
long x
Definition: polytest.cpp:48
#define DS_TILE
Definition: undocgdi.h:5
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
static void get_transparency(HTHEME hTheme, int iPartId, int iStateId, BOOL hasImageAlpha, INT *transparent, COLORREF *transparentcolor, BOOL glyph)
Definition: draw.c:285
LONG top
Definition: windef.h:292
#define DS_TRANSPARENTCLR
Definition: undocgdi.h:7
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
int32_t INT
Definition: typedefs.h:56
Definition: misc.c:279
#define ALPHABLEND_BINARY
Definition: uxthemep.h:267
DWORD bottomSizingMargin
Definition: undocgdi.h:25
DWORD leftSizingMargin
Definition: undocgdi.h:22
BOOL WINAPI GdiDrawStream(HDC dc, ULONG l, PGDI_DRAW_STREAM pDS)
Definition: misc.c:644
unsigned int BOOL
Definition: ntddk_ex.h:94
int cyBottomHeight
Definition: misc.c:283
smooth NULL
Definition: ftsmooth.c:416
DWORD rightSizingMargin
Definition: undocgdi.h:23
DWORD topSizingMargin
Definition: undocgdi.h:24
int cyTopHeight
Definition: misc.c:282
#define TMT_SIZINGMARGINS
Definition: vssym32.h:323
#define TMT_SIZINGTYPE
Definition: vssym32.h:356
LONG HRESULT
Definition: typedefs.h:77
#define TMT_VALIGN
Definition: vssym32.h:359
DWORD COLORREF
Definition: windef.h:285
int cxLeftWidth
Definition: misc.c:280
HDC hdc
Definition: main.c:9
#define TMT_HALIGN
Definition: vssym32.h:357
HRESULT WINAPI GetThemeMargins(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, int iPropId, RECT *prc, MARGINS *pMargins)
Definition: property.c:216
#define S_OK
Definition: intsafe.h:59
#define DS_TRUESIZE
Definition: undocgdi.h:8
#define ALPHABLEND_FULL
Definition: uxthemep.h:269
LONG bottom
Definition: windef.h:294
int cxRightWidth
Definition: misc.c:281
static HBITMAP
Definition: button.c:44

Referenced by DrawThemeBackgroundEx().

◆ UXTHEME_DrawImageGlyph()

static HRESULT UXTHEME_DrawImageGlyph ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
RECT pRect,
const DTBGOPTS *  pOptions 
)
static

Definition at line 318 of file draw.c.

321 {
322  HRESULT hr;
323  HBITMAP bmpSrc = NULL;
324  RECT rcSrc;
325  INT transparent = 0;
326  COLORREF transparentcolor;
327  int valign = VA_CENTER;
328  int halign = HA_CENTER;
329  POINT dstSize;
330  POINT srcSize;
331  BOOL hasAlpha;
332  RECT rcDst;
333  GDI_DRAW_STREAM DrawStream;
334 
335  hr = UXTHEME_LoadImage(hTheme, hdc, iPartId, iStateId, pRect, TRUE,
336  &bmpSrc, &rcSrc, &hasAlpha);
337  if(FAILED(hr)) return hr;
338 
339  dstSize.x = pRect->right-pRect->left;
340  dstSize.y = pRect->bottom-pRect->top;
341  srcSize.x = rcSrc.right-rcSrc.left;
342  srcSize.y = rcSrc.bottom-rcSrc.top;
343 
344  get_transparency (hTheme, iPartId, iStateId, hasAlpha, &transparent,
345  &transparentcolor, TRUE);
346  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_VALIGN, &valign);
347  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_HALIGN, &halign);
348 
349  rcDst = *pRect;
350  if(halign == HA_CENTER) rcDst.left += (dstSize.x/2)-(srcSize.x/2);
351  else if(halign == HA_RIGHT) rcDst.left += dstSize.x-srcSize.x;
352  if(valign == VA_CENTER) rcDst.top += (dstSize.y/2)-(srcSize.y/2);
353  else if(valign == VA_BOTTOM) rcDst.top += dstSize.y-srcSize.y;
354 
355  rcDst.right = rcDst.left + srcSize.x;
356  rcDst.bottom = rcDst.top + srcSize.y;
357 
358  DrawStream.signature = 0x44727753;
359  DrawStream.reserved = 0;
360  DrawStream.unknown1 = 1;
361  DrawStream.unknown2 = 9;
362  DrawStream.hDC = hdc;
363  DrawStream.hImage = bmpSrc;
364  DrawStream.crTransparent = transparentcolor;
365  DrawStream.rcSrc = rcSrc;
366  DrawStream.rcDest = rcDst;
367  DrawStream.leftSizingMargin = 0;
368  DrawStream.rightSizingMargin = 0;
369  DrawStream.topSizingMargin = 0;
370  DrawStream.bottomSizingMargin = 0;
371  DrawStream.drawOption = DS_TRUESIZE;
372 
373  if (transparent == ALPHABLEND_FULL)
374  DrawStream.drawOption |= DS_TRANSPARENTALPHA;
375  else if (transparent == ALPHABLEND_BINARY)
376  DrawStream.drawOption |= DS_TRANSPARENTCLR;
377 
378  GdiDrawStream(hdc, sizeof(DrawStream), &DrawStream);
380 }
#define DS_TRANSPARENTALPHA
Definition: undocgdi.h:6
#define TRUE
Definition: types.h:120
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
HRESULT UXTHEME_LoadImage(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph, HBITMAP *hBmp, RECT *bmpRect, BOOL *hasImageAlpha)
Definition: draw.c:230
long y
Definition: polytest.cpp:48
HRESULT hr
Definition: shlfolder.c:183
long x
Definition: polytest.cpp:48
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
static void get_transparency(HTHEME hTheme, int iPartId, int iStateId, BOOL hasImageAlpha, INT *transparent, COLORREF *transparentcolor, BOOL glyph)
Definition: draw.c:285
LONG top
Definition: windef.h:292
#define DS_TRANSPARENTCLR
Definition: undocgdi.h:7
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
int32_t INT
Definition: typedefs.h:56
#define ALPHABLEND_BINARY
Definition: uxthemep.h:267
DWORD bottomSizingMargin
Definition: undocgdi.h:25
DWORD leftSizingMargin
Definition: undocgdi.h:22
BOOL WINAPI GdiDrawStream(HDC dc, ULONG l, PGDI_DRAW_STREAM pDS)
Definition: misc.c:644
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
DWORD rightSizingMargin
Definition: undocgdi.h:23
DWORD topSizingMargin
Definition: undocgdi.h:24
LONG HRESULT
Definition: typedefs.h:77
#define TMT_VALIGN
Definition: vssym32.h:359
DWORD COLORREF
Definition: windef.h:285
HDC hdc
Definition: main.c:9
#define TMT_HALIGN
Definition: vssym32.h:357
#define DS_TRUESIZE
Definition: undocgdi.h:8
#define ALPHABLEND_FULL
Definition: uxthemep.h:269
LONG bottom
Definition: windef.h:294
static HBITMAP
Definition: button.c:44

Referenced by UXTHEME_DrawGlyph().

◆ UXTHEME_DrawThemePartToDib()

static HBITMAP UXTHEME_DrawThemePartToDib ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
LPCRECT  pRect 
)
static

Definition at line 1574 of file draw.c.

1575 {
1576  HDC hdcMem;
1577  BITMAPINFO bmi;
1578  HBITMAP hbmp, hbmpOld;
1579  HBRUSH hbrBack;
1580 
1582 
1583  memset(&bmi, 0, sizeof(bmi));
1584  bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
1585  bmi.bmiHeader.biWidth = pRect->right;
1586  bmi.bmiHeader.biHeight = -pRect->bottom;
1587  bmi.bmiHeader.biPlanes = 1;
1588  bmi.bmiHeader.biBitCount = 32;
1589  hbmp = CreateDIBSection(hdcMem, &bmi, DIB_RGB_COLORS , NULL, 0, 0);
1590 
1592 
1593  /* FIXME: use an internal function that doesn't do transparent blt */
1594  hbrBack = CreateSolidBrush(RGB(255,0,255));
1595 
1596  FillRect(hdcMem, pRect, hbrBack);
1597 
1598  DrawThemeBackground(hTheme, hdcMem, iPartId, iStateId, pRect, NULL);
1599 
1600  DeleteObject(hbrBack);
1603 
1604  return hbmp;
1605 }
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1454
static HDC
Definition: imagelist.c:92
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
LONG right
Definition: windef.h:293
HRESULT WINAPI DrawThemeBackground(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect)
Definition: draw.c:128
INT WINAPI FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr)
Definition: draw.c:1041
HANDLE hbmpOld
Definition: magnifier.c:56
smooth NULL
Definition: ftsmooth.c:416
HBITMAP hbmp
#define RGB(r, g, b)
Definition: wingdi.h:2918
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
Definition: bitmap.c:197
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
LONG bottom
Definition: windef.h:294
static HBITMAP
Definition: button.c:44
#define DIB_RGB_COLORS
Definition: wingdi.h:366
#define memset(x, y, z)
Definition: compat.h:39
HDC hdcMem
Definition: welcome.c:104

Referenced by UXTHEME_GetImageBackBackgroundRegion().

◆ UXTHEME_GetImageBackBackgroundRegion()

HRESULT UXTHEME_GetImageBackBackgroundRegion ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
LPCRECT  pRect,
HRGN *  pRegion 
)

Definition at line 1697 of file draw.c.

1698 {
1699  HBITMAP hbmp;
1700  DIBSECTION dib;
1701  RGBQUAD clrTransparent = {0xFF,0x0, 0xFF,0x0};
1702 
1703  /* Draw the theme part to a dib */
1704  hbmp = UXTHEME_DrawThemePartToDib(hTheme, hdc, iPartId, iStateId, pRect);
1705 
1706  /* Retrieve the info of the dib section */
1707  GetObjectW(hbmp, sizeof (DIBSECTION), &dib);
1708 
1709  /* Convert the bits of the dib section to a region */
1710  *pRegion = UXTHEME_RegionFromDibBits((RGBQUAD*)dib.dsBm.bmBits, &clrTransparent, pRect);
1711 
1712  /* Free the temp bitmap */
1713  DeleteObject(hbmp);
1714 
1715  return S_OK;
1716 }
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
HBITMAP hbmp
static HBITMAP UXTHEME_DrawThemePartToDib(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCRECT pRect)
Definition: draw.c:1574
HDC hdc
Definition: main.c:9
static HRGN UXTHEME_RegionFromDibBits(RGBQUAD *pBuffer, RGBQUAD *pclrTransparent, LPCRECT pRect)
Definition: draw.c:1610
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
#define S_OK
Definition: intsafe.h:59
static const BYTE dib[]
Definition: ole2.c:201
static HBITMAP
Definition: button.c:44

Referenced by GetThemeBackgroundRegion().

◆ UXTHEME_LoadImage()

HRESULT UXTHEME_LoadImage ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
const RECT pRect,
BOOL  glyph,
HBITMAP hBmp,
RECT bmpRect,
BOOL hasImageAlpha 
)

Definition at line 230 of file draw.c.

232 {
233  int imagelayout = IL_HORIZONTAL;
234  int imagecount = 1;
235  int imagenum;
236  BITMAP bmp;
239  PTHEME_CLASS pClass;
240 
241  pClass = ValidateHandle(hTheme);
242  if (!pClass)
243  return E_HANDLE;
244 
245  tp = UXTHEME_SelectImage(hTheme, hdc, iPartId, iStateId, pRect, glyph);
246  if(!tp) {
247  FIXME("Couldn't determine image for part/state %d/%d, invalid theme?\n", iPartId, iStateId);
248  return E_PROP_ID_UNSUPPORTED;
249  }
250  lstrcpynW(szPath, tp->lpValue, min(tp->dwValueLen+1, sizeof(szPath)/sizeof(szPath[0])));
251  *hBmp = MSSTYLES_LoadBitmap(pClass, szPath, hasImageAlpha);
252  if(!*hBmp) {
253  TRACE("Failed to load bitmap %s\n", debugstr_w(szPath));
255  }
256 
257  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_IMAGELAYOUT, &imagelayout);
258  GetThemeInt(hTheme, iPartId, iStateId, TMT_IMAGECOUNT, &imagecount);
259 
260  imagenum = max (min (imagecount, iStateId), 1) - 1;
261  GetObjectW(*hBmp, sizeof(bmp), &bmp);
262 
263  if(imagecount < 1) imagecount = 1;
264 
265  if(imagelayout == IL_VERTICAL) {
266  int height = bmp.bmHeight/imagecount;
267  bmpRect->left = 0;
268  bmpRect->right = bmp.bmWidth;
269  bmpRect->top = imagenum * height;
270  bmpRect->bottom = bmpRect->top + height;
271  }
272  else {
273  int width = bmp.bmWidth/imagecount;
274  bmpRect->left = imagenum * width;
275  bmpRect->right = bmpRect->left + width;
276  bmpRect->top = 0;
277  bmpRect->bottom = bmp.bmHeight;
278  }
279  return S_OK;
280 }
GLint GLint GLsizei width
Definition: gl.h:1546
#define max(a, b)
Definition: svc.c:63
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define E_HANDLE
Definition: winerror.h:2850
#define TMT_IMAGELAYOUT
Definition: vssym32.h:363
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
LONG top
Definition: windef.h:292
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
_In_ UINT64 _In_ UINT64 _In_ UINT64 _In_opt_ traverse_ptr * tp
Definition: btrfs.c:2663
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
#define lstrcpynW
Definition: compat.h:397
#define TMT_IMAGECOUNT
Definition: vssym32.h:272
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:110
HBITMAP MSSTYLES_LoadBitmap(PTHEME_CLASS tc, LPCWSTR lpFilename, BOOL *hasAlpha)
Definition: msstyles.c:896
#define TRACE(s)
Definition: solgame.cpp:4
#define E_PROP_ID_UNSUPPORTED
Definition: vfwmsgs.h:173
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:26
BITMAP bmp
Definition: alphablend.c:62
PTHEME_CLASS ValidateHandle(HTHEME hTheme)
Definition: system.c:717
HDC hdc
Definition: main.c:9
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
#define S_OK
Definition: intsafe.h:59
LPCWSTR szPath
Definition: env.c:35
Definition: bl.h:1331
#define min(a, b)
Definition: monoChain.cc:55
LONG bottom
Definition: windef.h:294
HRESULT WINAPI GetThemeInt(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:126
static PTHEME_PROPERTY UXTHEME_SelectImage(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph)
Definition: draw.c:147

Referenced by get_image_part_size(), GetDiaogTextureBrush(), IsThemeBackgroundPartiallyTransparent(), UXTHEME_DrawImageBackground(), and UXTHEME_DrawImageGlyph().

◆ UXTHEME_RegionFromDibBits()

static HRGN UXTHEME_RegionFromDibBits ( RGBQUAD pBuffer,
RGBQUAD pclrTransparent,
LPCRECT  pRect 
)
static

Definition at line 1610 of file draw.c.

1611 {
1612  int x, y, xstart;
1613  int cMaxRgnRects, cRgnDataSize, cRgnRects;
1614  RECT* prcCurrent;
1615  PRGNDATA prgnData;
1616  ULONG clrTransparent, *pclrCurrent;
1617  HRGN hrgnRet;
1618 
1619  pclrCurrent = (PULONG)pBuffer;
1620  clrTransparent = *(PULONG)pclrTransparent;
1621 
1622  /* Create a region and pre-allocate memory enough for 3 spaces in one row*/
1623  cRgnRects = 0;
1624  cMaxRgnRects = 4* (pRect->bottom-pRect->top);
1625  cRgnDataSize = sizeof(RGNDATA) + cMaxRgnRects * sizeof(RECT);
1626 
1627  /* Allocate the region data */
1628  prgnData = (PRGNDATA)HeapAlloc(GetProcessHeap(), 0, cRgnDataSize);
1629 
1630  prcCurrent = (PRECT)prgnData->Buffer;
1631 
1632  /* Calculate the region rects */
1633  y=0;
1634  /* Scan each line of the bitmap */
1635  while(y<pRect->bottom)
1636  {
1637  x=0;
1638  /* Scan each pixel */
1639  while (x<pRect->right)
1640  {
1641  /* Check if the pixel is not transparent and it is in the requested rect */
1642  if(*pclrCurrent != clrTransparent && PT_IN_RECT(pRect,x,y))
1643  {
1644  xstart = x;
1645  /* Find the end of the opaque row of pixels */
1646  while (x<pRect->right)
1647  {
1648  if(*pclrCurrent == clrTransparent || !PT_IN_RECT(pRect,x,y))
1649  break;
1650  x++;
1651  pclrCurrent++;
1652  }
1653 
1654  /* Add the scaned line to the region */
1655  SetRect(prcCurrent, xstart, y,x,y+1);
1656  prcCurrent++;
1657  cRgnRects++;
1658 
1659  /* Increase the size of the buffer if it is full */
1660  if(cRgnRects == cMaxRgnRects)
1661  {
1662  cMaxRgnRects *=2;
1663  cRgnDataSize = sizeof(RGNDATA) + cMaxRgnRects * sizeof(RECT);
1664  prgnData = (PRGNDATA)HeapReAlloc(GetProcessHeap(),
1665  0,
1666  prgnData,
1667  cRgnDataSize);
1668  prcCurrent = (RECT*)prgnData->Buffer + cRgnRects;
1669  }
1670  }
1671  else
1672  {
1673  x++;
1674  pclrCurrent++;
1675  }
1676  }
1677  y++;
1678  }
1679 
1680  /* Fill the region data header */
1681  prgnData->rdh.dwSize = sizeof(prgnData->rdh);
1682  prgnData->rdh.iType = RDH_RECTANGLES;
1683  prgnData->rdh.nCount = cRgnRects;
1684  prgnData->rdh.nRgnSize = cRgnDataSize;
1685  prgnData->rdh.rcBound = *pRect;
1686 
1687  /* Create the region*/
1688  hrgnRet = ExtCreateRegion (NULL, cRgnDataSize, prgnData);
1689 
1690  /* Free the region data*/
1691  HeapFree(GetProcessHeap(),0,prgnData);
1692 
1693  /* return the region*/
1694  return hrgnRet;
1695 }
struct _RGNDATA RGNDATA
struct _RGNDATA * PRGNDATA
LONG top
Definition: windef.h:292
char Buffer[1]
Definition: axextend.idl:395
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
smooth NULL
Definition: ftsmooth.c:416
PVOID pBuffer
GLint GLint bottom
Definition: glext.h:7726
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define RDH_RECTANGLES
Definition: wingdi.h:668
GLdouble GLdouble right
Definition: glext.h:10859
HRGN WINAPI ExtCreateRegion(_In_opt_ const XFORM *lpx, _In_ DWORD nCount, _In_reads_bytes_(nCount) const RGNDATA *lpData)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
#define HeapReAlloc
Definition: compat.h:393
unsigned int * PULONG
Definition: retypes.h:1
RGNDATAHEADER rdh
Definition: axextend.idl:394
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define PT_IN_RECT(lprc, x, y)
Definition: draw.c:1607
unsigned int ULONG
Definition: retypes.h:1
LONG bottom
Definition: windef.h:294
struct tagRECT * PRECT
#define HeapFree(x, y, z)
Definition: compat.h:394

Referenced by UXTHEME_GetImageBackBackgroundRegion().

◆ UXTHEME_SelectImage()

static PTHEME_PROPERTY UXTHEME_SelectImage ( HTHEME  hTheme,
HDC  hdc,
int  iPartId,
int  iStateId,
const RECT pRect,
BOOL  glyph 
)
static

Definition at line 147 of file draw.c.

148 {
149  PTHEME_CLASS pClass;
151  int imageselecttype = IST_NONE;
152  int i;
153  int image;
154 
155  if(glyph)
157  else
159 
160  pClass = ValidateHandle(hTheme);
161  if((tp=MSSTYLES_FindProperty(pClass, iPartId, iStateId, TMT_FILENAME, image)))
162  return tp;
163  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_IMAGESELECTTYPE, &imageselecttype);
164 
165  if(imageselecttype == IST_DPI) {
166  int reqdpi = 0;
167  int screendpi = GetDeviceCaps(hdc, LOGPIXELSX);
168  for(i=4; i>=0; i--) {
169  reqdpi = 0;
170  if(SUCCEEDED(GetThemeInt(hTheme, iPartId, iStateId, i + TMT_MINDPI1, &reqdpi))) {
171  if(reqdpi != 0 && screendpi >= reqdpi) {
172  TRACE("Using %d DPI, image %d\n", reqdpi, i + TMT_IMAGEFILE1);
173  return MSSTYLES_FindProperty(pClass, iPartId, iStateId, TMT_FILENAME, i + TMT_IMAGEFILE1);
174  }
175  }
176  }
177  /* If an image couldn't be selected, choose the first one */
178  return MSSTYLES_FindProperty(pClass, iPartId, iStateId, TMT_FILENAME, TMT_IMAGEFILE1);
179  }
180  else if(imageselecttype == IST_SIZE) {
181  POINT size = {pRect->right-pRect->left, pRect->bottom-pRect->top};
182  POINT reqsize;
183  for(i=4; i>=0; i--) {
184  PTHEME_PROPERTY fileProp =
185  MSSTYLES_FindProperty(pClass, iPartId, iStateId, TMT_FILENAME, i + TMT_IMAGEFILE1);
186  if (!fileProp) continue;
187  if(FAILED(GetThemePosition(hTheme, iPartId, iStateId, i + TMT_MINSIZE1, &reqsize))) {
188  /* fall back to size of Nth image */
190  int imagelayout = IL_HORIZONTAL;
191  int imagecount = 1;
192  BITMAP bmp;
193  HBITMAP hBmp;
194  BOOL hasAlpha;
195 
196  lstrcpynW(szPath, fileProp->lpValue,
197  min(fileProp->dwValueLen+1, sizeof(szPath)/sizeof(szPath[0])));
198  hBmp = MSSTYLES_LoadBitmap(pClass, szPath, &hasAlpha);
199  if(!hBmp) continue;
200 
201  GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_IMAGELAYOUT, &imagelayout);
202  GetThemeInt(hTheme, iPartId, iStateId, TMT_IMAGECOUNT, &imagecount);
203 
204  GetObjectW(hBmp, sizeof(bmp), &bmp);
205  if(imagelayout == IL_VERTICAL) {
206  reqsize.x = bmp.bmWidth;
207  reqsize.y = bmp.bmHeight/imagecount;
208  }
209  else {
210  reqsize.x = bmp.bmWidth/imagecount;
211  reqsize.y = bmp.bmHeight;
212  }
213  }
214  if(reqsize.x <= size.x && reqsize.y <= size.y) {
215  TRACE("Using image size %dx%d, image %d\n", reqsize.x, reqsize.y, i + TMT_IMAGEFILE1);
216  return fileProp;
217  }
218  }
219  /* If an image couldn't be selected, choose the smallest one */
220  return MSSTYLES_FindProperty(pClass, iPartId, iStateId, TMT_FILENAME, TMT_IMAGEFILE1);
221  }
222  return NULL;
223 }
PTHEME_PROPERTY MSSTYLES_FindProperty(PTHEME_CLASS tc, int iPartId, int iStateId, int iPropertyPrimitive, int iPropertyId)
Definition: msstyles.c:835
#define TMT_IMAGEFILE1
Definition: vssym32.h:306
GLeglImageOES image
Definition: gl.h:2204
#define LOGPIXELSX
Definition: wingdi.h:717
long y
Definition: polytest.cpp:48
#define TMT_IMAGELAYOUT
Definition: vssym32.h:363
long x
Definition: polytest.cpp:48
HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:63
LONG top
Definition: windef.h:292
HRESULT WINAPI GetThemePosition(HTHEME hTheme, int iPartId, int iStateId, int iPropId, POINT *pPoint)
Definition: property.c:162
_In_ UINT64 _In_ UINT64 _In_ UINT64 _In_opt_ traverse_ptr * tp
Definition: btrfs.c:2663
LONG left
Definition: windef.h:291
#define TMT_GLYPHIMAGEFILE
Definition: vssym32.h:311
LONG right
Definition: windef.h:293
#define lstrcpynW
Definition: compat.h:397
#define TMT_IMAGECOUNT
Definition: vssym32.h:272
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
HBITMAP MSSTYLES_LoadBitmap(PTHEME_CLASS tc, LPCWSTR lpFilename, BOOL *hasAlpha)
Definition: msstyles.c:896
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
#define TMT_IMAGEFILE
Definition: vssym32.h:305
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:26
BITMAP bmp
Definition: alphablend.c:62
LPCWSTR lpValue
Definition: uxthemep.h:41
#define TMT_FILENAME
Definition: vssym32.h:140
PTHEME_CLASS ValidateHandle(HTHEME hTheme)
Definition: system.c:717
HDC hdc
Definition: main.c:9
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
LPCWSTR szPath
Definition: env.c:35
Definition: bl.h:1331
#define min(a, b)
Definition: monoChain.cc:55
#define TMT_MINSIZE1
Definition: vssym32.h:317
LONG bottom
Definition: windef.h:294
#define TMT_MINDPI1
Definition: vssym32.h:291
static HBITMAP
Definition: button.c:44
#define TMT_IMAGESELECTTYPE
Definition: vssym32.h:365
DWORD dwValueLen
Definition: uxthemep.h:42
HRESULT WINAPI GetThemeInt(HTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal)
Definition: property.c:126
#define SUCCEEDED(hr)
Definition: intsafe.h:57

Referenced by UXTHEME_LoadImage().

Variable Documentation

◆ atDialogThemeEnabled

ATOM atDialogThemeEnabled

◆ EdgeColorMap

const { ... } EdgeColorMap[EDGE_NUMCOLORS]
Initial value:
= {
{-1, COLOR_WINDOW},
}
#define TMT_EDGEDKSHADOWCOLOR
Definition: vssym32.h:332
#define COLOR_WINDOWFRAME
Definition: winuser.h:909
#define COLOR_BTNHIGHLIGHT
Definition: winuser.h:925
#define COLOR_WINDOW
Definition: winuser.h:908
#define TMT_EDGELIGHTCOLOR
Definition: vssym32.h:329
#define TMT_EDGEFILLCOLOR
Definition: vssym32.h:333
#define TMT_EDGESHADOWCOLOR
Definition: vssym32.h:331
#define COLOR_BTNFACE
Definition: winuser.h:918
#define COLOR_3DLIGHT
Definition: winuser.h:930
#define COLOR_BTNSHADOW
Definition: winuser.h:920
#define COLOR_3DDKSHADOW
Definition: winuser.h:929
#define TMT_EDGEHIGHLIGHTCOLOR
Definition: vssym32.h:330

Referenced by get_edge_color().

◆ LTInnerNormal

const signed char LTInnerNormal[]
static
Initial value:
= {
-1, -1, -1, -1,
-1, -1, -1, -1
}

Definition at line 843 of file draw.c.

Referenced by draw_diag_edge(), and draw_rect_edge().

◆ LTInnerSoft

const signed char LTInnerSoft[]
static
Initial value:
= {
-1, -1, -1, -1,
-1, -1, -1, -1
}

Definition at line 871 of file draw.c.

Referenced by draw_diag_edge(), and draw_rect_edge().

◆ LTOuterNormal

const signed char LTOuterNormal[]
static
Initial value:

Definition at line 850 of file draw.c.

Referenced by draw_diag_edge(), and draw_rect_edge().

◆ LTOuterSoft

const signed char LTOuterSoft[]
static

◆ LTRBInnerFlat

const signed char LTRBInnerFlat[]
static
Initial value:

Definition at line 909 of file draw.c.

Referenced by draw_diag_edge(), and draw_rect_edge().

◆ LTRBInnerMono

const signed char LTRBInnerMono[]
static
Initial value:

Definition at line 895 of file draw.c.

Referenced by draw_diag_edge(), and draw_rect_edge().

◆ LTRBOuterFlat

◆ LTRBOuterMono

◆ RBInnerNormal

const signed char RBInnerNormal[]
static
Initial value:
= {
-1, -1, -1, -1,
-1, -1, -1, -1
}

Definition at line 857 of file draw.c.

Referenced by draw_diag_edge(), and draw_rect_edge().

◆ RBOuterNormal

const signed char RBOuterNormal[]
static

◆ sysColor

int sysColor

Definition at line 832 of file draw.c.

Referenced by get_edge_color().

◆ themeProp

int themeProp

Definition at line 831 of file draw.c.

Referenced by get_edge_color().