/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SkSVGPaintState_DEFINED
#define SkSVGPaintState_DEFINED

#include "SkSVGBase.h"
#include "SkString.h"

class SkSVGPaint : public SkSVGBase {
public:
    enum Field {
        kInitial = -1,
        kClipPath,
        kClipRule,
        kEnableBackground,
        kFill,
        kFillRule,
        kFilter,
        kFontFamily,
        kFontSize,
        kLetterSpacing,
        kMask,
        kOpacity,
        kStopColor,
        kStopOpacity,
        kStroke,
        kStroke_Dasharray,
        kStroke_Linecap,
        kStroke_Linejoin,
        kStroke_Miterlimit,
        kStroke_Width,
        kStyle,
        kTransform,
        kTerminal
    };

    SkSVGPaint();
    virtual void addAttribute(SkSVGParser& parser, int attrIndex, 
        const char* attrValue, size_t attrLength);
    bool flush(SkSVGParser& , bool isFlushable, bool isDef);
    virtual int getAttributes(const SkSVGAttribute** attrPtr); 
    static void Push(SkSVGPaint** head, SkSVGPaint* add);
    static void Pop(SkSVGPaint** head);
    SkString* operator[](int index);
    SkString fInitial;
    SkString f_clipPath;
    SkString f_clipRule;
    SkString f_enableBackground;
    SkString f_fill;
    SkString f_fillRule;
    SkString f_filter;
    SkString f_fontFamily;
    SkString f_fontSize;
    SkString f_letterSpacing;
    SkString f_mask;
    SkString f_opacity;
    SkString f_stopColor;
    SkString f_stopOpacity;
    SkString f_stroke;
    SkString f_strokeDasharray;
    SkString f_strokeLinecap;
    SkString f_strokeLinejoin;
    SkString f_strokeMiterlimit;
    SkString f_strokeWidth;
    SkString f_style; // unused, but allows array access to the rest
    SkString f_transform;
#ifdef SK_DEBUG
    SkString fTerminal;
#endif
    SkString fTransformID;
    static SkSVGAttribute gAttributes[];
    static const int kAttributesSize;
private:
    void setSave(SkSVGParser& );
    bool writeChangedAttributes(SkSVGParser& , SkSVGPaint& , bool* changed);
    bool writeChangedElements(SkSVGParser& , SkSVGPaint& , bool* changed);
    SkSVGPaint* fNext;
    friend class SkSVGParser;
    typedef SkSVGPaint BASE_CLASS;
};

#endif // SkSVGPaintState_DEFINED
