Changeset 37605 in webkit
- Timestamp:
- Oct 15, 2008 10:02:02 AM (16 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r37601 r37605 1 2008-10-15 Dirk Schulze <vbs85@gmx.de> 2 3 Reviewed by Eric Seidel. 4 5 - part of https://bugs.webkit.org/show_bug.cgi?id=20543 6 Moved gradient spread method out of SVG into the GraphicsContext. 7 8 * platform/graphics/GraphicsContext.cpp: 9 (WebCore::GraphicsContext::spreadMethod): 10 (WebCore::GraphicsContext::setSpreadMethod): 11 * platform/graphics/GraphicsContext.h: 12 (WebCore::): 13 * platform/graphics/GraphicsContextPrivate.h: 14 * platform/graphics/cairo/GraphicsContextCairo.cpp: 15 (WebCore::applySpreadMethod): 16 (WebCore::GraphicsContext::fillPath): 17 (WebCore::GraphicsContext::strokePath): 18 * platform/graphics/qt/GraphicsContextQt.cpp: 19 (WebCore::applySpreadMethod): 20 (WebCore::GraphicsContext::fillPath): 21 (WebCore::GraphicsContext::strokePath): 22 * svg/GradientAttributes.h: 23 (WebCore::GradientAttributes::GradientAttributes): 24 (WebCore::GradientAttributes::spreadMethod): 25 (WebCore::GradientAttributes::setSpreadMethod): 26 * svg/SVGGradientElement.cpp: 27 (WebCore::SVGGradientElement::parseMappedAttribute): 28 * svg/SVGGradientElement.h: 29 * svg/SVGLinearGradientElement.cpp: 30 (WebCore::SVGLinearGradientElement::collectGradientProperties): 31 * svg/SVGRadialGradientElement.cpp: 32 (WebCore::SVGRadialGradientElement::collectGradientProperties): 33 * svg/graphics/SVGPaintServerGradient.cpp: 34 (WebCore::operator<<): 35 (WebCore::SVGPaintServerGradient::SVGPaintServerGradient): 36 (WebCore::SVGPaintServerGradient::spreadMethod): 37 (WebCore::SVGPaintServerGradient::setGradientSpreadMethod): 38 (WebCore::SVGPaintServerGradient::externalRepresentation): 39 * svg/graphics/SVGPaintServerGradient.h: 40 * svg/graphics/cairo/SVGPaintServerGradientCairo.cpp: 41 (WebCore::SVGPaintServerGradient::setup): 42 * svg/graphics/qt/SVGPaintServerGradientQt.cpp: 43 (WebCore::SVGPaintServerGradient::setup): 44 1 45 2008-10-09 Darin Fisher <darin@chromium.org> 2 46 -
trunk/WebCore/platform/graphics/GraphicsContext.cpp
r37456 r37605 190 190 } 191 191 192 GradientSpreadMethod GraphicsContext::spreadMethod() const 193 { 194 return m_common->state.spreadMethod; 195 } 196 197 void GraphicsContext::setSpreadMethod(GradientSpreadMethod spreadMethod) 198 { 199 m_common->state.spreadMethod = spreadMethod; 200 } 201 192 202 void GraphicsContext::setFillColor(const Color& color) 193 203 { -
trunk/WebCore/platform/graphics/GraphicsContext.h
r37456 r37605 126 126 }; 127 127 128 // FIXME: Currently these constants have to match the values used in the SVG 129 // DOM API. That's a mistake. We need to make cut that dependency. 130 enum GradientSpreadMethod { 131 SpreadMethodPad = 1, 132 SpreadMethodReflect = 2, 133 SpreadMethodRepeat = 3 134 }; 135 128 136 class GraphicsContext : Noncopyable { 129 137 public: … … 147 155 WindRule fillRule() const; 148 156 void setFillRule(WindRule); 157 GradientSpreadMethod spreadMethod() const; 158 void setSpreadMethod(GradientSpreadMethod); 149 159 Color fillColor() const; 150 160 void setFillColor(const Color&); -
trunk/WebCore/platform/graphics/GraphicsContextPrivate.h
r35998 r37605 72 72 73 73 WindRule fillRule; 74 GradientSpreadMethod spreadMethod; 74 75 ColorSpace fillColorSpace; 75 76 Color fillColor; -
trunk/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp
r37521 r37605 79 79 } 80 80 81 static inline cairo_pattern_t* applySpreadMethod(cairo_pattern_t* pattern, GradientSpreadMethod spreadMethod) 82 { 83 switch (spreadMethod) { 84 case SpreadMethodPad: 85 cairo_pattern_set_extend(pattern, CAIRO_EXTEND_PAD); 86 break; 87 case SpreadMethodReflect: 88 cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REFLECT); 89 break; 90 case SpreadMethodRepeat: 91 cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); 92 break; 93 default: 94 cairo_pattern_set_extend(pattern, CAIRO_EXTEND_NONE); 95 break; 96 } 97 return pattern; 98 } 99 81 100 GraphicsContext::GraphicsContext(PlatformGraphicsContext* cr) 82 101 : m_common(createGraphicsContextPrivate()) … … 438 457 break; 439 458 case GradientColorSpace: 440 cairo_set_source(cr, m_common->state.fillGradient.get()->platformGradient()); 459 cairo_pattern_t* pattern = m_common->state.fillGradient.get()->platformGradient(); 460 pattern = applySpreadMethod(pattern, spreadMethod()); 461 cairo_set_source(cr, pattern); 441 462 cairo_clip(cr); 442 463 cairo_paint_with_alpha(cr, m_data->globalAlpha); … … 475 496 break; 476 497 case GradientColorSpace: 477 cairo_set_source(cr, m_common->state.strokeGradient.get()->platformGradient()); 498 cairo_pattern_t* pattern = m_common->state.strokeGradient.get()->platformGradient(); 499 pattern = applySpreadMethod(pattern, spreadMethod()); 500 cairo_set_source(cr, pattern); 478 501 if (m_data->globalAlpha < 1.0f) { 479 502 cairo_push_group(cr); -
trunk/WebCore/platform/graphics/qt/GraphicsContextQt.cpp
r37456 r37605 8 8 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 9 9 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). 10 * Copyright (C) 2008 Dirk Schulze <vbs85@gmx.de> 10 11 * 11 12 * All rights reserved. … … 52 53 53 54 #include <QDebug> 55 #include <QGradient> 54 56 #include <QPainter> 55 57 #include <QPaintDevice> … … 151 153 } 152 154 155 static inline QGradient applySpreadMethod(QGradient gradient, GradientSpreadMethod spreadMethod) 156 { 157 switch (spreadMethod) { 158 case SpreadMethodPad: 159 gradient.setSpread(QGradient::PadSpread); 160 break; 161 case SpreadMethodReflect: 162 gradient.setSpread(QGradient::ReflectSpread); 163 break; 164 case SpreadMethodRepeat: 165 gradient.setSpread(QGradient::RepeatSpread); 166 break; 167 } 168 return gradient; 169 } 170 153 171 struct TransparencyLayer 154 172 { … … 520 538 break; 521 539 case GradientColorSpace: 522 p->fillPath(path, QBrush(*(m_common->state.fillGradient.get()->platformGradient()))); 540 QGradient* gradient = m_common->state.fillGradient.get()->platformGradient(); 541 *gradient = applySpreadMethod(*gradient, spreadMethod()); 542 p->fillPath(path, QBrush(*gradient)); 523 543 break; 524 544 } … … 546 566 } 547 567 case GradientColorSpace: { 548 pen.setBrush(QBrush(*(m_common->state.strokeGradient.get()->platformGradient()))); 568 QGradient* gradient = m_common->state.strokeGradient.get()->platformGradient(); 569 *gradient = applySpreadMethod(*gradient, spreadMethod()); 570 pen.setBrush(QBrush(*gradient)); 549 571 p->setPen(pen); 550 572 p->strokePath(path, pen); -
trunk/WebCore/svg/GradientAttributes.h
r29663 r37605 29 29 struct GradientAttributes { 30 30 GradientAttributes() 31 : m_spreadMethod(S PREADMETHOD_PAD)31 : m_spreadMethod(SpreadMethodPad) 32 32 , m_boundingBoxMode(true) 33 33 , m_spreadMethodSet(false) … … 38 38 } 39 39 40 SVGGradientSpreadMethod spreadMethod() const { return m_spreadMethod; }40 GradientSpreadMethod spreadMethod() const { return m_spreadMethod; } 41 41 bool boundingBoxMode() const { return m_boundingBoxMode; } 42 42 AffineTransform gradientTransform() const { return m_gradientTransform; } 43 43 const Vector<SVGGradientStop>& stops() const { return m_stops; } 44 44 45 void setSpreadMethod( SVGGradientSpreadMethod value) { m_spreadMethod = value; m_spreadMethodSet = true; }45 void setSpreadMethod(GradientSpreadMethod value) { m_spreadMethod = value; m_spreadMethodSet = true; } 46 46 void setBoundingBoxMode(bool value) { m_boundingBoxMode = value; m_boundingBoxModeSet = true; } 47 47 void setGradientTransform(const AffineTransform& value) { m_gradientTransform = value; m_gradientTransformSet = true; } … … 55 55 private: 56 56 // Properties 57 SVGGradientSpreadMethod m_spreadMethod;57 GradientSpreadMethod m_spreadMethod; 58 58 bool m_boundingBoxMode; 59 59 AffineTransform m_gradientTransform; -
trunk/WebCore/svg/SVGGradientElement.cpp
r35248 r37605 70 70 } else if (attr->name() == SVGNames::spreadMethodAttr) { 71 71 if (attr->value() == "reflect") 72 setSpreadMethodBaseValue(S VG_SPREADMETHOD_REFLECT);72 setSpreadMethodBaseValue(SpreadMethodReflect); 73 73 else if (attr->value() == "repeat") 74 setSpreadMethodBaseValue(S VG_SPREADMETHOD_REPEAT);74 setSpreadMethodBaseValue(SpreadMethodRepeat); 75 75 else if (attr->value() == "pad") 76 setSpreadMethodBaseValue(S VG_SPREADMETHOD_PAD);76 setSpreadMethodBaseValue(SpreadMethodPad); 77 77 } else { 78 78 if (SVGURIReference::parseMappedAttribute(attr)) -
trunk/WebCore/svg/SVGGradientElement.h
r35248 r37605 39 39 public SVGExternalResourcesRequired { 40 40 public: 41 enum SVGGradientType {42 SVG_SPREADMETHOD_UNKNOWN = 0,43 SVG_SPREADMETHOD_PAD = 1,44 SVG_SPREADMETHOD_REFLECT = 2,45 SVG_SPREADMETHOD_REPEAT = 346 };47 48 41 SVGGradientElement(const QualifiedName&, Document*); 49 42 virtual ~SVGGradientElement(); -
trunk/WebCore/svg/SVGLinearGradientElement.cpp
r36700 r37605 106 106 while (current) { 107 107 if (!attributes.hasSpreadMethod() && current->hasAttribute(SVGNames::spreadMethodAttr)) 108 attributes.setSpreadMethod(( SVGGradientSpreadMethod) current->spreadMethod());108 attributes.setSpreadMethod((GradientSpreadMethod) current->spreadMethod()); 109 109 110 110 if (!attributes.hasBoundingBoxMode() && current->hasAttribute(SVGNames::gradientUnitsAttr)) -
trunk/WebCore/svg/SVGRadialGradientElement.cpp
r35248 r37605 115 115 while (current) { 116 116 if (!attributes.hasSpreadMethod() && current->hasAttribute(SVGNames::spreadMethodAttr)) 117 attributes.setSpreadMethod(( SVGGradientSpreadMethod) current->spreadMethod());117 attributes.setSpreadMethod((GradientSpreadMethod) current->spreadMethod()); 118 118 119 119 if (!attributes.hasBoundingBoxMode() && current->hasAttribute(SVGNames::gradientUnitsAttr)) -
trunk/WebCore/svg/graphics/SVGPaintServerGradient.cpp
r29663 r37605 34 34 namespace WebCore { 35 35 36 TextStream& operator<<(TextStream& ts, SVGGradientSpreadMethod m)36 TextStream& operator<<(TextStream& ts, GradientSpreadMethod m) 37 37 { 38 38 switch (m) { 39 case S PREADMETHOD_PAD:39 case SpreadMethodPad: 40 40 ts << "PAD"; break; 41 case S PREADMETHOD_REPEAT:41 case SpreadMethodRepeat: 42 42 ts << "REPEAT"; break; 43 case S PREADMETHOD_REFLECT:43 case SpreadMethodReflect: 44 44 ts << "REFLECT"; break; 45 45 } … … 61 61 62 62 SVGPaintServerGradient::SVGPaintServerGradient(const SVGGradientElement* owner) 63 : m_spreadMethod(S PREADMETHOD_PAD)63 : m_spreadMethod(SpreadMethodPad) 64 64 , m_boundingBoxMode(true) 65 65 , m_ownerElement(owner) … … 92 92 } 93 93 94 SVGGradientSpreadMethod SVGPaintServerGradient::spreadMethod() const94 GradientSpreadMethod SVGPaintServerGradient::spreadMethod() const 95 95 { 96 96 return m_spreadMethod; 97 97 } 98 98 99 void SVGPaintServerGradient::setGradientSpreadMethod(const SVGGradientSpreadMethod& method)99 void SVGPaintServerGradient::setGradientSpreadMethod(const GradientSpreadMethod& method) 100 100 { 101 101 m_spreadMethod = method; … … 129 129 // abstract, don't stream type 130 130 ts << "[stops=" << gradientStops() << "]"; 131 if (spreadMethod() != S PREADMETHOD_PAD)131 if (spreadMethod() != SpreadMethodPad) 132 132 ts << "[method=" << spreadMethod() << "]"; 133 133 if (!boundingBoxMode()) -
trunk/WebCore/svg/graphics/SVGPaintServerGradient.h
r31899 r37605 31 31 #include "AffineTransform.h" 32 32 #include "Color.h" 33 #include "GraphicsContext.h" 33 34 #include "SVGPaintServer.h" 34 35 … … 48 49 class SVGGradientElement; 49 50 50 // FIXME: Remove the spread method enum in SVGGradientElement51 enum SVGGradientSpreadMethod {52 SPREADMETHOD_PAD = 1,53 SPREADMETHOD_REFLECT = 2,54 SPREADMETHOD_REPEAT = 355 };56 57 51 #if PLATFORM(CG) 58 52 typedef std::pair<CGFloat, Color> SVGGradientStop; … … 60 54 typedef std::pair<float, Color> SVGGradientStop; 61 55 #endif 62 63 56 64 57 class SVGPaintServerGradient : public SVGPaintServer { … … 69 62 void setGradientStops(const Vector<SVGGradientStop>&); 70 63 71 SVGGradientSpreadMethod spreadMethod() const;72 void setGradientSpreadMethod(const SVGGradientSpreadMethod&);64 GradientSpreadMethod spreadMethod() const; 65 void setGradientSpreadMethod(const GradientSpreadMethod&); 73 66 74 67 // Gradient start and end points are percentages when used in boundingBox mode. … … 107 100 private: 108 101 Vector<SVGGradientStop> m_stops; 109 SVGGradientSpreadMethod m_spreadMethod;102 GradientSpreadMethod m_spreadMethod; 110 103 bool m_boundingBoxMode; 111 104 AffineTransform m_gradientTransform; -
trunk/WebCore/svg/graphics/cairo/SVGPaintServerGradientCairo.cpp
r36737 r37605 115 115 116 116 switch (spreadMethod()) { 117 case S PREADMETHOD_PAD:117 case SpreadMethodPad: 118 118 cairo_pattern_set_extend(pattern, CAIRO_EXTEND_PAD); 119 119 break; 120 case S PREADMETHOD_REFLECT:120 case SpreadMethodReflect: 121 121 cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REFLECT); 122 122 break; 123 case S PREADMETHOD_REPEAT:123 case SpreadMethodRepeat: 124 124 cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); 125 125 break; -
trunk/WebCore/svg/graphics/qt/SVGPaintServerGradientQt.cpp
r36737 r37605 71 71 painter->setBrush(Qt::NoBrush); 72 72 73 if (spreadMethod() == S PREADMETHOD_REPEAT)73 if (spreadMethod() == SpreadMethodRepeat) 74 74 gradient.setSpread(QGradient::RepeatSpread); 75 else if (spreadMethod() == S PREADMETHOD_REFLECT)75 else if (spreadMethod() == SpreadMethodReflect) 76 76 gradient.setSpread(QGradient::ReflectSpread); 77 77 else
Note: See TracChangeset
for help on using the changeset viewer.