240 lines
10 KiB
C
240 lines
10 KiB
C
|
//---------------------------------------------------------------------------
|
||
|
// Parser.h - parses a "themes.ini" file and builds the ThemeInfo entries
|
||
|
//---------------------------------------------------------------------------
|
||
|
#pragma once
|
||
|
//---------------------------------------------------------------------------
|
||
|
#include "Scanner.h"
|
||
|
#include "Utils.h"
|
||
|
#include "CFile.h"
|
||
|
#include "SimpStr.h"
|
||
|
//#include "NtlParse.h"
|
||
|
//---------------------------------------------------------------------------
|
||
|
// TMT_XXX ranges:
|
||
|
// 1 - 49 SpecialPropVals (see below)
|
||
|
// 50 - 60 Primitive Properties
|
||
|
// 61 - xx enum definitions & regular Properties
|
||
|
//---------------------------------------------------------------------------
|
||
|
enum SpecialPropVals // strings not needed for these
|
||
|
{
|
||
|
TMT_THEMEMETRICS = 1, // THEMEMETRICS struct in shared data
|
||
|
TMT_DIBDATA, // bitmap file converted to DIB data
|
||
|
TMT_DIBDATA1, // bitmap file converted to DIB data
|
||
|
TMT_DIBDATA2, // bitmap file converted to DIB data
|
||
|
TMT_DIBDATA3, // bitmap file converted to DIB data
|
||
|
TMT_DIBDATA4, // bitmap file converted to DIB data
|
||
|
TMT_DIBDATA5, // bitmap file converted to DIB data
|
||
|
TMT_GLYPHDIBDATA, // NTL pcode generated from NTL source file
|
||
|
TMT_NTLDATA, // NTL pcode generated from NTL source file
|
||
|
TMT_PARTJUMPTABLE, // seen if more than 1 part defined for class
|
||
|
TMT_STATEJUMPTABLE, // seen if more than 1 state defined for part
|
||
|
TMT_JUMPTOPARENT, // seen at end of every section (index=-1 means stop)
|
||
|
TMT_ENUMDEF, // enum definition (not yet a property)
|
||
|
TMT_ENUMVAL, // enum value definition
|
||
|
TMT_ENUM, // enum property
|
||
|
TMT_DRAWOBJ, // packed struct (CBorderFill and CImageFile objs)
|
||
|
TMT_TEXTOBJ, // packed struct (CTextObj)
|
||
|
TMT_RGNLIST, // state jump table to access custom region data entries
|
||
|
TMT_RGNDATA, // custom region data for an imagefile/state
|
||
|
TMT_STOCKBRUSHES, // stock brush values for bitmap(s)
|
||
|
TMT_ENDOFCLASS, // end of data for a class section
|
||
|
TMT_STOCKDIBDATA,
|
||
|
TMT_UNKNOWN,
|
||
|
};
|
||
|
//---------------------------------------------------------------------------
|
||
|
#define HUE_SUBCNT 5
|
||
|
#define COLOR_SUBCNT 5
|
||
|
//---------------------------------------------------------------------------
|
||
|
#define MAX_PROPERTY_VALUE 1024
|
||
|
//---------------------------------------------------------------------------
|
||
|
#define ENUM_SECTION_NAME L"enums"
|
||
|
#define TYPE_SECTION_NAME L"types"
|
||
|
|
||
|
#define INI_MACRO_SYMBOL L'#'
|
||
|
#define SUBST_TABLE_INCLUDE L"Include"
|
||
|
|
||
|
#define GLOBALS_SECTION_NAME L"globals"
|
||
|
#define SYSMETRICS_SECTION_NAME L"SysMetrics"
|
||
|
|
||
|
#define MYAPP_NAME L"ThemeSel"
|
||
|
#define OUTFILE_NAME L"tmdefs.h"
|
||
|
#define PREDEFINES_NAME L"themes.inc"
|
||
|
//---------------------------------------------------------------------------
|
||
|
typedef BYTE PRIMVAL; // first 10 TMT_XXX defines
|
||
|
//---------------------------------------------------------------------------
|
||
|
class IParserCallBack // Parser Caller must implement
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT AddIndex(LPCWSTR pszAppName, LPCWSTR pszClassName,
|
||
|
int iPartNum, int iStateNum, int iIndex, int iLen) = 0;
|
||
|
virtual HRESULT AddData(SHORT sTypeNum, PRIMVAL ePrimVal, const void *pData,
|
||
|
DWORD dwLen) = 0;
|
||
|
virtual int GetNextDataIndex() = 0;
|
||
|
};
|
||
|
//---------------------------------------------------------------------------
|
||
|
struct ENUMVAL
|
||
|
{
|
||
|
CWideString csName;
|
||
|
int iValue;
|
||
|
int iSymbolIndex;
|
||
|
};
|
||
|
//---------------------------------------------------------------------------
|
||
|
struct SYMBOL
|
||
|
{
|
||
|
CWideString csName;
|
||
|
SHORT sTypeNum; // the property number of this property
|
||
|
PRIMVAL ePrimVal; // all enums = ENUM_PRIMNUM
|
||
|
};
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Stock objects data
|
||
|
//---------------------------------------------------------------------------
|
||
|
struct TMBITMAPHEADER // Stock bitmap info, can be followed with a BITMAPINFOHEADER struct
|
||
|
{
|
||
|
DWORD dwSize; // Size of the structure
|
||
|
BOOL fFlipped; // TRUE if the bitmap is flipped (stock or not)
|
||
|
HBITMAP hBitmap; // Stock bitmap handle, if NULL then a BITMAPINFOHEADER follows
|
||
|
DWORD dwColorDepth; // Bitmap color depth
|
||
|
BOOL fTrueAlpha; // TRUE if the bitmap has a non-empty alpha chanel
|
||
|
DWORD iBrushesOffset; // Offset to the stock brushes array for this bitmap
|
||
|
UINT nBrushes; // Number of brushes in the array
|
||
|
};
|
||
|
// Pointer to the BITMAPINFOHEADER following the structure
|
||
|
#define BITMAPDATA(p) (reinterpret_cast<BITMAPINFOHEADER*>((BYTE*) p + p->dwSize))
|
||
|
// Size in bytes preceding the BITMAPINFOHEADER data
|
||
|
#define TMBITMAPSIZE (sizeof(TMBITMAPHEADER))
|
||
|
//---------------------------------------------------------------------------
|
||
|
class INtlParserCallBack // Parser Caller must implement
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT GetStateNum(LPCWSTR pszStateName, BYTE *piNum) = 0;
|
||
|
};
|
||
|
//---------------------------------------------------------------------------
|
||
|
class CThemeParser : public INtlParserCallBack
|
||
|
{
|
||
|
public:
|
||
|
CThemeParser(BOOL fGlobalTheme = FALSE);
|
||
|
|
||
|
HRESULT ParseThemeFile(LPCWSTR pszFileName, LPCWSTR pszColorParam,
|
||
|
IParserCallBack *pCallBack, THEMEENUMPROC pNameCallBack=NULL,
|
||
|
LPARAM lFnParam=NULL, DWORD dwParseFlags=0);
|
||
|
|
||
|
HRESULT ParseThemeBuffer(LPCWSTR pszBuffer, LPCWSTR pszFileName,
|
||
|
LPCWSTR pszColorParam, HINSTANCE hInstThemeDll, IParserCallBack *pCallBack,
|
||
|
THEMEENUMPROC pNameCallBack=NULL, LPARAM lFnParam=NULL,
|
||
|
DWORD dwParseFlags=0, LPCWSTR pszDocProperty=NULL, OUT LPWSTR pszResult=NULL,
|
||
|
DWORD dwMaxResultChars=0);
|
||
|
|
||
|
HRESULT GetEnumValue(LPCWSTR pszEnumName, LPCWSTR pszEnumValName,
|
||
|
int *piValue);
|
||
|
|
||
|
HRESULT GetPropertyNum(LPCWSTR pszName, int *piPropNum);
|
||
|
|
||
|
HRESULT GetStateNum(LPCWSTR pszStateName, BYTE *piNum);
|
||
|
|
||
|
void CleanupStockBitmaps();
|
||
|
|
||
|
protected:
|
||
|
//---- helpers ----
|
||
|
HRESULT SourceError(int iMsgResId, LPCWSTR pszParam1=NULL, LPCWSTR pszParam2=NULL);
|
||
|
HRESULT ParseDocSection();
|
||
|
HRESULT ParseClassSection(LPCWSTR pszFirstName);
|
||
|
HRESULT InitializeSymbols();
|
||
|
PRIMVAL GetPrimVal(LPCWSTR pszName);
|
||
|
HRESULT AddSymbol(LPCWSTR pszName, SHORT sTypeNum, PRIMVAL ePrimVal);
|
||
|
HRESULT ParseClassSectionName(LPCWSTR pszFirstName, LPWSTR appsym);
|
||
|
HRESULT ValidateEnumSymbol(LPCWSTR pszName, int iSymType, int *pIndex=NULL);
|
||
|
HRESULT ParseClassLine(int *piSymType=NULL, int *piValue=NULL, LPWSTR pszBuff=NULL, DWORD dwMaxBuffChars=0);
|
||
|
int GetSymbolIndex(LPCWSTR pszName);
|
||
|
HRESULT ParseThemeScanner(IParserCallBack *pCallBack, THEMEENUMPROC pNameCallBack,
|
||
|
LPARAM lFnParam, DWORD dwParseFlags);
|
||
|
HRESULT ParseColorSchemeSection();
|
||
|
COLORREF ApplyColorSubstitution(COLORREF crOld);
|
||
|
HRESULT ParseSizeSection();
|
||
|
HRESULT ParseFileSection();
|
||
|
HRESULT ParseSubstSection();
|
||
|
HRESULT BitmapColorReplacement(DWORD *pPixelBuff, UINT iWidth, UINT iHeight);
|
||
|
HRESULT PackageImageData(LPCWSTR szFileNameR, LPCWSTR szFileNameG, LPCWSTR szFileNameB, int iDibPropNum);
|
||
|
HRESULT PackageNtlCode(LPCWSTR szFileName);
|
||
|
HRESULT LoadResourceProperties();
|
||
|
void EmptyResourceProperties();
|
||
|
HRESULT GetResourceProperty(LPCWSTR pszPropName, LPWSTR pszValueBuff,
|
||
|
int cchMaxValueChars);
|
||
|
|
||
|
//---- primitive value parsers ----
|
||
|
HRESULT ParseEnumValue(int iSymType);
|
||
|
HRESULT ParseStringValue(int iSymType, LPWSTR pszBuff=NULL, DWORD dwMaxBuffChars=0);
|
||
|
HRESULT ParseIntValue(int iSymType, int *piValue=NULL);
|
||
|
HRESULT ParseBoolValue(int iSymType, LPCWSTR pszPropertyName);
|
||
|
HRESULT ParseColorValue(int iSymType, COLORREF *pcrValue=NULL, COLORREF *pcrValue2=NULL);
|
||
|
HRESULT ParseMarginsValue(int iSymType);
|
||
|
HRESULT ParseIntListValue(int iSymType);
|
||
|
HRESULT ParseFileNameValue(int iSymType, LPWSTR pszBuff=NULL, DWORD dwMaxBuffChars=0);
|
||
|
HRESULT ParseSizeValue(int iSymType);
|
||
|
HRESULT ParsePositionValue(int iSymType);
|
||
|
HRESULT ParseRectValue(int iSymType, LPCWSTR pszPropertyName);
|
||
|
HRESULT ParseFontValue(int iSymType, LPCWSTR pszPropertyName);
|
||
|
HRESULT AddThemeData(int iTypeNum, PRIMVAL ePrimVal, const void *pData, DWORD dwLen);
|
||
|
HRESULT ParseSizeInfoUnits(int iVal, LPCWSTR pszDefaultUnits, int *piPixels);
|
||
|
HRESULT GetIntList(int *pInts, LPCWSTR *pParts, int iCount,
|
||
|
int iMin, int iMax);
|
||
|
HRESULT ParseSysFont(LOGFONT *pFont);
|
||
|
HRESULT ParseSysColor(LPCWSTR szId, COLORREF *pcrValue);
|
||
|
HRESULT GenerateEmptySection(LPCWSTR pszSectionName, int iPartId, int iStateId);
|
||
|
|
||
|
//---- private data ----
|
||
|
CScanner _scan;
|
||
|
CSimpleFile _outfile;
|
||
|
int _iEnumCount;
|
||
|
int _iTypeCount;
|
||
|
int _iFontNumber; // for using resource-based strings as font values
|
||
|
BOOL _fGlobalTheme;
|
||
|
BOOL _fGlobalsDefined;
|
||
|
BOOL _fClassSectionDefined;
|
||
|
BOOL _fDefiningColorScheme;
|
||
|
BOOL _fUsingResourceProperties;
|
||
|
UCHAR _uCharSet;
|
||
|
|
||
|
//---- current section info ----
|
||
|
int _iPartId;
|
||
|
int _iStateId;
|
||
|
WCHAR _szClassName[MAX_PATH];
|
||
|
WCHAR _szBaseSectionName[MAX_PATH]; // of current section
|
||
|
WCHAR _szFullSectionName[MAX_PATH]; // of current section
|
||
|
|
||
|
CSimpleArray<ENUMVAL> _EnumVals;
|
||
|
CSimpleArray<SYMBOL> _Symbols;
|
||
|
CSimpleArray<HBITMAP> _StockBitmapCleanupList;
|
||
|
IParserCallBack *_pCallBackObj;
|
||
|
THEMEENUMPROC _pNameCallBack;
|
||
|
LPARAM _lNameParam;
|
||
|
DWORD _dwParseFlags;
|
||
|
WCHAR _ColorParam[MAX_PATH+1];
|
||
|
HINSTANCE _hinstThemeDll;
|
||
|
LPCWSTR _pszDocProperty;
|
||
|
LPWSTR _pszResult; // for querying doc property
|
||
|
DWORD _dwMaxResultChars;
|
||
|
|
||
|
//---- color substitution table ----
|
||
|
int _iColorCount;
|
||
|
COLORREF _crFromColors[5];
|
||
|
COLORREF _crToColors[5];
|
||
|
COLORREF _crBlend;
|
||
|
|
||
|
//---- hue substitution table ----
|
||
|
int _iHueCount;
|
||
|
BYTE _bFromHues[5];
|
||
|
BYTE _bToHues[5];
|
||
|
|
||
|
//---- theme metrics table ----
|
||
|
BOOL _fDefiningMetrics;
|
||
|
BOOL _fMetricsDefined;
|
||
|
|
||
|
//---- resource properties ----
|
||
|
CSimpleArray<CWideString> _PropertyNames;
|
||
|
CSimpleArray<CWideString> _PropertyValues;
|
||
|
CSimpleArray<int> _iPropertyIds;
|
||
|
|
||
|
WCHAR _szResPropValue[2*MAX_PATH];
|
||
|
int _iResPropId;
|
||
|
};
|
||
|
//---------------------------------------------------------------------------
|