//--------------------------------------------------------------------------- // ImageFile.h - implements the drawing API for bgtype = ImageFile //--------------------------------------------------------------------------- #pragma once //--------------------------------------------------------------------------- #include "DrawBase.h" //--------------------------------------------------------------------------- #define MAX_IMAGEFILE_SIZES 5 //--------------------------------------------------------------------------- struct TMBITMAPHEADER; // forward //--------------------------------------------------------------------------- struct DIBINFO // used for all dibs in an CImageFile object { //---- the bits ---- int iDibOffset; // for DIB's in section HBITMAP hProcessBitmap; // for process-specific objects //---- size of a single, state image ---- int iSingleWidth; int iSingleHeight; //---- custom region data ---- int iRgnListOffset; //---- stretching/sizing ---- SIZINGTYPE eSizingType; BOOL fBorderOnly; //---- transparency ---- BOOL fTransparent; COLORREF crTransparent; //---- alpha ---- BOOL fAlphaChannel; int iAlphaThreshold; //---- usage info ---- int iMinDpi; SIZE szMinSize; }; //--------------------------------------------------------------------------- struct TRUESTRETCHINFO { BOOL fForceStretch; // forcing a TRUE SIZE image to be stretched BOOL fFullStretch; // stretch to fill entire dest RECT SIZE szDrawSize; // size to stretch image to }; //--------------------------------------------------------------------------- // Note: draw objects like CImageFile cannot have virtual methods // since they reside in the shared memory map file. //--------------------------------------------------------------------------- class CImageFile : public CDrawBase { public: //---- load-time methods ---- static BOOL KeyProperty(int iPropId); DIBINFO *EnumImageFiles(int iIndex); void DumpProperties(CSimpleFile *pFile, BYTE *pbThemeData, BOOL fFullInfo); BOOL HasRegionImageFile(DIBINFO *pdi, int *piMaxState); BOOL ImageUsesBrushes(DIBINFO *pdi, int *piBrushCount); void SetRgnListOffset(DIBINFO *pdi, int iOffset); HRESULT BuildRgnData(DIBINFO *pdi, CRenderObj *pRender, int iStateId, RGNDATA **ppRgnData, int *piDataLen); //---- draw-time methods ---- HRESULT DrawBackground(CRenderObj *pRender, HDC hdc, int iStateId, const RECT *pRect, OPTIONAL const DTBGOPTS *pOptions); BOOL IsBackgroundPartiallyTransparent(int iStateId); HRESULT HitTestBackground(CRenderObj *pRender, OPTIONAL HDC hdc, int iStateId, DWORD dwHTFlags, const RECT *pRect, HRGN hrgn, POINT ptTest, OUT WORD *pwHitCode); HRESULT GetBackgroundRegion(CRenderObj *pRender, OPTIONAL HDC hdc, int iStateId, const RECT *pRect, HRGN *pRegion); HRESULT GetBackgroundContentRect(CRenderObj *pRender, OPTIONAL HDC hdc, const RECT *pBoundingRect, RECT *pContentRect); HRESULT GetBackgroundExtent(CRenderObj *pRender, OPTIONAL HDC hdc, const RECT *pContentRect, RECT *pExtentRect); HRESULT GetPartSize(CRenderObj *pRender, HDC hdc, const RECT *prc, THEMESIZE eSize, SIZE *psz); HRESULT GetBitmap(CRenderObj *pRender, HDC hdc, const RECT *prc, HBITMAP *phBitmap); HRESULT ScaleMargins(IN OUT MARGINS *pMargins, HDC hdcOrig, CRenderObj *pRender, DIBINFO *pdi, const SIZE *pszDraw, OPTIONAL float *pfx=NULL, OPTIONAL float *pfy=NULL); DIBINFO *SelectCorrectImageFile(CRenderObj *pRender, HDC hdc, const RECT *prc, BOOL fForGlyph, OPTIONAL TRUESTRETCHINFO *ptsInfo=NULL); void GetDrawnImageSize(DIBINFO *pdi, const RECT *pRect, TRUESTRETCHINFO *ptsInfo, SIZE *pszDraw); //---- multi dibs must be placed just after object ---- inline DIBINFO *MultiDibPtr(int iIndex) { DIBINFO *pdi = NULL; if ((iIndex < 0) && (iIndex >= _iMultiImageCount)) { ASSERT(0 && L"illegal index for MultiDibPtr()"); } else { DIBINFO * pDibs = (DIBINFO *)(this+1); pdi = &pDibs[iIndex]; } return pdi; } protected: //---- call this via CMaxImageFile::PackProperties() ---- HRESULT PackProperties(CRenderObj *pRender, int iPartId, int iStateId); //---- helper methods ---- HRESULT DrawImageInfo(DIBINFO *pdi, CRenderObj *pRender, HDC hdc, int iStateId, const RECT *pRect, const DTBGOPTS *pOptions, TRUESTRETCHINFO *ptsInfo); HRESULT DrawBackgroundDS(DIBINFO *pdi, TMBITMAPHEADER *pThemeBitmapHeader, BOOL fStock, CRenderObj *pRender, HDC hdc, int iStateId, const RECT *pRect, BOOL fForceStretch, MARGINS *pmarDest, float xMarginFactor, float yMarginFactor, OPTIONAL const DTBGOPTS *pOptions); HRESULT SetImageInfo(DIBINFO *pdi, CRenderObj *pRender, int iPartId, int iStateId); HRESULT GetScaledContentMargins(CRenderObj *pRender, OPTIONAL HDC hdc, OPTIONAL const RECT *prcDest, MARGINS *pMargins); void GetOffsets(int iStateId, DIBINFO *pdi, int *piXOffset, int *piYOffset); HRESULT DrawFontGlyph(CRenderObj *pRender, HDC hdc, RECT *prc, OPTIONAL const DTBGOPTS *pOptions); public: //---- primary image ---- DIBINFO _ImageInfo; //---- multiple DPI scaling images ---- int _iMultiImageCount; // number of DIBINFO's that immediately follow object IMAGESELECTTYPE _eImageSelectType; //---- properties common to all DIBINFO's in this object ---- int _iImageCount; IMAGELAYOUT _eImageLayout; //---- mirroring ---- BOOL _fMirrorImage; //---- TrueSize images ---- TRUESIZESCALINGTYPE _eTrueSizeScalingType; HALIGN _eHAlign; VALIGN _eVAlign; BOOL _fBgFill; COLORREF _crFill; int _iTrueSizeStretchMark; // percent at which we stretch a truesize image BOOL _fUniformSizing; // both width & height must grow together BOOL _fIntegralSizing; // for TRUESIZE sizing and for Border sizing //---- margins ---- MARGINS _SizingMargins; MARGINS _ContentMargins; BOOL _fSourceGrow; BOOL _fSourceShrink; SIZE _szNormalSize; //---- glyph ---- BOOL _fGlyphOnly; GLYPHTYPE _eGlyphType; //---- font-based glyph ---- COLORREF _crGlyphTextColor; LOGFONT _lfGlyphFont; int _iGlyphIndex; //---- image-based glyph ---- DIBINFO _GlyphInfo; //---- id ---- int _iSourcePartId; int _iSourceStateId; //---- multiple DIBINFO's may follow at end ---- }; //--------------------------------------------------------------------------- class CMaxImageFile : public CImageFile { public: HRESULT PackMaxProperties(CRenderObj *pRender, int iPartId, int iStateId, OUT int *piMultiDibCount); DIBINFO MultiDibs[MAX_IMAGEFILE_SIZES]; // actual number of multi dibs varies with each obj }; //---------------------------------------------------------------------------