/*
Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005 Rob Buis <buis@kde.org>
Based on khtml code by:
Copyright (C) 2000-2003 Lars Knoll (knoll@kde.org)
(C) 2000 Antti Koivisto (koivisto@kde.org)
(C) 2000-2003 Dirk Mueller (mueller@kde.org)
(C) 2002-2003 Apple Computer, Inc.
This file is part of the KDE project
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef SVGRenderStyleDefs_h
#define SVGRenderStyleDefs_h
#if ENABLE(SVG)
#include "Color.h"
#include "Path.h"
#include "PlatformString.h"
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
// Helper macros for 'SVGRenderStyle'
#define SVG_RS_DEFINE_ATTRIBUTE(Data, Type, Name, Initial) \
void set##Type(Data val) { svg_noninherited_flags.f._##Name = val; } \
Data Name() const { return (Data) svg_noninherited_flags.f._##Name; } \
static Data initial##Type() { return Initial; }
#define SVG_RS_DEFINE_ATTRIBUTE_INHERITED(Data, Type, Name, Initial) \
void set##Type(Data val) { svg_inherited_flags._##Name = val; } \
Data Name() const { return (Data) svg_inherited_flags._##Name; } \
static Data initial##Type() { return Initial; }
// "Helper" macros for SVG's RenderStyle properties
// FIXME: These are impossible to work with or debug.
#define SVG_RS_DEFINE_ATTRIBUTE_DATAREF(Data, Group, Variable, Type, Name) \
Data Name() const { return Group->Variable; } \
void set##Type(Data obj) { SVG_RS_SET_VARIABLE(Group, Variable, obj) }
#define SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(Data, Group, Variable, Type, Name, Initial) \
SVG_RS_DEFINE_ATTRIBUTE_DATAREF(Data, Group, Variable, Type, Name) \
static Data initial##Type() { return Initial; }
#define SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL_REFCOUNTED(Data, Group, Variable, Type, Name, Initial) \
Data* Name() const { return Group->Variable.get(); } \
void set##Type(PassRefPtr<Data> obj) { \
if(!(Group->Variable == obj)) \
Group.access()->Variable = obj; \
} \
static Data* initial##Type() { return Initial; }
#define SVG_RS_SET_VARIABLE(Group, Variable, Value) \
if(!(Group->Variable == Value)) \
Group.access()->Variable = Value;
namespace WebCore {
enum EBaselineShift {
BS_BASELINE, BS_SUB, BS_SUPER, BS_LENGTH
};
enum ETextAnchor {
TA_START, TA_MIDDLE, TA_END
};
enum EColorInterpolation {
CI_AUTO, CI_SRGB, CI_LINEARRGB
};
enum EColorRendering {
CR_AUTO, CR_OPTIMIZESPEED, CR_OPTIMIZEQUALITY
};
enum EImageRendering {
IR_AUTO, IR_OPTIMIZESPEED, IR_OPTIMIZEQUALITY
};
enum EShapeRendering {
SR_AUTO, SR_OPTIMIZESPEED, SR_CRISPEDGES, SR_GEOMETRICPRECISION
};
enum ETextRendering {
TR_AUTO, TR_OPTIMIZESPEED, TR_OPTIMIZELEGIBILITY, TR_GEOMETRICPRECISION
};
enum EWritingMode {
WM_LRTB, WM_LR, WM_RLTB, WM_RL, WM_TBRL, WM_TB
};
enum EGlyphOrientation {
GO_0DEG, GO_90DEG, GO_180DEG, GO_270DEG, GO_AUTO
};
enum EAlignmentBaseline {
AB_AUTO, AB_BASELINE, AB_BEFORE_EDGE, AB_TEXT_BEFORE_EDGE,
AB_MIDDLE, AB_CENTRAL, AB_AFTER_EDGE, AB_TEXT_AFTER_EDGE,
AB_IDEOGRAPHIC, AB_ALPHABETIC, AB_HANGING, AB_MATHEMATICAL
};
enum EDominantBaseline {
DB_AUTO, DB_USE_SCRIPT, DB_NO_CHANGE, DB_RESET_SIZE,
DB_IDEOGRAPHIC, DB_ALPHABETIC, DB_HANGING, DB_MATHEMATICAL,
DB_CENTRAL, DB_MIDDLE, DB_TEXT_AFTER_EDGE, DB_TEXT_BEFORE_EDGE
};
class CSSValue;
class CSSValueList;
class SVGPaint;
// Inherited/Non-Inherited Style Datastructures
class StyleFillData : public RefCounted<StyleFillData> {
public:
static PassRefPtr<StyleFillData> create() { return adoptRef(new StyleFillData); }
PassRefPtr<StyleFillData> copy() const { return adoptRef(new StyleFillData(*this)); }
bool operator==(const StyleFillData &other) const;
bool operator!=(const StyleFillData &other) const
{
return !(*this == other);
}
float opacity;
RefPtr<SVGPaint> paint;
private:
StyleFillData();
StyleFillData(const StyleFillData&);
};
class StyleStrokeData : public RefCounted<StyleStrokeData> {
public:
static PassRefPtr<StyleStrokeData> create() { return adoptRef(new StyleStrokeData); }
PassRefPtr<StyleStrokeData> copy() const { return adoptRef(new StyleStrokeData(*this)); }
bool operator==(const StyleStrokeData&) const;
bool operator!=(const StyleStrokeData& other) const
{
return !(*this == other);
}
float opacity;
float miterLimit;
RefPtr<CSSValue> width;
RefPtr<CSSValue> dashOffset;
RefPtr<SVGPaint> paint;
RefPtr<CSSValueList> dashArray;
private:
StyleStrokeData();
StyleStrokeData(const StyleStrokeData&);
};
class StyleStopData : public RefCounted<StyleStopData> {
public:
static PassRefPtr<StyleStopData> create() { return adoptRef(new StyleStopData); }
PassRefPtr<StyleStopData> copy() const { return adoptRef(new StyleStopData(*this)); }
bool operator==(const StyleStopData &other) const;
bool operator!=(const StyleStopData &other) const
{
return !(*this == other);
}
float opacity;
Color color;
private:
StyleStopData();
StyleStopData(const StyleStopData&);
};
class StyleTextData : public RefCounted<StyleTextData> {
public:
static PassRefPtr<StyleTextData> create() { return adoptRef(new StyleTextData); }
PassRefPtr<StyleTextData> copy() const { return adoptRef(new StyleTextData(*this)); }
bool operator==(const StyleTextData& other) const;
bool operator!=(const StyleTextData& other) const
{
return !(*this == other);
}
RefPtr<CSSValue> kerning;
private:
StyleTextData();
StyleTextData(const StyleTextData& other);
};
class StyleClipData : public RefCounted<StyleClipData> {
public:
static PassRefPtr<StyleClipData> create() { return adoptRef(new StyleClipData); }
PassRefPtr<StyleClipData> copy() const { return adoptRef(new StyleClipData(*this)); }
bool operator==(const StyleClipData &other) const;
bool operator!=(const StyleClipData &other) const
{
return !(*this == other);
}
String clipPath;
private:
StyleClipData();
StyleClipData(const StyleClipData&);
};
class StyleMaskData : public RefCounted<StyleMaskData> {
public:
static PassRefPtr<StyleMaskData> create() { return adoptRef(new StyleMaskData); }
PassRefPtr<StyleMaskData> copy() const { return adoptRef(new StyleMaskData(*this)); }
bool operator==(const StyleMaskData &other) const;
bool operator!=(const StyleMaskData &other) const { return !(*this == other); }
String maskElement;
private:
StyleMaskData();
StyleMaskData(const StyleMaskData&);
};
class StyleMarkerData : public RefCounted<StyleMarkerData> {
public:
static PassRefPtr<StyleMarkerData> create() { return adoptRef(new StyleMarkerData); }
PassRefPtr<StyleMarkerData> copy() const { return adoptRef(new StyleMarkerData(*this)); }
bool operator==(const StyleMarkerData &other) const;
bool operator!=(const StyleMarkerData &other) const
{
return !(*this == other);
}
String startMarker;
String midMarker;
String endMarker;
private:
StyleMarkerData();
StyleMarkerData(const StyleMarkerData&);
};
// Note : the rule for this class is, *no inheritance* of these props
class StyleMiscData : public RefCounted<StyleMiscData> {
public:
static PassRefPtr<StyleMiscData> create() { return adoptRef(new StyleMiscData); }
PassRefPtr<StyleMiscData> copy() const { return adoptRef(new StyleMiscData(*this)); }
bool operator==(const StyleMiscData &other) const;
bool operator!=(const StyleMiscData &other) const
{
return !(*this == other);
}
String filter;
Color floodColor;
float floodOpacity;
Color lightingColor;
// non-inherited text stuff lives here not in StyleTextData.
RefPtr<CSSValue> baselineShiftValue;
private:
StyleMiscData();
StyleMiscData(const StyleMiscData&);
};
} // namespace WebCore
#endif // ENABLE(SVG)
#endif // SVGRenderStyleDefs_h
// vim:ts=4:noet