📄 svgcssstyleselector.cpp
字号:
/* Copyright (C) 2005 Apple Computer, Inc. Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org> 2004, 2005, 2008 Rob Buis <buis@kde.org> Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> Based on khtml css code by: Copyright(C) 1999-2003 Lars Knoll(knoll@kde.org) (C) 2003 Apple Computer, Inc. (C) 2004 Allan Sandfeld Jensen(kde@carewolf.com) (C) 2004 Germain Garand(germain@ebooksfrance.org) 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.*/#include "config.h"#if ENABLE(SVG)#include "CSSStyleSelector.h"#include "CSSPrimitiveValueMappings.h"#include "CSSPropertyNames.h"#include "CSSValueList.h"#include "Document.h"#include "SVGColor.h"#include "SVGNames.h"#include "SVGPaint.h"#include "SVGRenderStyle.h"#include "SVGRenderStyleDefs.h"#include "SVGStyledElement.h"#include "SVGURIReference.h"#include <stdlib.h>#include <wtf/MathExtras.h>#define HANDLE_INHERIT(prop, Prop) \if (isInherit) \{\ svgstyle->set##Prop(m_parentStyle->svgStyle()->prop());\ return;\}#define HANDLE_INHERIT_AND_INITIAL(prop, Prop) \HANDLE_INHERIT(prop, Prop) \else if (isInitial) \ svgstyle->set##Prop(SVGRenderStyle::initial##Prop());#define HANDLE_INHERIT_COND(propID, prop, Prop) \if (id == propID) \{\ svgstyle->set##Prop(m_parentStyle->svgStyle()->prop());\ return;\}#define HANDLE_INITIAL_COND(propID, Prop) \if (id == propID) \{\ svgstyle->set##Prop(SVGRenderStyle::initial##Prop());\ return;\}#define HANDLE_INITIAL_COND_WITH_VALUE(propID, Prop, Value) \if (id == propID) { \ svgstyle->set##Prop(SVGRenderStyle::initial##Value()); \ return; \}namespace WebCore {static float roundToNearestGlyphOrientationAngle(float angle){ angle = fabsf(fmodf(angle, 360.0f)); if (angle <= 45.0f || angle > 315.0f) return 0.0f; else if (angle > 45.0f && angle <= 135.0f) return 90.0f; else if (angle > 135.0f && angle <= 225.0f) return 180.0f; return 270.0f;}static int angleToGlyphOrientation(float angle){ angle = roundToNearestGlyphOrientationAngle(angle); if (angle == 0.0f) return GO_0DEG; else if (angle == 90.0f) return GO_90DEG; else if (angle == 180.0f) return GO_180DEG; else if (angle == 270.0f) return GO_270DEG; return -1;}void CSSStyleSelector::applySVGProperty(int id, CSSValue* value){ CSSPrimitiveValue* primitiveValue = 0; if (value->isPrimitiveValue()) primitiveValue = static_cast<CSSPrimitiveValue*>(value); SVGRenderStyle* svgstyle = m_style->accessSVGStyle(); unsigned short valueType = value->cssValueType(); bool isInherit = m_parentNode && valueType == CSSPrimitiveValue::CSS_INHERIT; bool isInitial = valueType == CSSPrimitiveValue::CSS_INITIAL || (!m_parentNode && valueType == CSSPrimitiveValue::CSS_INHERIT); // What follows is a list that maps the CSS properties into their // corresponding front-end RenderStyle values. Shorthands(e.g. border, // background) occur in this list as well and are only hit when mapping // "inherit" or "initial" into front-end values. switch (id) { // ident only properties case CSSPropertyAlignmentBaseline: { HANDLE_INHERIT_AND_INITIAL(alignmentBaseline, AlignmentBaseline) if (!primitiveValue) break; svgstyle->setAlignmentBaseline(*primitiveValue); break; } case CSSPropertyBaselineShift: { HANDLE_INHERIT_AND_INITIAL(baselineShift, BaselineShift); if (!primitiveValue) break; if (primitiveValue->getIdent()) { switch (primitiveValue->getIdent()) { case CSSValueBaseline: svgstyle->setBaselineShift(BS_BASELINE); break; case CSSValueSub: svgstyle->setBaselineShift(BS_SUB); break; case CSSValueSuper: svgstyle->setBaselineShift(BS_SUPER); break; default: break; } } else { svgstyle->setBaselineShift(BS_LENGTH); svgstyle->setBaselineShiftValue(primitiveValue); } break; } case CSSPropertyKerning: { if (isInherit) { HANDLE_INHERIT_COND(CSSPropertyKerning, kerning, Kerning) return; } else if (isInitial) { HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyKerning, Kerning, Kerning) return; } svgstyle->setKerning(primitiveValue); break; } case CSSPropertyDominantBaseline: { HANDLE_INHERIT_AND_INITIAL(dominantBaseline, DominantBaseline) if (primitiveValue) svgstyle->setDominantBaseline(*primitiveValue); break; } case CSSPropertyColorInterpolation: { HANDLE_INHERIT_AND_INITIAL(colorInterpolation, ColorInterpolation) if (primitiveValue) svgstyle->setColorInterpolation(*primitiveValue); break; } case CSSPropertyColorInterpolationFilters: { HANDLE_INHERIT_AND_INITIAL(colorInterpolationFilters, ColorInterpolationFilters) if (primitiveValue) svgstyle->setColorInterpolationFilters(*primitiveValue); break; } case CSSPropertyColorRendering: { HANDLE_INHERIT_AND_INITIAL(colorRendering, ColorRendering) if (primitiveValue) svgstyle->setColorRendering(*primitiveValue); break; } case CSSPropertyClipRule: { HANDLE_INHERIT_AND_INITIAL(clipRule, ClipRule) if (primitiveValue) svgstyle->setClipRule(*primitiveValue); break; } case CSSPropertyFillRule: { HANDLE_INHERIT_AND_INITIAL(fillRule, FillRule) if (primitiveValue) svgstyle->setFillRule(*primitiveValue); break; } case CSSPropertyStrokeLinejoin: { HANDLE_INHERIT_AND_INITIAL(joinStyle, JoinStyle) if (primitiveValue) svgstyle->setJoinStyle(*primitiveValue); break; } case CSSPropertyImageRendering: { HANDLE_INHERIT_AND_INITIAL(imageRendering, ImageRendering) if (primitiveValue) svgstyle->setImageRendering(*primitiveValue); break; } case CSSPropertyShapeRendering: { HANDLE_INHERIT_AND_INITIAL(shapeRendering, ShapeRendering) if (primitiveValue) svgstyle->setShapeRendering(*primitiveValue); break; } case CSSPropertyTextRendering: { HANDLE_INHERIT_AND_INITIAL(textRendering, TextRendering) if (primitiveValue) svgstyle->setTextRendering(*primitiveValue); break; } // end of ident only properties case CSSPropertyFill: { HANDLE_INHERIT_AND_INITIAL(fillPaint, FillPaint) if (!primitiveValue && value) { SVGPaint *paint = static_cast<SVGPaint*>(value); if (paint) svgstyle->setFillPaint(paint); } break; } case CSSPropertyStroke: { HANDLE_INHERIT_AND_INITIAL(strokePaint, StrokePaint) if (!primitiveValue && value) { SVGPaint *paint = static_cast<SVGPaint*>(value); if (paint) svgstyle->setStrokePaint(paint); } break; } case CSSPropertyStrokeWidth: { HANDLE_INHERIT_AND_INITIAL(strokeWidth, StrokeWidth) if (!primitiveValue) return; svgstyle->setStrokeWidth(primitiveValue); break; } case CSSPropertyStrokeDasharray: { HANDLE_INHERIT_AND_INITIAL(strokeDashArray, StrokeDashArray) if (!primitiveValue && value) { CSSValueList* dashes = static_cast<CSSValueList*>(value); if (dashes) svgstyle->setStrokeDashArray(dashes); } break; } case CSSPropertyStrokeDashoffset: { HANDLE_INHERIT_AND_INITIAL(strokeDashOffset, StrokeDashOffset) if (!primitiveValue) return; svgstyle->setStrokeDashOffset(primitiveValue); break; } case CSSPropertyFillOpacity:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -