// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef _FDE_CSS
#define _FDE_CSS
class IFDE_HTMNotify;
class IFDE_CSSValue;
class IFDE_CSSPrimitiveValue;
class IFDE_CSSValueList;
class IFDE_CSSDeclaration;
class IFDE_CSSSelector;
class IFDE_CSSRule;
class IFDE_CSSStyleRule;
class IFDE_CSSMediaRule;
class IFDE_CSSFontFaceRule;
class IFDE_CSSStyleSheet;
class IFDE_CSSStyleSheetCache;
class IFDE_CSSSyntaxParser;
class IFDE_CSSRubyStyle;
class IFDE_CSSMultiColumnStyle;
class IFDE_CSSGeneratedContentStyle;
class IFDE_CSSFontStyle;
class IFDE_CSSBoundaryStyle;
class IFDE_CSSPositionStyle;
class IFDE_CSSParagraphStyle;
class IFDE_CSSBackgroundStyle;
class IFDE_CSSListStyle;
class IFDE_CSSTableStyle;
class IFDE_CSSVisualStyle;
class IFDE_CSSComputedStyle;
class IFDE_CSSTagProvider;
class IFDE_CSSAccelerator;
class IFDE_CSSStyleSelector;
class IFDE_CSSCounterContext;
class IFDE_CSSCounterManager;
class IFDE_CSSQuoteContext;
class IFDE_CSSContentContext;
class IFDE_CSSMultiColumnContext;
class IFDE_CSSFloatContext;
enum FDE_CSSVALUETYPE {
    FDE_CSSVALUETYPE_Primitive		= 1,
    FDE_CSSVALUETYPE_List			= 2,
    FDE_CSSVALUETYPE_Shorthand,
};
enum FDE_CSSPRIMITIVETYPE {
    FDE_CSSPRIMITIVETYPE_Unknown	= 0,
    FDE_CSSPRIMITIVETYPE_Number		= 1,
    FDE_CSSPRIMITIVETYPE_Percent	= 2,
    FDE_CSSPRIMITIVETYPE_EMS		= 3,
    FDE_CSSPRIMITIVETYPE_EXS		= 4,
    FDE_CSSPRIMITIVETYPE_PX			= 5,
    FDE_CSSPRIMITIVETYPE_CM			= 6,
    FDE_CSSPRIMITIVETYPE_MM			= 7,
    FDE_CSSPRIMITIVETYPE_IN			= 8,
    FDE_CSSPRIMITIVETYPE_PT			= 9,
    FDE_CSSPRIMITIVETYPE_PC			= 10,
    FDE_CSSPRIMITIVETYPE_String		= 19,
    FDE_CSSPRIMITIVETYPE_URI		= 20,
    FDE_CSSPRIMITIVETYPE_RGB		= 25,
    FDE_CSSPRIMITIVETYPE_Enum,
    FDE_CSSPRIMITIVETYPE_Function,
};
enum FDE_CSSPROPERTYVALUE {
    FDE_CSSPROPERTYVALUE_Bolder,
    FDE_CSSPROPERTYVALUE_LowerLatin,
    FDE_CSSPROPERTYVALUE_Lowercase,
    FDE_CSSPROPERTYVALUE_LowerGreek,
    FDE_CSSPROPERTYVALUE_Sesame,
    FDE_CSSPROPERTYVALUE_None,
    FDE_CSSPROPERTYVALUE_NwResize,
    FDE_CSSPROPERTYVALUE_WResize,
    FDE_CSSPROPERTYVALUE_Dot,
    FDE_CSSPROPERTYVALUE_End,
    FDE_CSSPROPERTYVALUE_Ltr,
    FDE_CSSPROPERTYVALUE_Pre,
    FDE_CSSPROPERTYVALUE_Rtl,
    FDE_CSSPROPERTYVALUE_Sub,
    FDE_CSSPROPERTYVALUE_Top,
    FDE_CSSPROPERTYVALUE_Visible,
    FDE_CSSPROPERTYVALUE_Filled,
    FDE_CSSPROPERTYVALUE_SwResize,
    FDE_CSSPROPERTYVALUE_NoRepeat,
    FDE_CSSPROPERTYVALUE_Default,
    FDE_CSSPROPERTYVALUE_Transparent,
    FDE_CSSPROPERTYVALUE_Ridge,
    FDE_CSSPROPERTYVALUE_Right,
    FDE_CSSPROPERTYVALUE_HorizontalTb,
    FDE_CSSPROPERTYVALUE_DistributeLetter,
    FDE_CSSPROPERTYVALUE_DoubleCircle,
    FDE_CSSPROPERTYVALUE_Ruby,
    FDE_CSSPROPERTYVALUE_Collapse,
    FDE_CSSPROPERTYVALUE_Normal,
    FDE_CSSPROPERTYVALUE_Avoid,
    FDE_CSSPROPERTYVALUE_UpperRoman,
    FDE_CSSPROPERTYVALUE_Auto,
    FDE_CSSPROPERTYVALUE_Text,
    FDE_CSSPROPERTYVALUE_XSmall,
    FDE_CSSPROPERTYVALUE_Thin,
    FDE_CSSPROPERTYVALUE_Repeat,
    FDE_CSSPROPERTYVALUE_Small,
    FDE_CSSPROPERTYVALUE_NeResize,
    FDE_CSSPROPERTYVALUE_NoContent,
    FDE_CSSPROPERTYVALUE_Outside,
    FDE_CSSPROPERTYVALUE_EResize,
    FDE_CSSPROPERTYVALUE_TableRow,
    FDE_CSSPROPERTYVALUE_Bottom,
    FDE_CSSPROPERTYVALUE_Underline,
    FDE_CSSPROPERTYVALUE_CjkIdeographic,
    FDE_CSSPROPERTYVALUE_SeResize,
    FDE_CSSPROPERTYVALUE_Fixed,
    FDE_CSSPROPERTYVALUE_Double,
    FDE_CSSPROPERTYVALUE_Solid,
    FDE_CSSPROPERTYVALUE_RubyBaseGroup,
    FDE_CSSPROPERTYVALUE_OpenQuote,
    FDE_CSSPROPERTYVALUE_Lighter,
    FDE_CSSPROPERTYVALUE_LowerRoman,
    FDE_CSSPROPERTYVALUE_Strict,
    FDE_CSSPROPERTYVALUE_TableCaption,
    FDE_CSSPROPERTYVALUE_Oblique,
    FDE_CSSPROPERTYVALUE_Decimal,
    FDE_CSSPROPERTYVALUE_Loose,
    FDE_CSSPROPERTYVALUE_Hebrew,
    FDE_CSSPROPERTYVALUE_Hidden,
    FDE_CSSPROPERTYVALUE_Dashed,
    FDE_CSSPROPERTYVALUE_Embed,
    FDE_CSSPROPERTYVALUE_TableRowGroup,
    FDE_CSSPROPERTYVALUE_TableColumn,
    FDE_CSSPROPERTYVALUE_Static,
    FDE_CSSPROPERTYVALUE_Outset,
    FDE_CSSPROPERTYVALUE_DecimalLeadingZero,
    FDE_CSSPROPERTYVALUE_KeepWords,
    FDE_CSSPROPERTYVALUE_KatakanaIroha,
    FDE_CSSPROPERTYVALUE_Super,
    FDE_CSSPROPERTYVALUE_Center,
    FDE_CSSPROPERTYVALUE_TableHeaderGroup,
    FDE_CSSPROPERTYVALUE_Inside,
    FDE_CSSPROPERTYVALUE_XxLarge,
    FDE_CSSPROPERTYVALUE_Triangle,
    FDE_CSSPROPERTYVALUE_RubyTextGroup,
    FDE_CSSPROPERTYVALUE_Circle,
    FDE_CSSPROPERTYVALUE_Hiragana,
    FDE_CSSPROPERTYVALUE_RepeatX,
    FDE_CSSPROPERTYVALUE_RepeatY,
    FDE_CSSPROPERTYVALUE_Move,
    FDE_CSSPROPERTYVALUE_HiraganaIroha,
    FDE_CSSPROPERTYVALUE_RubyBase,
    FDE_CSSPROPERTYVALUE_Scroll,
    FDE_CSSPROPERTYVALUE_Smaller,
    FDE_CSSPROPERTYVALUE_TableFooterGroup,
    FDE_CSSPROPERTYVALUE_Baseline,
    FDE_CSSPROPERTYVALUE_Separate,
    FDE_CSSPROPERTYVALUE_Armenian,
    FDE_CSSPROPERTYVALUE_Open,
    FDE_CSSPROPERTYVALUE_Relative,
    FDE_CSSPROPERTYVALUE_Thick,
    FDE_CSSPROPERTYVALUE_Justify,
    FDE_CSSPROPERTYVALUE_Middle,
    FDE_CSSPROPERTYVALUE_Always,
    FDE_CSSPROPERTYVALUE_DistributeSpace,
    FDE_CSSPROPERTYVALUE_LineEdge,
    FDE_CSSPROPERTYVALUE_PreWrap,
    FDE_CSSPROPERTYVALUE_Medium,
    FDE_CSSPROPERTYVALUE_NResize,
    FDE_CSSPROPERTYVALUE_ListItem,
    FDE_CSSPROPERTYVALUE_Show,
    FDE_CSSPROPERTYVALUE_Currentcolor,
    FDE_CSSPROPERTYVALUE_NoCloseQuote,
    FDE_CSSPROPERTYVALUE_VerticalLr,
    FDE_CSSPROPERTYVALUE_VerticalRl,
    FDE_CSSPROPERTYVALUE_Pointer,
    FDE_CSSPROPERTYVALUE_XxSmall,
    FDE_CSSPROPERTYVALUE_Bold,
    FDE_CSSPROPERTYVALUE_Both,
    FDE_CSSPROPERTYVALUE_SmallCaps,
    FDE_CSSPROPERTYVALUE_Katakana,
    FDE_CSSPROPERTYVALUE_After,
    FDE_CSSPROPERTYVALUE_Horizontal,
    FDE_CSSPROPERTYVALUE_Dotted,
    FDE_CSSPROPERTYVALUE_Disc,
    FDE_CSSPROPERTYVALUE_Georgian,
    FDE_CSSPROPERTYVALUE_Inline,
    FDE_CSSPROPERTYVALUE_Overline,
    FDE_CSSPROPERTYVALUE_Wait,
    FDE_CSSPROPERTYVALUE_BreakAll,
    FDE_CSSPROPERTYVALUE_UpperAlpha,
    FDE_CSSPROPERTYVALUE_Capitalize,
    FDE_CSSPROPERTYVALUE_Nowrap,
    FDE_CSSPROPERTYVALUE_TextBottom,
    FDE_CSSPROPERTYVALUE_NoOpenQuote,
    FDE_CSSPROPERTYVALUE_Groove,
    FDE_CSSPROPERTYVALUE_Progress,
    FDE_CSSPROPERTYVALUE_Larger,
    FDE_CSSPROPERTYVALUE_CloseQuote,
    FDE_CSSPROPERTYVALUE_TableCell,
    FDE_CSSPROPERTYVALUE_PreLine,
    FDE_CSSPROPERTYVALUE_Absolute,
    FDE_CSSPROPERTYVALUE_InlineTable,
    FDE_CSSPROPERTYVALUE_BidiOverride,
    FDE_CSSPROPERTYVALUE_InlineBlock,
    FDE_CSSPROPERTYVALUE_Inset,
    FDE_CSSPROPERTYVALUE_Crosshair,
    FDE_CSSPROPERTYVALUE_UpperLatin,
    FDE_CSSPROPERTYVALUE_Help,
    FDE_CSSPROPERTYVALUE_Hide,
    FDE_CSSPROPERTYVALUE_Uppercase,
    FDE_CSSPROPERTYVALUE_SResize,
    FDE_CSSPROPERTYVALUE_Table,
    FDE_CSSPROPERTYVALUE_Blink,
    FDE_CSSPROPERTYVALUE_Block,
    FDE_CSSPROPERTYVALUE_Start,
    FDE_CSSPROPERTYVALUE_TableColumnGroup,
    FDE_CSSPROPERTYVALUE_Italic,
    FDE_CSSPROPERTYVALUE_LineThrough,
    FDE_CSSPROPERTYVALUE_KeepAll,
    FDE_CSSPROPERTYVALUE_LowerAlpha,
    FDE_CSSPROPERTYVALUE_RunIn,
    FDE_CSSPROPERTYVALUE_Square,
    FDE_CSSPROPERTYVALUE_XLarge,
    FDE_CSSPROPERTYVALUE_Large,
    FDE_CSSPROPERTYVALUE_Before,
    FDE_CSSPROPERTYVALUE_Left,
    FDE_CSSPROPERTYVALUE_TextTop,
    FDE_CSSPROPERTYVALUE_RubyText,
    FDE_CSSPROPERTYVALUE_NoDisplay,
    FDE_CSSPROPERTYVALUE_MAX
};
class IFDE_CSSValue
{
public:
    virtual ~IFDE_CSSValue() {}
    virtual FDE_CSSVALUETYPE		GetType() const = 0;
};
class IFDE_CSSPrimitiveValue : public IFDE_CSSValue
{
public:
    virtual FDE_CSSVALUETYPE		GetType() const
    {
        return FDE_CSSVALUETYPE_Primitive;
    }
    virtual FDE_CSSPRIMITIVETYPE	GetPrimitiveType() const = 0;
    virtual FX_ARGB					GetRGBColor() const = 0;
    virtual FX_FLOAT				GetFloat() const = 0;
    virtual const FX_WCHAR*				GetString(int32_t &iLength) const = 0;
    virtual FDE_CSSPROPERTYVALUE	GetEnum() const = 0;
    virtual	const FX_WCHAR*				GetFuncName() const = 0;
    virtual int32_t				CountArgs() const = 0;
    virtual IFDE_CSSValue*			GetArgs(int32_t index) const = 0;
};
class IFDE_CSSValueList : public IFDE_CSSValue
{
public:
    virtual FDE_CSSVALUETYPE		GetType() const
    {
        return FDE_CSSVALUETYPE_List;
    }
    virtual int32_t				CountValues() const = 0;
    virtual IFDE_CSSValue*			GetValue(int32_t index) const = 0;
};
enum FDE_CSSPROPERTY {
    FDE_CSSPROPERTY_WritingMode,
    FDE_CSSPROPERTY_ColumnRuleWidth,
    FDE_CSSPROPERTY_BorderLeft,
    FDE_CSSPROPERTY_ColumnRule,
    FDE_CSSPROPERTY_Height,
    FDE_CSSPROPERTY_CounterReset,
    FDE_CSSPROPERTY_Content,
    FDE_CSSPROPERTY_RubyPosition,
    FDE_CSSPROPERTY_BackgroundColor,
    FDE_CSSPROPERTY_Width,
    FDE_CSSPROPERTY_Src,
    FDE_CSSPROPERTY_Top,
    FDE_CSSPROPERTY_Margin,
    FDE_CSSPROPERTY_BorderColor,
    FDE_CSSPROPERTY_Widows,
    FDE_CSSPROPERTY_BorderBottomColor,
    FDE_CSSPROPERTY_TextIndent,
    FDE_CSSPROPERTY_Right,
    FDE_CSSPROPERTY_TextEmphasisStyle,
    FDE_CSSPROPERTY_PaddingLeft,
    FDE_CSSPROPERTY_ColumnWidth,
    FDE_CSSPROPERTY_MarginLeft,
    FDE_CSSPROPERTY_Border,
    FDE_CSSPROPERTY_BorderTop,
    FDE_CSSPROPERTY_RubyOverhang,
    FDE_CSSPROPERTY_PageBreakBefore,
    FDE_CSSPROPERTY_MaxHeight,
    FDE_CSSPROPERTY_MinWidth,
    FDE_CSSPROPERTY_BorderLeftColor,
    FDE_CSSPROPERTY_Bottom,
    FDE_CSSPROPERTY_Quotes,
    FDE_CSSPROPERTY_MaxWidth,
    FDE_CSSPROPERTY_PaddingRight,
    FDE_CSSPROPERTY_ListStyleImage,
    FDE_CSSPROPERTY_WhiteSpace,
    FDE_CSSPROPERTY_BorderBottom,
    FDE_CSSPROPERTY_ListStyleType,
    FDE_CSSPROPERTY_WordBreak,
    FDE_CSSPROPERTY_OverflowX,
    FDE_CSSPROPERTY_OverflowY,
    FDE_CSSPROPERTY_BorderTopColor,
    FDE_CSSPROPERTY_FontFamily,
    FDE_CSSPROPERTY_Cursor,
    FDE_CSSPROPERTY_RubyAlign,
    FDE_CSSPROPERTY_ColumnRuleColor,
    FDE_CSSPROPERTY_FontWeight,
    FDE_CSSPROPERTY_BorderRightStyle,
    FDE_CSSPROPERTY_MinHeight,
    FDE_CSSPROPERTY_Color,
    FDE_CSSPROPERTY_LetterSpacing,
    FDE_CSSPROPERTY_EmptyCells,
    FDE_CSSPROPERTY_TextAlign,
    FDE_CSSPROPERTY_RubySpan,
    FDE_CSSPROPERTY_Position,
    FDE_CSSPROPERTY_BorderStyle,
    FDE_CSSPROPERTY_BorderBottomStyle,
    FDE_CSSPROPERTY_BorderCollapse,
    FDE_CSSPROPERTY_ColumnCount,
    FDE_CSSPROPERTY_BorderRightWidth,
    FDE_CSSPROPERTY_UnicodeBidi,
    FDE_CSSPROPERTY_VerticalAlign,
    FDE_CSSPROPERTY_PaddingTop,
    FDE_CSSPROPERTY_Columns,
    FDE_CSSPROPERTY_Overflow,
    FDE_CSSPROPERTY_TableLayout,
    FDE_CSSPROPERTY_FontVariant,
    FDE_CSSPROPERTY_ListStyle,
    FDE_CSSPROPERTY_BackgroundPosition,
    FDE_CSSPROPERTY_BorderWidth,
    FDE_CSSPROPERTY_TextEmphasisColor,
    FDE_CSSPROPERTY_BorderLeftStyle,
    FDE_CSSPROPERTY_PageBreakInside,
    FDE_CSSPROPERTY_TextEmphasis,
    FDE_CSSPROPERTY_BorderBottomWidth,
    FDE_CSSPROPERTY_ColumnGap,
    FDE_CSSPROPERTY_Orphans,
    FDE_CSSPROPERTY_BorderRight,
    FDE_CSSPROPERTY_FontSize,
    FDE_CSSPROPERTY_PageBreakAfter,
    FDE_CSSPROPERTY_CaptionSide,
    FDE_CSSPROPERTY_BackgroundRepeat,
    FDE_CSSPROPERTY_BorderTopStyle,
    FDE_CSSPROPERTY_BorderSpacing,
    FDE_CSSPROPERTY_TextTransform,
    FDE_CSSPROPERTY_FontStyle,
    FDE_CSSPROPERTY_Font,
    FDE_CSSPROPERTY_LineHeight,
    FDE_CSSPROPERTY_MarginRight,
    FDE_CSSPROPERTY_Float,
    FDE_CSSPROPERTY_BorderLeftWidth,
    FDE_CSSPROPERTY_Display,
    FDE_CSSPROPERTY_Clear,
    FDE_CSSPROPERTY_ColumnRuleStyle,
    FDE_CSSPROPERTY_TextCombine,
    FDE_CSSPROPERTY_ListStylePosition,
    FDE_CSSPROPERTY_Visibility,
    FDE_CSSPROPERTY_PaddingBottom,
    FDE_CSSPROPERTY_BackgroundAttachment,
    FDE_CSSPROPERTY_BackgroundImage,
    FDE_CSSPROPERTY_LineBreak,
    FDE_CSSPROPERTY_Background,
    FDE_CSSPROPERTY_BorderTopWidth,
    FDE_CSSPROPERTY_WordSpacing,
    FDE_CSSPROPERTY_BorderRightColor,
    FDE_CSSPROPERTY_CounterIncrement,
    FDE_CSSPROPERTY_Left,
    FDE_CSSPROPERTY_TextDecoration,
    FDE_CSSPROPERTY_Padding,
    FDE_CSSPROPERTY_MarginBottom,
    FDE_CSSPROPERTY_MarginTop,
    FDE_CSSPROPERTY_Direction,
    FDE_CSSPROPERTY_MAX
};
class IFDE_CSSDeclaration
{
public:
    virtual ~IFDE_CSSDeclaration() {}
    virtual IFDE_CSSValue*			GetProperty(FDE_CSSPROPERTY eProperty, FX_BOOL &bImportant) const = 0;
    virtual FX_POSITION				GetStartPosition() const = 0;
    virtual void					GetNextProperty(FX_POSITION &pos, FDE_CSSPROPERTY &eProperty, IFDE_CSSValue *&pValue, FX_BOOL &bImportant) const = 0;
    virtual FX_POSITION				GetStartCustom() const = 0;
    virtual void					GetNextCustom(FX_POSITION &pos, CFX_WideString &wsName, CFX_WideString &wsValue) const = 0;
};
typedef CFX_ArrayTemplate<IFDE_CSSDeclaration*> CFDE_CSSDeclarationArray;
enum FDE_CSSPERSUDO {
    FDE_CSSPERSUDO_After,
    FDE_CSSPERSUDO_Before,
    FDE_CSSPERSUDO_NONE
};
enum FDE_CSSSELECTORTYPE {
    FDE_CSSSELECTORTYPE_Element,
    FDE_CSSSELECTORTYPE_Descendant,
    FDE_CSSSELECTORTYPE_Class,
    FDE_CSSSELECTORTYPE_Persudo,
    FDE_CSSSELECTORTYPE_ID,
};
class IFDE_CSSSelector
{
public:
    virtual ~IFDE_CSSSelector() {}
    virtual FDE_CSSSELECTORTYPE		GetType() const = 0;
    virtual FX_DWORD				GetNameHash() const = 0;
    virtual IFDE_CSSSelector*		GetNextSelector() const = 0;
};
#define FDE_CSSMEDIATYPE_Braille	0x01
#define FDE_CSSMEDIATYPE_Emboss		0x02
#define FDE_CSSMEDIATYPE_Handheld	0x04
#define FDE_CSSMEDIATYPE_Print		0x08
#define FDE_CSSMEDIATYPE_Projection	0x10
#define FDE_CSSMEDIATYPE_Screen		0x20
#define FDE_CSSMEDIATYPE_TTY		0x40
#define FDE_CSSMEDIATYPE_TV			0x80
#define FDE_CSSMEDIATYPE_ALL		0xFF
enum FDE_CSSRULETYPE {
    FDE_CSSRULETYPE_Unknown			= 0,
    FDE_CSSRULETYPE_Style			= 1,
    FDE_CSSRULETYPE_Media			= 4,
    FDE_CSSRULETYPE_FontFace		= 5,
};
class IFDE_CSSRule
{
public:
    virtual ~IFDE_CSSRule() {}
    virtual FDE_CSSRULETYPE			GetType() const = 0;
};
typedef CFX_MassArrayTemplate<IFDE_CSSRule*> CFDE_CSSRuleArray;
class IFDE_CSSStyleRule : public IFDE_CSSRule
{
public:
    virtual FDE_CSSRULETYPE			GetType() const
    {
        return FDE_CSSRULETYPE_Style;
    }
    virtual int32_t				CountSelectorLists() const = 0;
    virtual IFDE_CSSSelector*		GetSelectorList(int32_t index) const = 0;
    virtual IFDE_CSSDeclaration*	GetDeclaration() const = 0;
};
class IFDE_CSSMediaRule : public IFDE_CSSRule
{
public:
    virtual FDE_CSSRULETYPE			GetType() const
    {
        return FDE_CSSRULETYPE_Media;
    }
    virtual FX_DWORD				GetMediaList() const = 0;
    virtual int32_t				CountRules() const = 0;
    virtual IFDE_CSSRule*			GetRule(int32_t index) = 0;
};
class IFDE_CSSFontFaceRule : public IFDE_CSSRule
{
public:
    virtual FDE_CSSRULETYPE			GetType() const
    {
        return FDE_CSSRULETYPE_FontFace;
    }
    virtual	IFDE_CSSDeclaration*	GetDeclaration() const = 0;
};
class IFDE_CSSStyleSheet : public IFX_Unknown
{
public:
    static IFDE_CSSStyleSheet*		LoadHTMLStandardStyleSheet();
    static IFDE_CSSStyleSheet*		LoadFromStream(const CFX_WideString &szUrl, IFX_Stream *pStream, FX_WORD wCodePage, FX_DWORD dwMediaList = FDE_CSSMEDIATYPE_ALL);
    static IFDE_CSSStyleSheet*		LoadFromBuffer(const CFX_WideString &szUrl, const FX_WCHAR* pBuffer, int32_t iBufSize, FX_WORD wCodePage, FX_DWORD dwMediaList = FDE_CSSMEDIATYPE_ALL);
    virtual FX_BOOL					GetUrl(CFX_WideString &szUrl) = 0;
    virtual FX_DWORD				GetMediaList() const = 0;
    virtual FX_WORD					GetCodePage() const = 0;

    virtual int32_t				CountRules() const = 0;
    virtual IFDE_CSSRule*			GetRule(int32_t index) = 0;
};
typedef CFX_ArrayTemplate<IFDE_CSSStyleSheet*> CFDE_CSSStyleSheetArray;
#define FDE_CSSUSERSTYLESHEET		(FX_BSTRC("#USERSHEET"))
#define FDE_CSSUAGENTSTYLESHEET		(FX_BSTRC("#AGENTSHEET"))
class IFDE_CSSStyleSheetCache
{
public:
    static IFDE_CSSStyleSheetCache*	Create();
    virtual ~IFDE_CSSStyleSheetCache() {}
    virtual void					Release() = 0;
    virtual void					SetMaxItems(int32_t iMaxCount = 5) = 0;
    virtual void					AddStyleSheet(const CFX_ByteStringC& szKey, IFDE_CSSStyleSheet *pStyleSheet) = 0;
    virtual IFDE_CSSStyleSheet*		GetStyleSheet(const CFX_ByteStringC& szKey) const = 0;
    virtual void					RemoveStyleSheet(const CFX_ByteStringC& szKey) = 0;
};
enum FDE_CSSSYNTAXSTATUS {
    FDE_CSSSYNTAXSTATUS_Error,
    FDE_CSSSYNTAXSTATUS_EOS,
    FDE_CSSSYNTAXSTATUS_None,
    FDE_CSSSYNTAXSTATUS_Charset,
    FDE_CSSSYNTAXSTATUS_ImportRule,
    FDE_CSSSYNTAXSTATUS_ImportClose,
    FDE_CSSSYNTAXSTATUS_PageRule,
    FDE_CSSSYNTAXSTATUS_StyleRule,
    FDE_CSSSYNTAXSTATUS_FontFaceRule,
    FDE_CSSSYNTAXSTATUS_MediaRule,
    FDE_CSSSYNTAXSTATUS_MediaType,
    FDE_CSSSYNTAXSTATUS_URI,
    FDE_CSSSYNTAXSTATUS_Selector,
    FDE_CSSSYNTAXSTATUS_DeclOpen,
    FDE_CSSSYNTAXSTATUS_DeclClose,
    FDE_CSSSYNTAXSTATUS_PropertyName,
    FDE_CSSSYNTAXSTATUS_PropertyValue,
};
class IFDE_CSSSyntaxParser
{
public:
    static IFDE_CSSSyntaxParser*	Create();
    virtual ~IFDE_CSSSyntaxParser() {}
    virtual void					Release() = 0;
    virtual FX_BOOL					Init(IFX_Stream *pStream, int32_t iCSSPlaneSize, int32_t iTextDataSize = 32, FX_BOOL bOnlyDeclaration = FALSE) = 0;
    virtual FX_BOOL					Init(const FX_WCHAR* pBuffer, int32_t iBufferSize, int32_t iTextDatSize = 32, FX_BOOL bOnlyDeclaration = FALSE) = 0;

    virtual FDE_CSSSYNTAXSTATUS		DoSyntaxParse() = 0;
    virtual const FX_WCHAR*				GetCurrentString(int32_t &iLength) const = 0;
};
enum FDE_CSSLENGTHUNIT {
    FDE_CSSLENGTHUNIT_Auto,
    FDE_CSSLENGTHUNIT_None,
    FDE_CSSLENGTHUNIT_Normal,
    FDE_CSSLENGTHUNIT_Point,
    FDE_CSSLENGTHUNIT_Percent,
};
#define FDE_CSSUNITBITS				(3)
#define FDE_CSSUNITMASK				((1 << FDE_CSSUNITBITS) - 1)
struct FDE_CSSLENGTH {
    FDE_CSSLENGTH&					Set(FDE_CSSLENGTHUNIT eUnit)
    {
        m_iData = eUnit;
        return *this;
    }
    FDE_CSSLENGTH&					Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue)
    {
        m_iData = ((intptr_t)(fValue * 1024.0f) << FDE_CSSUNITBITS) | eUnit;
        return *this;
    }
    FDE_CSSLENGTHUNIT				GetUnit() const
    {
        return (FDE_CSSLENGTHUNIT)(m_iData & FDE_CSSUNITMASK);
    }
    FX_FLOAT						GetValue() const
    {
        return (m_iData >> FDE_CSSUNITBITS) / 1024.0f;
    }
    FX_BOOL							NonZero() const
    {
        return (m_iData >> FDE_CSSUNITBITS) != 0;
    }
private:
    intptr_t						m_iData;
};
struct FDE_CSSPOINT {
    FDE_CSSPOINT&					Set(FDE_CSSLENGTHUNIT eUnit)
    {
        x.Set(eUnit);
        y.Set(eUnit);
        return *this;
    }
    FDE_CSSPOINT&					Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue)
    {
        x.Set(eUnit, fValue);
        y.Set(eUnit, fValue);
        return *this;
    }
    FDE_CSSLENGTH					x, y;
};
struct FDE_CSSSIZE {
    FDE_CSSSIZE&					Set(FDE_CSSLENGTHUNIT eUnit)
    {
        cx.Set(eUnit);
        cy.Set(eUnit);
        return *this;
    }
    FDE_CSSSIZE&					Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue)
    {
        cx.Set(eUnit, fValue);
        cy.Set(eUnit, fValue);
        return *this;
    }
    FDE_CSSLENGTH					cx, cy;
};
struct FDE_CSSRECT {
    FDE_CSSRECT&					Set(FDE_CSSLENGTHUNIT eUnit)
    {
        left.Set(eUnit);
        top.Set(eUnit);
        right.Set(eUnit);
        bottom.Set(eUnit);
        return *this;
    }
    FDE_CSSRECT&					Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue)
    {
        left.Set(eUnit, fValue);
        top.Set(eUnit, fValue);
        right.Set(eUnit, fValue);
        bottom.Set(eUnit, fValue);
        return *this;
    }

    FDE_CSSLENGTH			left, top, right, bottom;
};
enum FDE_CSSBKGATTACHMENT {
    FDE_CSSBKGATTACHMENT_Scroll,
    FDE_CSSBKGATTACHMENT_Fixed,
};
enum FDE_CSSBKGREPEAT {
    FDE_CSSBKGREPEAT_Repeat,
    FDE_CSSBKGREPEAT_RepeatX,
    FDE_CSSBKGREPEAT_RepeatY,
    FDE_CSSBKGREPEAT_NoRepeat,
};
enum FDE_CSSBORDERSTYLE {
    FDE_CSSBORDERSTYLE_None,
    FDE_CSSBORDERSTYLE_Hidden,
    FDE_CSSBORDERSTYLE_Dotted,
    FDE_CSSBORDERSTYLE_Dashed,
    FDE_CSSBORDERSTYLE_Solid,
    FDE_CSSBORDERSTYLE_Double,
    FDE_CSSBORDERSTYLE_Groove,
    FDE_CSSBORDERSTYLE_Ridge,
    FDE_CSSBORDERSTYLE_Inset,
    FDE_CSSBORDERSTYLE_outset,
};
enum FDE_CSSCLEAR {
    FDE_CSSCLEAR_None,
    FDE_CSSCLEAR_Left,
    FDE_CSSCLEAR_Right,
    FDE_CSSCLEAR_Both,
};
enum FDE_CSSDISPLAY {
    FDE_CSSDISPLAY_None,
    FDE_CSSDISPLAY_ListItem,
    FDE_CSSDISPLAY_RunIn,
    FDE_CSSDISPLAY_Block,
    FDE_CSSDISPLAY_Inline,
    FDE_CSSDISPLAY_InlineBlock,
    FDE_CSSDISPLAY_InlineTable,
    FDE_CSSDISPLAY_Table,
    FDE_CSSDISPLAY_TableRow,
    FDE_CSSDISPLAY_TableCell,
    FDE_CSSDISPLAY_TableCaption,
    FDE_CSSDISPLAY_TableColumn,
    FDE_CSSDISPLAY_TableRowGroup,
    FDE_CSSDISPLAY_TableColumnGroup,
    FDE_CSSDISPLAY_TableHeaderGroup,
    FDE_CSSDISPLAY_TableFooterGroup,
    FDE_CSSDISPLAY_Ruby,
    FDE_CSSDISPLAY_RubyBase,
    FDE_CSSDISPLAY_RubyText,
    FDE_CSSDISPLSY_RubyBaseGroup,
    FDE_CSSDISPLAY_RubyTextGroup,
};
enum FDE_CSSVISIBILITY {
    FDE_CSSVISIBILITY_Visible,
    FDE_CSSVISIBILITY_Hidden,
    FDE_CSSVISIBILITY_Collapse,
};
enum FDE_CSSFONTSTYLE {
    FDE_CSSFONTSTYLE_Normal,
    FDE_CSSFONTSTYLE_Italic,
};
enum FDE_CSSFLOAT {
    FDE_CSSFLOAT_None,
    FDE_CSSFLOAT_Left,
    FDE_CSSFLOAT_Right,
};
enum FDE_CSSWRITINGMODE {
    FDE_CSSWRITINGMODE_HorizontalTb,
    FDE_CSSWRITINGMODE_VerticalRl,
    FDE_CSSWRITINGMODE_VerticalLr,
};
enum FDE_CSSWORDBREAK {
    FDE_CSSWORDBREAK_Normal,
    FDE_CSSWORDBREAK_KeepAll,
    FDE_CSSWORDBREAK_BreakAll,
    FDE_CSSWORDBREAK_KeepWords,
};
enum FDE_CSSPAGEBREAK {
    FDE_CSSPAGEBREAK_Auto,
    FDE_CSSPAGEBREAK_Always,
    FDE_CSSPAGEBREAK_Avoid,
    FDE_CSSPAGEBREAK_Left,
    FDE_CSSPAGEBREAK_Right,
};
enum FDE_CSSOVERFLOW {
    FDE_CSSOVERFLOW_Visible,
    FDE_CSSOVERFLOW_Hidden,
    FDE_CSSOVERFLOW_Scroll,
    FDE_CSSOVERFLOW_Auto,
    FDE_CSSOVERFLOW_NoDisplay,
    FDE_CSSOVERFLOW_NoContent,
};
enum FDE_CSSLINEBREAK {
    FDE_CSSLINEBREAK_Auto,
    FDE_CSSLINEBREAK_Loose,
    FDE_CSSLINEBREAK_Normal,
    FDE_CSSLINEBREAK_Strict,
};
enum FDE_CSSTEXTEMPHASISFILL {
    FDE_CSSTEXTEMPHASISFILL_Filled,
    FDE_CSSTEXTEMPHASISFILL_Open,
};
enum FDE_CSSTEXTEMPHASISMARK {
    FDE_CSSTEXTEMPHASISMARK_None,
    FDE_CSSTEXTEMPHASISMARK_Auto,
    FDE_CSSTEXTEMPHASISMARK_Dot,
    FDE_CSSTEXTEMPHASISMARK_Circle,
    FDE_CSSTEXTEMPHASISMARK_DoubleCircle,
    FDE_CSSTEXTEMPHASISMARK_Triangle,
    FDE_CSSTEXTEMPHASISMARK_Sesame,
    FDE_CSSTEXTEMPHASISMARK_Custom,
};
enum FDE_CSSTEXTCOMBINE {
    FDE_CSSTEXTCOMBINE_Horizontal,
    FDE_CSSTEXTCOMBINE_None,
};
enum FDE_CSSCURSOR {
    FDE_CSSCURSOR_Auto,
    FDE_CSSCURSOR_Crosshair,
    FDE_CSSCURSOR_Default,
    FDE_CSSCURSOR_Pointer,
    FDE_CSSCURSOR_Move,
    FDE_CSSCURSOR_EResize,
    FDE_CSSCURSOR_NeResize,
    FDE_CSSCURSOR_NwResize,
    FDE_CSSCURSOR_NResize,
    FDE_CSSCURSOR_SeResize,
    FDE_CSSCURSOR_SwResize,
    FDE_CSSCURSOR_SResize,
    FDE_CSSCURSOR_WResize,
    FDE_CSSCURSOR_Text,
    FDE_CSSCURSOR_Wait,
    FDE_CSSCURSOR_Help,
    FDE_CSSCURSOR_Progress,
};
enum FDE_CSSPOSITION {
    FDE_CSSPOSITION_Static,
    FDE_CSSPOSITION_Relative,
    FDE_CSSPOSITION_Absolute,
    FDE_CSSPOSITION_Fixed,
};
enum FDE_CSSCAPTIONSIDE {
    FDE_CSSCAPTIONSIDE_Top,
    FDE_CSSCAPTIONSIDE_Bottom,
    FDE_CSSCAPTIONSIDE_Left,
    FDE_CSSCAPTIONSIDE_Right,
    FDE_CSSCAPTIONSIDE_Before,
    FDE_CSSCAPTIONSIDE_After,
};
enum FDE_CSSRUBYALIGN {
    FDE_CSSRUBYALIGN_Auto,
    FDE_CSSRUBYALIGN_Start,
    FDE_CSSRUBYALIGN_Left,
    FDE_CSSRUBYALIGN_Center,
    FDE_CSSRUBYALIGN_End,
    FDE_CSSRUBYALIGN_Right,
    FDE_CSSRUBYALIGN_DistributeLetter,
    FDE_CSSRUBYALIGN_DistributeSpace,
    FDE_CSSRUBYALIGN_LineEdge,
};
enum FDE_CSSRUBYOVERHANG {
    FDE_CSSRUBYOVERHANG_Auto,
    FDE_CSSRUBYOVERHANG_Start,
    FDE_CSSRUBYOVERHANG_End,
    FDE_CSSRUBYOVERHANG_None,
};
enum FDE_CSSRUBYPOSITION {
    FDE_CSSRUBYPOSITION_Before,
    FDE_CSSRUBYPOSITION_After,
    FDE_CSSRUBYPOSITION_Right,
    FDE_CSSRUBYPOSITION_Inline,
};
enum FDE_CSSRUBYSPAN {
    FDE_CSSRUBYSPAN_None,
    FDE_CSSRUBYSPAN_Attr,
};
enum FDE_CSSTEXTALIGN {
    FDE_CSSTEXTALIGN_Left,
    FDE_CSSTEXTALIGN_Right,
    FDE_CSSTEXTALIGN_Center,
    FDE_CSSTEXTALIGN_Justify,
    FDE_CSSTEXTALIGN_JustifyAll,
};
enum FDE_CSSVERTICALALIGN {
    FDE_CSSVERTICALALIGN_Baseline,
    FDE_CSSVERTICALALIGN_Sub,
    FDE_CSSVERTICALALIGN_Super,
    FDE_CSSVERTICALALIGN_Top,
    FDE_CSSVERTICALALIGN_TextTop,
    FDE_CSSVERTICALALIGN_Middle,
    FDE_CSSVERTICALALIGN_Bottom,
    FDE_CSSVERTICALALIGN_TextBottom,
    FDE_CSSVERTICALALIGN_Number,
};
enum FDE_CSSLISTSTYLETYPE {
    FDE_CSSLISTSTYLETYPE_Disc,
    FDE_CSSLISTSTYLETYPE_Circle,
    FDE_CSSLISTSTYLETYPE_Square,
    FDE_CSSLISTSTYLETYPE_Decimal,
    FDE_CSSLISTSTYLETYPE_DecimalLeadingZero,
    FDE_CSSLISTSTYLETYPE_LowerRoman,
    FDE_CSSLISTSTYLETYPE_UpperRoman,
    FDE_CSSLISTSTYLETYPE_LowerGreek,
    FDE_CSSLISTSTYLETYPE_LowerLatin,
    FDE_CSSLISTSTYLETYPE_UpperLatin,
    FDE_CSSLISTSTYLETYPE_Armenian,
    FDE_CSSLISTSTYLETYPE_Georgian,
    FDE_CSSLISTSTYLETYPE_LowerAlpha,
    FDE_CSSLISTSTYLETYPE_UpperAlpha,
    FDE_CSSLISTSTYLETYPE_None,
    FDE_CSSLISTSTYLETYPE_CjkIdeographic,
    FDE_CSSLISTSTYLETYPE_Hebrew,
    FDE_CSSLISTSTYLETYPE_Hiragana,
    FDE_CSSLISTSTYLETYPE_HiraganaIroha,
    FDE_CSSLISTSTYLETYPE_Katakana,
    FDE_CSSLISTSTYLETYPE_KatakanaIroha,
};
enum FDE_CSSLISTSTYLEPOSITION {
    FDE_CSSLISTSTYLEPOSITION_Outside,
    FDE_CSSLISTSTYLEPOSITION_Inside,
};
enum FDE_CSSWHITESPACE {
    FDE_CSSWHITESPACE_Normal,
    FDE_CSSWHITESPACE_Pre,
    FDE_CSSWHITESPACE_Nowrap,
    FDE_CSSWHITESPACE_PreWrap,
    FDE_CSSWHITESPACE_PreLine,
};
enum FDE_CSSFONTVARIANT {
    FDE_CSSFONTVARIANT_Normal,
    FDE_CSSFONTVARIANT_SmallCaps,
};
enum FDE_CSSTEXTTRANSFORM {
    FDE_CSSTEXTTRANSFORM_None,
    FDE_CSSTEXTTRANSFORM_Capitalize,
    FDE_CSSTEXTTRANSFORM_UpperCase,
    FDE_CSSTEXTTRANSFORM_LowerCase,
};
enum FDE_CSSTEXTDECORATION {
    FDE_CSSTEXTDECORATION_None				= 0,
    FDE_CSSTEXTDECORATION_Underline			= 1,
    FDE_CSSTEXTDECORATION_Overline			= 2,
    FDE_CSSTEXTDECORATION_LineThrough		= 4,
    FDE_CSSTEXTDECORATION_Blink				= 8,
    FDE_CSSTEXTDECORATION_Double			= 16,
};
class IFDE_CSSRubyStyle
{
public:
    virtual ~IFDE_CSSRubyStyle() {}
    virtual FDE_CSSRUBYALIGN		GetRubyAlign() const = 0;
    virtual FDE_CSSRUBYOVERHANG		GetRubyOverhang() const = 0;
    virtual FDE_CSSRUBYPOSITION		GetRubyPosition() const = 0;
    virtual FDE_CSSRUBYSPAN			GetRubySpanType() const = 0;
    virtual IFDE_CSSValue*			GetRubySpanAttr() const = 0;
};
class IFDE_CSSMultiColumnStyle
{
public:
    virtual ~IFDE_CSSMultiColumnStyle() {}
    virtual const FDE_CSSLENGTH&	GetColumnCount() const = 0;
    virtual const FDE_CSSLENGTH&	GetColumnGap() const = 0;
    virtual FX_ARGB					GetColumnRuleColor() const = 0;
    virtual FDE_CSSBORDERSTYLE		GetColumnRuleStyle() const = 0;
    virtual const FDE_CSSLENGTH&	GetColumnRuleWidth() const = 0;
    virtual const FDE_CSSLENGTH&	GetColumnWidth() const = 0;
    virtual void					SetColumnCount(const FDE_CSSLENGTH &columnCount) = 0;
    virtual void					SetColumnGap(const FDE_CSSLENGTH &columnGap) = 0;
    virtual void					SetColumnRuleColor(FX_ARGB dwColumnRuleColor) = 0;
    virtual void					SetColumnRuleStyle(FDE_CSSBORDERSTYLE eColumnRuleStyle) = 0;
    virtual void					SetColumnRuleWidth(const FDE_CSSLENGTH &columnRuleWidth) = 0;
    virtual void					SetColumnWidth(const FDE_CSSLENGTH &columnWidth) = 0;
};
class IFDE_CSSGeneratedContentStyle
{
public:
    virtual ~IFDE_CSSGeneratedContentStyle() {}
    virtual int32_t				CountCounters() = 0;
    virtual const FX_WCHAR*				GetCounterIdentifier(int32_t index) = 0;
    virtual FX_BOOL					GetCounterReset(int32_t index, int32_t &iValue) = 0;
    virtual FX_BOOL					GetCounterIncrement(int32_t index, int32_t &iValue) = 0;
    virtual IFDE_CSSValueList*		GetContent() const = 0;
    virtual int32_t				CountQuotes() const = 0;
    virtual const FX_WCHAR*				GetQuotes(int32_t index) const = 0;
};
class IFDE_CSSFontStyle
{
public:
    virtual ~IFDE_CSSFontStyle() {}
    virtual int32_t				CountFontFamilies() const = 0;
    virtual const FX_WCHAR*				GetFontFamily(int32_t index) const = 0;
    virtual FX_WORD					GetFontWeight() const = 0;
    virtual FDE_CSSFONTVARIANT		GetFontVariant() const = 0;
    virtual FDE_CSSFONTSTYLE		GetFontStyle() const = 0;
    virtual FX_FLOAT				GetFontSize() const = 0;
    virtual FX_ARGB					GetColor() const = 0;
    virtual void					SetFontWeight(FX_WORD wFontWeight) = 0;
    virtual void					SetFontVariant(FDE_CSSFONTVARIANT eFontVariant) = 0;
    virtual void					SetFontStyle(FDE_CSSFONTSTYLE eFontStyle) = 0;
    virtual void					SetFontSize(FX_FLOAT fFontSize) = 0;
    virtual void					SetColor(FX_ARGB dwFontColor) = 0;
};
class IFDE_CSSBoundaryStyle
{
public:
    virtual ~IFDE_CSSBoundaryStyle() {}
    virtual FX_ARGB					GetBorderLeftColor() const = 0;
    virtual FX_ARGB					GetBorderTopColor() const = 0;
    virtual FX_ARGB					GetBorderRightColor() const = 0;
    virtual FX_ARGB					GetBorderBottomColor() const = 0;
    virtual FDE_CSSBORDERSTYLE		GetBorderLeftStyle() const = 0;
    virtual FDE_CSSBORDERSTYLE		GetBorderTopStyle() const = 0;
    virtual FDE_CSSBORDERSTYLE		GetBorderRightStyle() const = 0;
    virtual FDE_CSSBORDERSTYLE		GetBorderBottomStyle() const = 0;
    virtual const FDE_CSSRECT*		GetBorderWidth() const = 0;
    virtual const FDE_CSSRECT*		GetMarginWidth() const = 0;
    virtual const FDE_CSSRECT*		GetPaddingWidth() const = 0;
    virtual void					SetBorderLeftColor(FX_ARGB dwBorderColor) = 0;
    virtual void					SetBorderTopColor(FX_ARGB dwBorderColor) = 0;
    virtual void					SetBorderRightColor(FX_ARGB dwBorderColor) = 0;
    virtual void					SetBorderBottomColor(FX_ARGB dwBorderColor) = 0;

    virtual void					SetBorderLeftStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;
    virtual void					SetBorderTopStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;
    virtual void					SetBorderRightStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;
    virtual void					SetBorderBottomStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;

    virtual void					SetBorderWidth(const FDE_CSSRECT &rect) = 0;
    virtual void					SetMarginWidth(const FDE_CSSRECT &rect) = 0;
    virtual void					SetPaddingWidth(const FDE_CSSRECT &rect) = 0;
};
class IFDE_CSSPositionStyle
{
public:
    virtual ~IFDE_CSSPositionStyle() {}
    virtual FDE_CSSDISPLAY			GetDisplay() const = 0;
    virtual const FDE_CSSSIZE&		GetBoxSize() const = 0;
    virtual const FDE_CSSSIZE&		GetMinBoxSize() const = 0;
    virtual const FDE_CSSSIZE&		GetMaxBoxSize() const = 0;
    virtual FDE_CSSFLOAT			GetFloat() const = 0;
    virtual FDE_CSSCLEAR			GetClear() const = 0;
    virtual FDE_CSSPOSITION			GetPosition() const = 0;
    virtual FDE_CSSLENGTH			GetTop() const = 0;
    virtual FDE_CSSLENGTH			GetBottom() const = 0;
    virtual FDE_CSSLENGTH			GetLeft() const = 0;
    virtual FDE_CSSLENGTH			GetRight() const = 0;
    virtual void					SetDisplay(FDE_CSSDISPLAY eDisplay) = 0;
    virtual void					SetBoxSize(const FDE_CSSSIZE &boxSize) = 0;
    virtual void					SetMinBoxSize(const FDE_CSSSIZE &minBoxSize) = 0;
    virtual void					SetMaxBoxSize(const FDE_CSSSIZE &maxBoxSize) = 0;
    virtual void					SetFloat(FDE_CSSFLOAT eFloat) = 0;
    virtual void					SetClear(FDE_CSSCLEAR eClear) = 0;
};
class IFDE_CSSParagraphStyle
{
public:
    virtual ~IFDE_CSSParagraphStyle() {}
    virtual FX_FLOAT				GetLineHeight() const = 0;
    virtual FDE_CSSWHITESPACE		GetWhiteSpace() const = 0;
    virtual const FDE_CSSLENGTH&	GetTextIndent() const = 0;
    virtual FDE_CSSTEXTALIGN		GetTextAlign() const = 0;
    virtual FDE_CSSVERTICALALIGN	GetVerticalAlign() const = 0;
    virtual FX_FLOAT				GetNumberVerticalAlign() const = 0;
    virtual FDE_CSSTEXTTRANSFORM	GetTextTransform() const = 0;
    virtual FX_DWORD				GetTextDecoration() const = 0;
    virtual const FDE_CSSLENGTH&	GetLetterSpacing() const = 0;
    virtual const FDE_CSSLENGTH&	GetWordSpacing() const = 0;
    virtual FDE_CSSWRITINGMODE		GetWritingMode() const = 0;
    virtual FDE_CSSWORDBREAK		GetWordBreak() const = 0;
    virtual int32_t				GetWidows() const = 0;
    virtual FX_ARGB					GetTextEmphasisColor() const = 0;
    virtual FDE_CSSPAGEBREAK		GetPageBreakBefore() const = 0;
    virtual FDE_CSSPAGEBREAK		GetPageBreakAfter() const = 0;
    virtual FDE_CSSPAGEBREAK		GetPageBreakInside() const = 0;
    virtual int32_t				GetOrphans() const = 0;
    virtual FDE_CSSLINEBREAK		GetLineBreak() const = 0;
    virtual FDE_CSSTEXTEMPHASISMARK	GetTextEmphasisMark() const = 0;
    virtual FDE_CSSTEXTEMPHASISFILL	GetTextEmphasisFill() const = 0;
    virtual const FX_WCHAR*				GetTextEmphasisCustom() const = 0;
    virtual FDE_CSSTEXTCOMBINE		GetTextCombineType() const = 0;
    virtual FX_BOOL					HasTextCombineNumber() const = 0;
    virtual FX_FLOAT				GetTextCombineNumber() const = 0;
    virtual void					SetLineHeight(FX_FLOAT fLineHeight) = 0;
    virtual void					SetWhiteSpace(FDE_CSSWHITESPACE eWhiteSpace) = 0;
    virtual void					SetTextIndent(const FDE_CSSLENGTH &textIndent) = 0;
    virtual void					SetTextAlign(FDE_CSSTEXTALIGN eTextAlign) = 0;
    virtual void					SetVerticalAlign(FDE_CSSVERTICALALIGN eVerticalAlign) = 0;
    virtual void					SetNumberVerticalAlign(FX_FLOAT fAlign) = 0;
    virtual void					SetTextTransform(FDE_CSSTEXTTRANSFORM eTextTransform) = 0;
    virtual void					SetTextDecoration(FX_DWORD dwTextDecoration) = 0;
    virtual void					SetLetterSpacing(const FDE_CSSLENGTH &letterSpacing) = 0;
    virtual void				 	SetWordSpacing(const FDE_CSSLENGTH &wordSpacing) = 0;
    virtual void					SetWritingMode(FDE_CSSWRITINGMODE eWritingMode) = 0;
    virtual void					SetWordBreak(FDE_CSSWORDBREAK eWordBreak) = 0;
    virtual void					SetWidows(int32_t iWidows) = 0;
    virtual void					SetTextEmphasisColor(FX_ARGB dwTextEmphasisColor) = 0;
    virtual void					SetPageBreakBefore(FDE_CSSPAGEBREAK ePageBreakBefore) = 0;
    virtual void					SetPageBreakAfter(FDE_CSSPAGEBREAK ePageBreakAfter) = 0;
    virtual void					SetPageBreakInside(FDE_CSSPAGEBREAK ePageBreakInside) = 0;
    virtual void					SetOrphans(int32_t iOrphans) = 0;
    virtual void					SetLineBreak(FDE_CSSLINEBREAK eLineBreak) = 0;
};
class IFDE_CSSBackgroundStyle
{
public:
    virtual ~IFDE_CSSBackgroundStyle() {}
    virtual FX_ARGB					GetBKGColor() const = 0;
    virtual const FX_WCHAR*				GetBKGImage() const = 0;
    virtual FDE_CSSBKGREPEAT		GetBKGRepeat() const = 0;
    virtual FDE_CSSBKGATTACHMENT	GetBKGAttachment() const = 0;
    virtual const FDE_CSSPOINT&		GetBKGPosition() const = 0;
    virtual void					SetBKGColor(FX_ARGB dwBKGColor) = 0;
    virtual void					SetBKGPosition(const FDE_CSSPOINT &bkgPosition) = 0;
};
class IFDE_CSSListStyle
{
public:
    virtual ~IFDE_CSSListStyle() {}
    virtual FDE_CSSLISTSTYLETYPE		GetListStyleType() const = 0;
    virtual FDE_CSSLISTSTYLEPOSITION	GetListStylePosition() const = 0;
    virtual const FX_WCHAR*					GetListStyleImage() const = 0;
    virtual void						SetListStyleType(FDE_CSSLISTSTYLETYPE eListStyleType) = 0;
    virtual void						SetListStylePosition(FDE_CSSLISTSTYLEPOSITION eListStylePosition) = 0;
};
class IFDE_CSSTableStyle
{
public:
    virtual ~IFDE_CSSTableStyle() {}
    virtual FDE_CSSCAPTIONSIDE			GetCaptionSide() const = 0;
};
class IFDE_CSSVisualStyle
{
public:
    virtual ~IFDE_CSSVisualStyle() {}
    virtual FDE_CSSVISIBILITY		GetVisibility() const = 0;
    virtual FDE_CSSOVERFLOW			GetOverflowX() const = 0;
    virtual FDE_CSSOVERFLOW			GetOverflowY() const = 0;
    virtual void					SetVisibility(FDE_CSSVISIBILITY eVisibility) = 0;
};
class IFDE_CSSComputedStyle : public IFX_Unknown
{
public:
    virtual void							Reset() = 0;
    virtual IFDE_CSSFontStyle*				GetFontStyles() const = 0;
    virtual IFDE_CSSBoundaryStyle*			GetBoundaryStyles() const = 0;
    virtual IFDE_CSSPositionStyle*			GetPositionStyles() const = 0;
    virtual IFDE_CSSParagraphStyle*			GetParagraphStyles() const = 0;
    virtual IFDE_CSSBackgroundStyle*		GetBackgroundStyles() const = 0;
    virtual IFDE_CSSVisualStyle*			GetVisualStyles() const = 0;
    virtual IFDE_CSSListStyle*				GetListStyles() const = 0;
    virtual IFDE_CSSMultiColumnStyle*		GetMultiColumnStyle() const = 0;
    virtual IFDE_CSSTableStyle*				GetTableStyle() const = 0;
    virtual IFDE_CSSGeneratedContentStyle*	GetGeneratedContentStyle() const = 0;
    virtual IFDE_CSSRubyStyle*				GetRubyStyle() const = 0;
    virtual FX_BOOL							GetCustomStyle(const CFX_WideStringC& wsName, CFX_WideString &wsValue) const = 0;
};
enum FDE_CSSSTYLESHEETGROUP {
    FDE_CSSSTYLESHEETGROUP_UserAgent,
    FDE_CSSSTYLESHEETGROUP_User,
    FDE_CSSSTYLESHEETGROUP_Author,
    FDE_CSSSTYLESHEETGROUP_MAX,
};
enum FDE_CSSSTYLESHEETPRIORITY {
    FDE_CSSSTYLESHEETPRIORITY_High,
    FDE_CSSSTYLESHEETPRIORITY_Mid,
    FDE_CSSSTYLESHEETPRIORITY_Low,
    FDE_CSSSTYLESHEETPRIORITY_MAX,
};
class IFDE_CSSTagProvider
{
public:
    virtual ~IFDE_CSSTagProvider() {}
    virtual CFX_WideStringC			GetTagName() = 0;
    virtual FX_POSITION				GetFirstAttribute() = 0;
    virtual void					GetNextAttribute(FX_POSITION &pos, CFX_WideStringC &wsAttr, CFX_WideStringC &wsValue) = 0;
};
class IFDE_CSSAccelerator
{
public:
    virtual ~IFDE_CSSAccelerator() {}
    virtual void					OnEnterTag(IFDE_CSSTagProvider *pTag) = 0;
    virtual void					OnLeaveTag(IFDE_CSSTagProvider *pTag) = 0;
};
class IFDE_CSSStyleSelector
{
public:
    static IFDE_CSSStyleSelector*	Create();
    virtual ~IFDE_CSSStyleSelector() {}
    virtual void					Release() = 0;
    virtual void					SetFontMgr(IFX_FontMgr *pFontMgr) = 0;
    virtual void					SetDefFontSize(FX_FLOAT fFontSize) = 0;
    virtual FX_BOOL					SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType, IFDE_CSSStyleSheet *pSheet) = 0;
    virtual FX_BOOL					SetStyleSheets(FDE_CSSSTYLESHEETGROUP eType, const CFDE_CSSStyleSheetArray *pArray) = 0;
    virtual void					SetStylePriority(FDE_CSSSTYLESHEETGROUP eType, FDE_CSSSTYLESHEETPRIORITY ePriority) = 0;
    virtual void					UpdateStyleIndex(FX_DWORD dwMediaList) = 0;
    virtual IFDE_CSSAccelerator*	InitAccelerator() = 0;
    virtual IFDE_CSSComputedStyle*	CreateComputedStyle(IFDE_CSSComputedStyle *pParentStyle) = 0;
    virtual int32_t				MatchDeclarations(IFDE_CSSTagProvider *pTag, CFDE_CSSDeclarationArray &matchedDecls, FDE_CSSPERSUDO ePersudoType = FDE_CSSPERSUDO_NONE) = 0;
    virtual void					ComputeStyle(IFDE_CSSTagProvider *pTag, const IFDE_CSSDeclaration **ppDeclArray, int32_t iDeclCount, IFDE_CSSComputedStyle *pDestStyle) = 0;
};
#endif