163 lines
5 KiB
C++
163 lines
5 KiB
C++
/*
|
|
* NineGrid bitmap rendering (ported from UxTheme)
|
|
*/
|
|
|
|
#ifndef DUI_UTIL_NINEGRID_H_INCLUDED
|
|
#define DUI_UTIL_NINEGRID_H_INCLUDED
|
|
|
|
#pragma once
|
|
|
|
namespace DirectUI
|
|
{
|
|
|
|
//---------------------------------------------------------------------------
|
|
//#include "uxtheme.h" // need MARGINS struct from here
|
|
typedef struct _MARGINS
|
|
{
|
|
int cxLeftWidth; // width of left border that retains its size
|
|
int cxRightWidth; // width of right border that retains its size
|
|
int cyTopHeight; // height of top border that retains its size
|
|
int cyBottomHeight; // height of bottom border that retains its size
|
|
} MARGINS, *PMARGINS;
|
|
|
|
//#include "tmschema.h" // need SIZINGTYPE, VALIGN, HALIGN enums from here
|
|
enum SIZINGTYPE
|
|
{
|
|
ST_TRUESIZE,
|
|
ST_STRETCH,
|
|
ST_TILE,
|
|
|
|
ST_TILEHORZ,
|
|
ST_TILEVERT,
|
|
ST_TILECENTER
|
|
};
|
|
|
|
enum HALIGN
|
|
{
|
|
HA_LEFT,
|
|
HA_CENTER,
|
|
HA_RIGHT
|
|
};
|
|
|
|
enum VALIGN
|
|
{
|
|
VA_TOP,
|
|
VA_CENTER,
|
|
VA_BOTTOM
|
|
};
|
|
|
|
//---------------------------------------------------------------------------
|
|
#ifndef HEIGHT
|
|
#define HEIGHT(rc) ((rc).bottom - (rc).top)
|
|
#endif
|
|
//---------------------------------------------------------------------------
|
|
#ifndef WIDTH
|
|
#define WIDTH(rc) ((rc).right - (rc).left)
|
|
#endif
|
|
//---------------------------------------------------------------------------
|
|
enum MBSIZING
|
|
{
|
|
MB_COPY,
|
|
MB_STRETCH,
|
|
MB_TILE
|
|
};
|
|
//------------------------------------------------------------------------------------
|
|
struct BRUSHBUFF
|
|
{
|
|
int iBuffLen;
|
|
BYTE *pBuff;
|
|
};
|
|
//---------------------------------------------------------------------------
|
|
struct MBINFO
|
|
{
|
|
DWORD dwSize; // size of this struct (versioning support)
|
|
|
|
HDC hdcDest;
|
|
HDC hdcSrc;
|
|
RECT rcClip; // don't draw outside this rect
|
|
HBITMAP hBitmap;
|
|
|
|
//---- for quick tiling ----
|
|
BRUSHBUFF *pBrushBuff;
|
|
|
|
//---- options ----
|
|
DWORD dwOptions; // subset DrawNineGrid() option flags
|
|
|
|
POINT ptTileOrigin; // for MBO_TILEORIGIN
|
|
|
|
BITMAPINFOHEADER *pbmHdr; // for MBO_DIRECTBITS
|
|
BYTE *pBits; // for MBO_DIRECTBITS
|
|
|
|
COLORREF crTransparent; // for MBO_TRANSPARENT
|
|
_BLENDFUNCTION AlphaBlendInfo; // for MBO_ALPHABLEND
|
|
|
|
HBRUSH *pCachedBrushes; // for DNG_CACHEBRUSHES
|
|
int iCacheIndex; // which brush to use
|
|
};
|
|
//---------------------------------------------------------------------------
|
|
//---- DrawNineGrid() "dwOptions" bits ----
|
|
|
|
//---- shared with MultiBlt() ----
|
|
#define DNG_ALPHABLEND (1 << 0) // use AlphaBlendInfo
|
|
#define DNG_TRANSPARENT (1 << 1) // transparancy defined by crTransparent
|
|
#define DNG_TILEORIGIN (1 << 2) // use ptTileOrigin
|
|
#define DNG_DIRECTBITS (1 << 3) // use pbmHdr & pBits
|
|
#define DNG_CACHEBRUSHES (1 << 4) // use/set pCachedBrushes
|
|
#define DNG_MANUALTILING (1 << 5) // loop thru BitBlt's
|
|
#define DNG_DIRECTBRUSH (1 << 6) // create brushes from temp. extracted DIB's
|
|
#define DNG_FLIPGRIDS (1 << 7) // all grid images should be flipped
|
|
|
|
//---- used only by DrawNineGrid() ----
|
|
#define DNG_OMITBORDER (1 << 16) // don't draw border
|
|
#define DNG_OMITCONTENT (1 << 17) // don't draw middle
|
|
#define DNG_SOLIDBORDER (1 << 18) // sample borders and draw as solid colors
|
|
#define DNG_SOLIDCONTENT (1 << 19) // sample content as draw as solid color
|
|
#define DNG_BGFILL (1 << 20) // use crFill for ST_TRUESIZE
|
|
//------------------------------------------------------------------------------------
|
|
struct NGINFO
|
|
{
|
|
DWORD dwSize; // size of this struct (versioning support)
|
|
|
|
HDC hdcDest;
|
|
RECT rcClip; // don't draw outside this rect
|
|
SIZINGTYPE eImageSizing;
|
|
HBITMAP hBitmap;
|
|
RECT rcSrc; // where to get bits from
|
|
RECT rcDest; // where to draw bits to
|
|
int iDestMargins[4];
|
|
int iSrcMargins[4];
|
|
|
|
//---- for quick tiling ----
|
|
BRUSHBUFF *pBrushBuff;
|
|
|
|
//---- options ----
|
|
DWORD dwOptions;
|
|
|
|
POINT ptTileOrigin; // for DNG_TILEORIGIN
|
|
|
|
BITMAPINFOHEADER *pbmHdr; // for DNG_DIRECTBITS
|
|
BYTE *pBits; // for DNG_DIRECTBITS
|
|
|
|
COLORREF crTransparent; // for DNG_TRANSPARENT
|
|
_BLENDFUNCTION AlphaBlendInfo; // for DNG_ALPHABLEND
|
|
|
|
HBRUSH *pCachedBrushes; // for DNG_CACHEBRUSHES
|
|
|
|
COLORREF *pcrBorders; // for DNG_SOLIDBORDERS, DNG_SOLIDCONTENT
|
|
|
|
//---- for ST_TRUESIZE images smaller than rcDest ----
|
|
COLORREF crFill;
|
|
VALIGN eVAlign;
|
|
HALIGN eHAlign;
|
|
};
|
|
//---------------------------------------------------------------------------
|
|
HRESULT MultiBlt(MBINFO *pmb, MBSIZING eSizing, int iDestX, int iDestY, int iDestW, int iDestH,
|
|
int iSrcX, int iSrcY, int iSrcW, int iSrcH);
|
|
|
|
HRESULT DrawNineGrid(NGINFO *png);
|
|
//---------------------------------------------------------------------------
|
|
|
|
} // namespace DirectUI
|
|
|
|
#endif // DUI_UTIL_NINEGRID_H_INCLUDED
|