File indexing completed on 2024-04-28 15:22:51
0001 /* 0002 Copyright (C) 2005 Apple Computer, Inc. 0003 Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org> 0004 Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> 0005 Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> 0006 Copyright (C) 2009 Maksim Orlovich <maksim@kde.org> 0007 0008 Based on khtml css code by: 0009 Copyright (C) 1999-2003 Lars Knoll <knoll@kde.org> 0010 Copyright (C) 2003 Apple Computer, Inc. 0011 Copyright (C) 2004 Allan Sandfeld Jensen <kde@carewolf.com> 0012 Copyright (C) 2004 Germain Garand <germain@ebooksfrance.org> 0013 0014 This file is part of the KDE project 0015 0016 This library is free software; you can redistribute it and/or 0017 modify it under the terms of the GNU Library General Public 0018 License as published by the Free Software Foundation; either 0019 version 2 of the License, or (at your option) any later version. 0020 0021 This library is distributed in the hope that it will be useful, 0022 but WITHOUT ANY WARRANTY; without even the implied warranty of 0023 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0024 Library General Public License for more details. 0025 0026 You should have received a copy of the GNU Library General Public License 0027 along with this library; see the file COPYING.LIB. If not, write to 0028 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0029 Boston, MA 02110-1301, USA. 0030 */ 0031 0032 #include "cssstyleselector.h" 0033 #include "css_valueimpl.h" 0034 #include "css_svgvalueimpl.h" 0035 #include "cssvalues.h" 0036 0037 #include "SVGNames.h" 0038 #include "SVGRenderStyle.h" 0039 #include "SVGRenderStyleDefs.h" 0040 #include "SVGStyledElement.h" 0041 0042 #include <wtf/MathExtras.h> 0043 0044 #define HANDLE_INHERIT(prop, Prop) \ 0045 if (isInherit) \ 0046 {\ 0047 svgstyle->set##Prop(parentStyle->svgStyle()->prop());\ 0048 return;\ 0049 } 0050 0051 #define HANDLE_INHERIT_AND_INITIAL(prop, Prop) \ 0052 HANDLE_INHERIT(prop, Prop) \ 0053 else if (isInitial) \ 0054 svgstyle->set##Prop(SVGRenderStyle::initial##Prop()); 0055 0056 #define HANDLE_INHERIT_COND(propID, prop, Prop) \ 0057 if (id == propID) \ 0058 {\ 0059 svgstyle->set##Prop(parentStyle->svgStyle()->prop());\ 0060 return;\ 0061 } 0062 0063 #define HANDLE_INITIAL_COND(propID, Prop) \ 0064 if (id == propID) \ 0065 {\ 0066 svgstyle->set##Prop(SVGRenderStyle::initial##Prop());\ 0067 return;\ 0068 } 0069 0070 #define HANDLE_INITIAL_COND_WITH_VALUE(propID, Prop, Value) \ 0071 if (id == propID) { \ 0072 svgstyle->set##Prop(SVGRenderStyle::initial##Value()); \ 0073 return; \ 0074 } 0075 0076 namespace khtml 0077 { 0078 0079 using namespace DOM; 0080 using namespace WebCore; 0081 0082 static SVGPaintImpl *toPaint(CSSValueImpl *val) 0083 { 0084 if (val->cssValueType() != DOM::CSSValue::CSS_SVG_VALUE) { 0085 return nullptr; 0086 } 0087 SVGCSSValueImpl *svgVal = static_cast<SVGCSSValueImpl *>(val); 0088 if (svgVal->isSVGPaint()) { 0089 return static_cast<SVGPaintImpl *>(svgVal); 0090 } else { 0091 return nullptr; 0092 } 0093 } 0094 0095 static SVGColorImpl *toColor(CSSValueImpl *val) 0096 { 0097 if (val->cssValueType() != DOM::CSSValue::CSS_SVG_VALUE) { 0098 return nullptr; 0099 } 0100 SVGCSSValueImpl *svgVal = static_cast<SVGCSSValueImpl *>(val); 0101 if (svgVal->isSVGColor()) { 0102 return static_cast<SVGColorImpl *>(svgVal); 0103 } else { 0104 return nullptr; 0105 } 0106 } 0107 0108 static float roundToNearestGlyphOrientationAngle(float angle) 0109 { 0110 angle = fabsf(fmodf(angle, 360.0f)); 0111 0112 if (angle <= 45.0f || angle > 315.0f) { 0113 return 0.0f; 0114 } else if (angle > 45.0f && angle <= 135.0f) { 0115 return 90.0f; 0116 } else if (angle > 135.0f && angle <= 225.0f) { 0117 return 180.0f; 0118 } 0119 0120 return 270.0f; 0121 } 0122 0123 static int angleToGlyphOrientation(float angle) 0124 { 0125 angle = roundToNearestGlyphOrientationAngle(angle); 0126 0127 if (angle == 0.0f) { 0128 return GO_0DEG; 0129 } else if (angle == 90.0f) { 0130 return GO_90DEG; 0131 } else if (angle == 180.0f) { 0132 return GO_180DEG; 0133 } else if (angle == 270.0f) { 0134 return GO_270DEG; 0135 } 0136 0137 return -1; 0138 } 0139 0140 static EColorInterpolation colorInterpolationForValue(DOM::CSSPrimitiveValueImpl *primitiveValue) 0141 { 0142 if (!primitiveValue) { 0143 return CI_AUTO; 0144 } 0145 0146 switch (primitiveValue->getIdent()) { 0147 case CSS_VAL_SRGB: 0148 return CI_SRGB; 0149 case CSS_VAL_LINEARRGB: 0150 return CI_LINEARRGB; 0151 case CSS_VAL_AUTO: 0152 default: 0153 return CI_AUTO; 0154 } 0155 } 0156 0157 void CSSStyleSelector::applySVGRule(int id, DOM::CSSValueImpl *value) 0158 { 0159 CSSPrimitiveValueImpl *primitiveValue = nullptr; 0160 if (value->isPrimitiveValue()) { 0161 primitiveValue = static_cast<CSSPrimitiveValueImpl *>(value); 0162 } 0163 0164 SVGRenderStyle *svgstyle = style->accessSVGStyle(); 0165 unsigned short valueType = value->cssValueType(); 0166 0167 bool isInherit = parentNode && valueType == CSSPrimitiveValue::CSS_INHERIT; 0168 bool isInitial = valueType == CSSPrimitiveValue::CSS_INITIAL || (!parentNode && valueType == CSSPrimitiveValue::CSS_INHERIT); 0169 0170 // What follows is a list that maps the CSS properties into their 0171 // corresponding front-end RenderStyle values. Shorthands(e.g. border, 0172 // background) occur in this list as well and are only hit when mapping 0173 // "inherit" or "initial" into front-end values. 0174 switch (id) { 0175 // ident only properties 0176 case CSS_PROP_ALIGNMENT_BASELINE: { 0177 HANDLE_INHERIT_AND_INITIAL(alignmentBaseline, AlignmentBaseline) 0178 if (!primitiveValue) { 0179 break; 0180 } 0181 0182 switch (primitiveValue->getIdent()) { 0183 case CSS_VAL_AUTO: 0184 svgstyle->setAlignmentBaseline(AB_AUTO); 0185 break; 0186 case CSS_VAL_BASELINE: 0187 svgstyle->setAlignmentBaseline(AB_BASELINE); 0188 break; 0189 case CSS_VAL_BEFORE_EDGE: 0190 svgstyle->setAlignmentBaseline(AB_BEFORE_EDGE); 0191 break; 0192 case CSS_VAL_TEXT_BEFORE_EDGE: 0193 svgstyle->setAlignmentBaseline(AB_TEXT_BEFORE_EDGE); 0194 break; 0195 case CSS_VAL_MIDDLE: 0196 svgstyle->setAlignmentBaseline(AB_MIDDLE); 0197 break; 0198 case CSS_VAL_CENTRAL: 0199 svgstyle->setAlignmentBaseline(AB_CENTRAL); 0200 break; 0201 case CSS_VAL_AFTER_EDGE: 0202 svgstyle->setAlignmentBaseline(AB_AFTER_EDGE); 0203 break; 0204 case CSS_VAL_TEXT_AFTER_EDGE: 0205 svgstyle->setAlignmentBaseline(AB_TEXT_AFTER_EDGE); 0206 break; 0207 case CSS_VAL_IDEOGRAPHIC: 0208 svgstyle->setAlignmentBaseline(AB_IDEOGRAPHIC); 0209 break; 0210 case CSS_VAL_ALPHABETIC: 0211 svgstyle->setAlignmentBaseline(AB_ALPHABETIC); 0212 break; 0213 case CSS_VAL_HANGING: 0214 svgstyle->setAlignmentBaseline(AB_HANGING); 0215 break; 0216 case CSS_VAL_MATHEMATICAL: 0217 svgstyle->setAlignmentBaseline(AB_MATHEMATICAL); 0218 break; 0219 default: 0220 break; 0221 } 0222 break; 0223 } 0224 case CSS_PROP_BASELINE_SHIFT: { 0225 HANDLE_INHERIT_AND_INITIAL(baselineShift, BaselineShift); 0226 if (!primitiveValue) { 0227 break; 0228 } 0229 0230 if (primitiveValue->getIdent()) { 0231 switch (primitiveValue->getIdent()) { 0232 case CSS_VAL_BASELINE: 0233 svgstyle->setBaselineShift(BS_BASELINE); 0234 break; 0235 case CSS_VAL_SUB: 0236 svgstyle->setBaselineShift(BS_SUB); 0237 break; 0238 case CSS_VAL_SUPER: 0239 svgstyle->setBaselineShift(BS_SUPER); 0240 break; 0241 default: 0242 break; 0243 } 0244 } else { 0245 svgstyle->setBaselineShift(BS_LENGTH); 0246 svgstyle->setBaselineShiftValue(primitiveValue); 0247 } 0248 0249 break; 0250 } 0251 case CSS_PROP_KERNING: { 0252 if (isInherit) { 0253 HANDLE_INHERIT_COND(CSS_PROP_KERNING, kerning, Kerning) 0254 return; 0255 } else if (isInitial) { 0256 HANDLE_INITIAL_COND_WITH_VALUE(CSS_PROP_KERNING, Kerning, Kerning) 0257 return; 0258 } 0259 svgstyle->setKerning(primitiveValue); 0260 break; 0261 } 0262 case CSS_PROP_POINTER_EVENTS: { 0263 HANDLE_INHERIT_AND_INITIAL(pointerEvents, PointerEvents) 0264 if (!primitiveValue) { 0265 break; 0266 } 0267 0268 switch (primitiveValue->getIdent()) { 0269 case CSS_VAL_NONE: 0270 svgstyle->setPointerEvents(PE_NONE); 0271 break; 0272 case CSS_VAL_STROKE: 0273 svgstyle->setPointerEvents(PE_STROKE); 0274 break; 0275 case CSS_VAL_FILL: 0276 svgstyle->setPointerEvents(PE_FILL); 0277 break; 0278 case CSS_VAL_PAINTED: 0279 svgstyle->setPointerEvents(PE_PAINTED); 0280 break; 0281 case CSS_VAL_VISIBLE: 0282 svgstyle->setPointerEvents(PE_VISIBLE); 0283 break; 0284 case CSS_VAL_VISIBLESTROKE: 0285 svgstyle->setPointerEvents(PE_VISIBLE_STROKE); 0286 break; 0287 case CSS_VAL_VISIBLEFILL: 0288 svgstyle->setPointerEvents(PE_VISIBLE_FILL); 0289 break; 0290 case CSS_VAL_VISIBLEPAINTED: 0291 svgstyle->setPointerEvents(PE_VISIBLE_PAINTED); 0292 break; 0293 case CSS_VAL_ALL: 0294 svgstyle->setPointerEvents(PE_ALL); 0295 break; 0296 default: 0297 break; 0298 } 0299 break; 0300 } 0301 case CSS_PROP_DOMINANT_BASELINE: { 0302 HANDLE_INHERIT_AND_INITIAL(dominantBaseline, DominantBaseline) 0303 0304 if (!primitiveValue) { 0305 break; 0306 } 0307 0308 switch (primitiveValue->getIdent()) { 0309 case CSS_VAL_AUTO: 0310 svgstyle->setDominantBaseline(DB_AUTO); 0311 break; 0312 case CSS_VAL_USE_SCRIPT: 0313 svgstyle->setDominantBaseline(DB_USE_SCRIPT); 0314 break; 0315 case CSS_VAL_NO_CHANGE: 0316 svgstyle->setDominantBaseline(DB_NO_CHANGE); 0317 break; 0318 case CSS_VAL_RESET_SIZE: 0319 svgstyle->setDominantBaseline(DB_RESET_SIZE); 0320 break; 0321 case CSS_VAL_IDEOGRAPHIC: 0322 svgstyle->setDominantBaseline(DB_IDEOGRAPHIC); 0323 break; 0324 case CSS_VAL_ALPHABETIC: 0325 svgstyle->setDominantBaseline(DB_ALPHABETIC); 0326 break; 0327 case CSS_VAL_HANGING: 0328 svgstyle->setDominantBaseline(DB_HANGING); 0329 break; 0330 case CSS_VAL_MATHEMATICAL: 0331 svgstyle->setDominantBaseline(DB_MATHEMATICAL); 0332 break; 0333 case CSS_VAL_CENTRAL: 0334 svgstyle->setDominantBaseline(DB_CENTRAL); 0335 break; 0336 case CSS_VAL_MIDDLE: 0337 svgstyle->setDominantBaseline(DB_MIDDLE); 0338 break; 0339 case CSS_VAL_TEXT_AFTER_EDGE: 0340 svgstyle->setDominantBaseline(DB_TEXT_AFTER_EDGE); 0341 break; 0342 case CSS_VAL_TEXT_BEFORE_EDGE: 0343 svgstyle->setDominantBaseline(DB_TEXT_BEFORE_EDGE); 0344 break; 0345 default: 0346 break; 0347 } 0348 0349 break; 0350 } 0351 case CSS_PROP_COLOR_INTERPOLATION: { 0352 HANDLE_INHERIT_AND_INITIAL(colorInterpolation, ColorInterpolation); 0353 0354 svgstyle->setColorInterpolation(colorInterpolationForValue(primitiveValue)); 0355 break; 0356 } 0357 case CSS_PROP_COLOR_INTERPOLATION_FILTERS: { 0358 HANDLE_INHERIT_AND_INITIAL(colorInterpolationFilters, ColorInterpolationFilters) 0359 0360 svgstyle->setColorInterpolationFilters(colorInterpolationForValue(primitiveValue)); 0361 break; 0362 } 0363 case CSS_PROP_COLOR_RENDERING: { 0364 HANDLE_INHERIT_AND_INITIAL(colorRendering, ColorRendering) 0365 if (!primitiveValue) { 0366 break; 0367 } 0368 0369 switch (primitiveValue->getIdent()) { 0370 case CSS_VAL_AUTO: 0371 svgstyle->setColorRendering(CR_AUTO); 0372 break; 0373 case CSS_VAL_OPTIMIZESPEED: 0374 svgstyle->setColorRendering(CR_OPTIMIZESPEED); 0375 break; 0376 case CSS_VAL_OPTIMIZEQUALITY: 0377 svgstyle->setColorRendering(CR_OPTIMIZEQUALITY); 0378 break; 0379 default: 0380 break; 0381 } 0382 break; 0383 } 0384 case CSS_PROP_CLIP_RULE: { 0385 HANDLE_INHERIT_AND_INITIAL(clipRule, ClipRule) 0386 if (primitiveValue) { 0387 svgstyle->setClipRule((primitiveValue->getIdent() == CSS_VAL_NONZERO) ? RULE_NONZERO : RULE_EVENODD); 0388 } 0389 break; 0390 } 0391 case CSS_PROP_FILL_RULE: { 0392 HANDLE_INHERIT_AND_INITIAL(fillRule, FillRule) 0393 if (primitiveValue) { 0394 svgstyle->setFillRule((primitiveValue->getIdent() == CSS_VAL_NONZERO) ? RULE_NONZERO : RULE_EVENODD); 0395 } 0396 break; 0397 } 0398 0399 case CSS_PROP_STROKE_LINEJOIN: { 0400 HANDLE_INHERIT_AND_INITIAL(joinStyle, JoinStyle) 0401 if (!primitiveValue) { 0402 break; 0403 } 0404 0405 switch (primitiveValue->getIdent()) { 0406 case CSS_VAL_MITER: 0407 svgstyle->setJoinStyle(khtml::MiterJoin); 0408 break; 0409 case CSS_VAL_ROUND: 0410 svgstyle->setJoinStyle(khtml::RoundJoin); 0411 break; 0412 case CSS_VAL_BEVEL: 0413 svgstyle->setJoinStyle(khtml::BevelJoin); 0414 break; 0415 default: 0416 break; 0417 } 0418 break; 0419 } 0420 case CSS_PROP_IMAGE_RENDERING: { 0421 HANDLE_INHERIT_AND_INITIAL(imageRendering, ImageRendering) 0422 if (!primitiveValue) { 0423 break; 0424 } 0425 0426 switch (primitiveValue->getIdent()) { 0427 case CSS_VAL_AUTO: 0428 svgstyle->setImageRendering(IR_AUTO); 0429 break; 0430 case CSS_VAL_OPTIMIZESPEED: 0431 svgstyle->setImageRendering(IR_OPTIMIZESPEED); 0432 break; 0433 case CSS_VAL_OPTIMIZEQUALITY: 0434 svgstyle->setImageRendering(IR_OPTIMIZEQUALITY); 0435 break; 0436 default: 0437 break; 0438 } 0439 break; 0440 } 0441 case CSS_PROP_SHAPE_RENDERING: { 0442 HANDLE_INHERIT_AND_INITIAL(shapeRendering, ShapeRendering) 0443 if (!primitiveValue) { 0444 break; 0445 } 0446 0447 switch (primitiveValue->getIdent()) { 0448 case CSS_VAL_AUTO: 0449 svgstyle->setShapeRendering(SR_AUTO); 0450 break; 0451 case CSS_VAL_OPTIMIZESPEED: 0452 svgstyle->setShapeRendering(SR_OPTIMIZESPEED); 0453 break; 0454 case CSS_VAL_CRISPEDGES: 0455 svgstyle->setShapeRendering(SR_CRISPEDGES); 0456 break; 0457 case CSS_VAL_GEOMETRICPRECISION: 0458 svgstyle->setShapeRendering(SR_GEOMETRICPRECISION); 0459 break; 0460 default: 0461 break; 0462 } 0463 break; 0464 } 0465 case CSS_PROP_TEXT_RENDERING: { 0466 HANDLE_INHERIT_AND_INITIAL(textRendering, TextRendering) 0467 if (!primitiveValue) { 0468 break; 0469 } 0470 0471 switch (primitiveValue->getIdent()) { 0472 case CSS_VAL_AUTO: 0473 svgstyle->setTextRendering(TR_AUTO); 0474 break; 0475 case CSS_VAL_OPTIMIZESPEED: 0476 svgstyle->setTextRendering(TR_OPTIMIZESPEED); 0477 break; 0478 case CSS_VAL_OPTIMIZELEGIBILITY: 0479 svgstyle->setTextRendering(TR_OPTIMIZELEGIBILITY); 0480 break; 0481 case CSS_VAL_GEOMETRICPRECISION: 0482 svgstyle->setTextRendering(TR_GEOMETRICPRECISION); 0483 break; 0484 default: 0485 break; 0486 } 0487 0488 break; 0489 } 0490 // end of ident only properties 0491 case CSS_PROP_FILL: { 0492 HANDLE_INHERIT_AND_INITIAL(fillPaint, FillPaint) 0493 if (SVGPaintImpl *paint = toPaint(value)) { 0494 svgstyle->setFillPaint(paint); 0495 } 0496 break; 0497 } 0498 case CSS_PROP_STROKE: { 0499 HANDLE_INHERIT_AND_INITIAL(strokePaint, StrokePaint) 0500 if (SVGPaintImpl *paint = toPaint(value)) { 0501 svgstyle->setStrokePaint(paint); 0502 } 0503 break; 0504 } 0505 case CSS_PROP_STROKE_WIDTH: { 0506 HANDLE_INHERIT_AND_INITIAL(strokeWidth, StrokeWidth) 0507 if (!primitiveValue) { 0508 return; 0509 } 0510 0511 svgstyle->setStrokeWidth(primitiveValue); 0512 break; 0513 } 0514 0515 case CSS_PROP_STROKE_DASHARRAY: { 0516 HANDLE_INHERIT_AND_INITIAL(strokeDashArray, StrokeDashArray) 0517 if (!primitiveValue && value && value->isValueList()) { 0518 CSSValueListImpl *dashes = static_cast<CSSValueListImpl *>(value); 0519 svgstyle->setStrokeDashArray(dashes); 0520 } 0521 break; 0522 } 0523 case CSS_PROP_STROKE_DASHOFFSET: { 0524 HANDLE_INHERIT_AND_INITIAL(strokeDashOffset, StrokeDashOffset) 0525 if (!primitiveValue) { 0526 return; 0527 } 0528 0529 svgstyle->setStrokeDashOffset(primitiveValue); 0530 break; 0531 } 0532 case CSS_PROP_FILL_OPACITY: { 0533 HANDLE_INHERIT_AND_INITIAL(fillOpacity, FillOpacity) 0534 if (!primitiveValue) { 0535 return; 0536 } 0537 0538 float f = 0.0f; 0539 int type = primitiveValue->primitiveType(); 0540 if (type == CSSPrimitiveValue::CSS_PERCENTAGE) { 0541 f = primitiveValue->floatValue() / 100.0f; 0542 } else if (type == CSSPrimitiveValue::CSS_NUMBER) { 0543 f = primitiveValue->floatValue(); 0544 } else { 0545 return; 0546 } 0547 0548 svgstyle->setFillOpacity(f); 0549 break; 0550 } 0551 case CSS_PROP_STROKE_OPACITY: { 0552 HANDLE_INHERIT_AND_INITIAL(strokeOpacity, StrokeOpacity) 0553 if (!primitiveValue) { 0554 return; 0555 } 0556 0557 float f = 0.0f; 0558 int type = primitiveValue->primitiveType(); 0559 if (type == CSSPrimitiveValue::CSS_PERCENTAGE) { 0560 f = primitiveValue->floatValue() / 100.0f; 0561 } else if (type == CSSPrimitiveValue::CSS_NUMBER) { 0562 f = primitiveValue->floatValue(); 0563 } else { 0564 return; 0565 } 0566 0567 svgstyle->setStrokeOpacity(f); 0568 break; 0569 } 0570 0571 case CSS_PROP_STOP_OPACITY: { 0572 HANDLE_INHERIT_AND_INITIAL(stopOpacity, StopOpacity) 0573 if (!primitiveValue) { 0574 return; 0575 } 0576 0577 float f = 0.0f; 0578 int type = primitiveValue->primitiveType(); 0579 if (type == CSSPrimitiveValue::CSS_PERCENTAGE) { 0580 f = primitiveValue->floatValue() / 100.0f; 0581 } else if (type == CSSPrimitiveValue::CSS_NUMBER) { 0582 f = primitiveValue->floatValue(); 0583 } else { 0584 return; 0585 } 0586 0587 svgstyle->setStopOpacity(f); 0588 break; 0589 } 0590 0591 case CSS_PROP_MARKER_START: { 0592 HANDLE_INHERIT_AND_INITIAL(startMarker, StartMarker) 0593 if (!primitiveValue) { 0594 return; 0595 } 0596 0597 String s; 0598 int type = primitiveValue->primitiveType(); 0599 if (type == CSSPrimitiveValue::CSS_URI) { 0600 s = primitiveValue->getStringValue(); 0601 } else { 0602 return; 0603 } 0604 0605 svgstyle->setStartMarker(s); 0606 break; 0607 } 0608 case CSS_PROP_MARKER_MID: { 0609 HANDLE_INHERIT_AND_INITIAL(midMarker, MidMarker) 0610 if (!primitiveValue) { 0611 return; 0612 } 0613 0614 String s; 0615 int type = primitiveValue->primitiveType(); 0616 if (type == CSSPrimitiveValue::CSS_URI) { 0617 s = primitiveValue->getStringValue(); 0618 } else { 0619 return; 0620 } 0621 0622 svgstyle->setMidMarker(s); 0623 break; 0624 } 0625 case CSS_PROP_MARKER_END: { 0626 HANDLE_INHERIT_AND_INITIAL(endMarker, EndMarker) 0627 if (!primitiveValue) { 0628 return; 0629 } 0630 0631 String s; 0632 int type = primitiveValue->primitiveType(); 0633 if (type == CSSPrimitiveValue::CSS_URI) { 0634 s = primitiveValue->getStringValue(); 0635 } else { 0636 return; 0637 } 0638 0639 svgstyle->setEndMarker(s); 0640 break; 0641 } 0642 case CSS_PROP_STROKE_LINECAP: { 0643 HANDLE_INHERIT_AND_INITIAL(capStyle, CapStyle) 0644 if (!primitiveValue) { 0645 break; 0646 } 0647 0648 switch (primitiveValue->getIdent()) { 0649 case CSS_VAL_BUTT: 0650 svgstyle->setCapStyle(ButtCap); 0651 break; 0652 case CSS_VAL_ROUND: 0653 svgstyle->setCapStyle(RoundCap); 0654 break; 0655 case CSS_VAL_SQUARE: 0656 svgstyle->setCapStyle(SquareCap); 0657 break; 0658 default: 0659 break; 0660 } 0661 break; 0662 } 0663 case CSS_PROP_STROKE_MITERLIMIT: { 0664 HANDLE_INHERIT_AND_INITIAL(strokeMiterLimit, StrokeMiterLimit) 0665 if (!primitiveValue) { 0666 return; 0667 } 0668 0669 float f = 0.0f; 0670 int type = primitiveValue->primitiveType(); 0671 if (type == CSSPrimitiveValue::CSS_NUMBER) { 0672 f = primitiveValue->floatValue(); 0673 } else { 0674 return; 0675 } 0676 0677 svgstyle->setStrokeMiterLimit(f); 0678 break; 0679 } 0680 case CSS_PROP_FILTER: { 0681 HANDLE_INHERIT_AND_INITIAL(filter, Filter) 0682 if (!primitiveValue) { 0683 return; 0684 } 0685 0686 String s; 0687 int type = primitiveValue->primitiveType(); 0688 if (type == CSSPrimitiveValue::CSS_URI) { 0689 s = primitiveValue->getStringValue(); 0690 } else { 0691 return; 0692 } 0693 svgstyle->setFilter(s); 0694 break; 0695 } 0696 case CSS_PROP_MASK: { 0697 HANDLE_INHERIT_AND_INITIAL(maskElement, MaskElement) 0698 if (!primitiveValue) { 0699 return; 0700 } 0701 0702 String s; 0703 int type = primitiveValue->primitiveType(); 0704 if (type == CSSPrimitiveValue::CSS_URI) { 0705 s = primitiveValue->getStringValue(); 0706 } else { 0707 return; 0708 } 0709 0710 svgstyle->setMaskElement(s); 0711 break; 0712 } 0713 case CSS_PROP_CLIP_PATH: { 0714 HANDLE_INHERIT_AND_INITIAL(clipPath, ClipPath) 0715 if (!primitiveValue) { 0716 return; 0717 } 0718 0719 String s; 0720 int type = primitiveValue->primitiveType(); 0721 if (type == CSSPrimitiveValue::CSS_URI) { 0722 s = primitiveValue->getStringValue(); 0723 } else { 0724 return; 0725 } 0726 0727 svgstyle->setClipPath(s); 0728 break; 0729 } 0730 0731 case CSS_PROP_TEXT_ANCHOR: { 0732 HANDLE_INHERIT_AND_INITIAL(textAnchor, TextAnchor) 0733 if (primitiveValue) { 0734 switch (primitiveValue->getIdent()) { 0735 case CSS_VAL_START: 0736 svgstyle->setTextAnchor(TA_START); 0737 break; 0738 case CSS_VAL_MIDDLE: 0739 svgstyle->setTextAnchor(TA_MIDDLE); 0740 break; 0741 case CSS_VAL_END: 0742 svgstyle->setTextAnchor(TA_END); 0743 break; 0744 } 0745 } 0746 break; 0747 } 0748 0749 case CSS_PROP_WRITING_MODE: { 0750 HANDLE_INHERIT_AND_INITIAL(writingMode, WritingMode) 0751 if (!primitiveValue) { 0752 return; 0753 } 0754 0755 switch (primitiveValue->getIdent()) { 0756 case CSS_VAL_LR_TB: 0757 svgstyle->setWritingMode(WM_LRTB); 0758 break; 0759 case CSS_VAL_LR: 0760 svgstyle->setWritingMode(WM_LR); 0761 break; 0762 case CSS_VAL_RL_TB: 0763 svgstyle->setWritingMode(WM_RLTB); 0764 break; 0765 case CSS_VAL_RL: 0766 svgstyle->setWritingMode(WM_RL); 0767 break; 0768 case CSS_VAL_TB_RL: 0769 svgstyle->setWritingMode(WM_TBRL); 0770 break; 0771 case CSS_VAL_TB: 0772 svgstyle->setWritingMode(WM_TB); 0773 break; 0774 default: 0775 break; 0776 } 0777 break; 0778 } 0779 0780 case CSS_PROP_STOP_COLOR: { 0781 HANDLE_INHERIT_AND_INITIAL(stopColor, StopColor); 0782 0783 SVGColorImpl *c = toColor(value); 0784 if (!c) { 0785 break; 0786 } 0787 0788 QColor col; 0789 if (c->colorType() == SVGColorImpl::SVG_COLORTYPE_CURRENTCOLOR) { 0790 col = style->color(); 0791 } else { 0792 col = c->color(); 0793 } 0794 0795 svgstyle->setStopColor(col); 0796 break; 0797 } 0798 0799 case CSS_PROP_LIGHTING_COLOR: { 0800 HANDLE_INHERIT_AND_INITIAL(lightingColor, LightingColor); 0801 0802 SVGColorImpl *c = toColor(value); 0803 if (!c) { 0804 break; 0805 } 0806 0807 QColor col; 0808 if (c->colorType() == SVGColorImpl::SVG_COLORTYPE_CURRENTCOLOR) { 0809 col = style->color(); 0810 } else { 0811 col = c->color(); 0812 } 0813 0814 svgstyle->setLightingColor(col); 0815 break; 0816 } 0817 case CSS_PROP_FLOOD_OPACITY: { 0818 HANDLE_INHERIT_AND_INITIAL(floodOpacity, FloodOpacity) 0819 if (!primitiveValue) { 0820 return; 0821 } 0822 0823 float f = 0.0f; 0824 int type = primitiveValue->primitiveType(); 0825 if (type == CSSPrimitiveValue::CSS_PERCENTAGE) { 0826 f = primitiveValue->floatValue() / 100.0f; 0827 } else if (type == CSSPrimitiveValue::CSS_NUMBER) { 0828 f = primitiveValue->floatValue(); 0829 } else { 0830 return; 0831 } 0832 0833 svgstyle->setFloodOpacity(f); 0834 break; 0835 } 0836 case CSS_PROP_FLOOD_COLOR: { 0837 QColor col; 0838 if (isInitial) { 0839 col = SVGRenderStyle::initialFloodColor(); 0840 } else { 0841 SVGColorImpl *c = toColor(value); 0842 if (!c) { 0843 break; 0844 } 0845 0846 if (c->colorType() == SVGColorImpl::SVG_COLORTYPE_CURRENTCOLOR) { 0847 col = style->color(); 0848 } else { 0849 col = c->color(); 0850 } 0851 } 0852 0853 svgstyle->setFloodColor(col); 0854 break; 0855 } 0856 case CSS_PROP_GLYPH_ORIENTATION_HORIZONTAL: { 0857 HANDLE_INHERIT_AND_INITIAL(glyphOrientationHorizontal, GlyphOrientationHorizontal) 0858 if (!primitiveValue) { 0859 return; 0860 } 0861 0862 if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_DEG) { 0863 int orientation = angleToGlyphOrientation(primitiveValue->floatValue()); 0864 ASSERT(orientation != -1); 0865 0866 svgstyle->setGlyphOrientationHorizontal((EGlyphOrientation) orientation); 0867 } 0868 0869 break; 0870 } 0871 case CSS_PROP_GLYPH_ORIENTATION_VERTICAL: { 0872 HANDLE_INHERIT_AND_INITIAL(glyphOrientationVertical, GlyphOrientationVertical) 0873 if (!primitiveValue) { 0874 return; 0875 } 0876 0877 if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_DEG) { 0878 int orientation = angleToGlyphOrientation(primitiveValue->floatValue()); 0879 ASSERT(orientation != -1); 0880 0881 svgstyle->setGlyphOrientationVertical((EGlyphOrientation) orientation); 0882 } else if (primitiveValue->getIdent() == CSS_VAL_AUTO) { 0883 svgstyle->setGlyphOrientationVertical(GO_AUTO); 0884 } 0885 0886 break; 0887 } 0888 case CSS_PROP_ENABLE_BACKGROUND: 0889 // Silently ignoring this property for now 0890 // https://bugs.webkit.org/show_bug.cgi?id=6022 0891 break; 0892 default: 0893 // If you crash here, it's because you added a css property and are not handling it 0894 // in either this switch statement or the one in CSSStyleSelector::applyProperty 0895 qCWarning(KHTML_LOG) << "unimplemented property" << id << getPropertyName(id).string(); 0896 return; 0897 } 0898 } 0899 0900 } 0901