Changeset 37605 in webkit


Ignore:
Timestamp:
Oct 15, 2008 10:02:02 AM (16 years ago)
Author:
Darin Adler
Message:

2008-10-15 Dirk Schulze <vbs85@gmx.de>

Reviewed by Eric Seidel.

  • platform/graphics/GraphicsContext.cpp: (WebCore::GraphicsContext::spreadMethod): (WebCore::GraphicsContext::setSpreadMethod):
  • platform/graphics/GraphicsContext.h: (WebCore::):
  • platform/graphics/GraphicsContextPrivate.h:
  • platform/graphics/cairo/GraphicsContextCairo.cpp: (WebCore::applySpreadMethod): (WebCore::GraphicsContext::fillPath): (WebCore::GraphicsContext::strokePath):
  • platform/graphics/qt/GraphicsContextQt.cpp: (WebCore::applySpreadMethod): (WebCore::GraphicsContext::fillPath): (WebCore::GraphicsContext::strokePath):
  • svg/GradientAttributes.h: (WebCore::GradientAttributes::GradientAttributes): (WebCore::GradientAttributes::spreadMethod): (WebCore::GradientAttributes::setSpreadMethod):
  • svg/SVGGradientElement.cpp: (WebCore::SVGGradientElement::parseMappedAttribute):
  • svg/SVGGradientElement.h:
  • svg/SVGLinearGradientElement.cpp: (WebCore::SVGLinearGradientElement::collectGradientProperties):
  • svg/SVGRadialGradientElement.cpp: (WebCore::SVGRadialGradientElement::collectGradientProperties):
  • svg/graphics/SVGPaintServerGradient.cpp: (WebCore::operator<<): (WebCore::SVGPaintServerGradient::SVGPaintServerGradient): (WebCore::SVGPaintServerGradient::spreadMethod): (WebCore::SVGPaintServerGradient::setGradientSpreadMethod): (WebCore::SVGPaintServerGradient::externalRepresentation):
  • svg/graphics/SVGPaintServerGradient.h:
  • svg/graphics/cairo/SVGPaintServerGradientCairo.cpp: (WebCore::SVGPaintServerGradient::setup):
  • svg/graphics/qt/SVGPaintServerGradientQt.cpp: (WebCore::SVGPaintServerGradient::setup):
Location:
trunk/WebCore
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r37601 r37605  
     12008-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
    1452008-10-09  Darin Fisher  <darin@chromium.org>
    246
  • trunk/WebCore/platform/graphics/GraphicsContext.cpp

    r37456 r37605  
    190190}
    191191
     192GradientSpreadMethod GraphicsContext::spreadMethod() const
     193{
     194    return m_common->state.spreadMethod;
     195}
     196
     197void GraphicsContext::setSpreadMethod(GradientSpreadMethod spreadMethod)
     198{
     199    m_common->state.spreadMethod = spreadMethod;
     200}
     201
    192202void GraphicsContext::setFillColor(const Color& color)
    193203{
  • trunk/WebCore/platform/graphics/GraphicsContext.h

    r37456 r37605  
    126126    };
    127127
     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
    128136    class GraphicsContext : Noncopyable {
    129137    public:
     
    147155        WindRule fillRule() const;
    148156        void setFillRule(WindRule);
     157        GradientSpreadMethod spreadMethod() const;
     158        void setSpreadMethod(GradientSpreadMethod);
    149159        Color fillColor() const;
    150160        void setFillColor(const Color&);
  • trunk/WebCore/platform/graphics/GraphicsContextPrivate.h

    r35998 r37605  
    7272       
    7373        WindRule fillRule;
     74        GradientSpreadMethod spreadMethod;
    7475        ColorSpace fillColorSpace;
    7576        Color fillColor;
  • trunk/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp

    r37521 r37605  
    7979}
    8080
     81static 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
    81100GraphicsContext::GraphicsContext(PlatformGraphicsContext* cr)
    82101    : m_common(createGraphicsContextPrivate())
     
    438457        break;
    439458    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);
    441462        cairo_clip(cr);
    442463        cairo_paint_with_alpha(cr, m_data->globalAlpha);
     
    475496        break;
    476497    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);
    478501        if (m_data->globalAlpha < 1.0f) {
    479502            cairo_push_group(cr);
  • trunk/WebCore/platform/graphics/qt/GraphicsContextQt.cpp

    r37456 r37605  
    88 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
    99 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
     10 * Copyright (C) 2008 Dirk Schulze <vbs85@gmx.de>
    1011 *
    1112 * All rights reserved.
     
    5253
    5354#include <QDebug>
     55#include <QGradient>
    5456#include <QPainter>
    5557#include <QPaintDevice>
     
    151153}
    152154
     155static 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
    153171struct TransparencyLayer
    154172{
     
    520538        break;
    521539    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));
    523543        break;
    524544    }
     
    546566    }
    547567    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));
    549571        p->setPen(pen);
    550572        p->strokePath(path, pen);
  • trunk/WebCore/svg/GradientAttributes.h

    r29663 r37605  
    2929    struct GradientAttributes {
    3030        GradientAttributes()
    31             : m_spreadMethod(SPREADMETHOD_PAD)
     31            : m_spreadMethod(SpreadMethodPad)
    3232            , m_boundingBoxMode(true)
    3333            , m_spreadMethodSet(false)
     
    3838        }
    3939
    40         SVGGradientSpreadMethod spreadMethod() const { return m_spreadMethod; }
     40        GradientSpreadMethod spreadMethod() const { return m_spreadMethod; }
    4141        bool boundingBoxMode() const { return m_boundingBoxMode; }
    4242        AffineTransform gradientTransform() const { return m_gradientTransform; }
    4343        const Vector<SVGGradientStop>& stops() const { return m_stops; }
    4444
    45         void setSpreadMethod(SVGGradientSpreadMethod value) { m_spreadMethod = value; m_spreadMethodSet = true; }
     45        void setSpreadMethod(GradientSpreadMethod value) { m_spreadMethod = value; m_spreadMethodSet = true; }
    4646        void setBoundingBoxMode(bool value) { m_boundingBoxMode = value; m_boundingBoxModeSet = true; }
    4747        void setGradientTransform(const AffineTransform& value) { m_gradientTransform = value; m_gradientTransformSet = true; }
     
    5555    private:
    5656        // Properties
    57         SVGGradientSpreadMethod m_spreadMethod;
     57        GradientSpreadMethod m_spreadMethod;
    5858        bool m_boundingBoxMode;
    5959        AffineTransform m_gradientTransform;
  • trunk/WebCore/svg/SVGGradientElement.cpp

    r35248 r37605  
    7070    } else if (attr->name() == SVGNames::spreadMethodAttr) {
    7171        if (attr->value() == "reflect")
    72             setSpreadMethodBaseValue(SVG_SPREADMETHOD_REFLECT);
     72            setSpreadMethodBaseValue(SpreadMethodReflect);
    7373        else if (attr->value() == "repeat")
    74             setSpreadMethodBaseValue(SVG_SPREADMETHOD_REPEAT);
     74            setSpreadMethodBaseValue(SpreadMethodRepeat);
    7575        else if (attr->value() == "pad")
    76             setSpreadMethodBaseValue(SVG_SPREADMETHOD_PAD);
     76            setSpreadMethodBaseValue(SpreadMethodPad);
    7777    } else {
    7878        if (SVGURIReference::parseMappedAttribute(attr))
  • trunk/WebCore/svg/SVGGradientElement.h

    r35248 r37605  
    3939                               public SVGExternalResourcesRequired {
    4040    public:
    41         enum SVGGradientType {
    42             SVG_SPREADMETHOD_UNKNOWN = 0,
    43             SVG_SPREADMETHOD_PAD     = 1,
    44             SVG_SPREADMETHOD_REFLECT = 2,
    45             SVG_SPREADMETHOD_REPEAT  = 3
    46         };
    47 
    4841        SVGGradientElement(const QualifiedName&, Document*);
    4942        virtual ~SVGGradientElement();
  • trunk/WebCore/svg/SVGLinearGradientElement.cpp

    r36700 r37605  
    106106    while (current) {
    107107        if (!attributes.hasSpreadMethod() && current->hasAttribute(SVGNames::spreadMethodAttr))
    108             attributes.setSpreadMethod((SVGGradientSpreadMethod) current->spreadMethod());
     108            attributes.setSpreadMethod((GradientSpreadMethod) current->spreadMethod());
    109109
    110110        if (!attributes.hasBoundingBoxMode() && current->hasAttribute(SVGNames::gradientUnitsAttr))
  • trunk/WebCore/svg/SVGRadialGradientElement.cpp

    r35248 r37605  
    115115    while (current) {
    116116        if (!attributes.hasSpreadMethod() && current->hasAttribute(SVGNames::spreadMethodAttr))
    117             attributes.setSpreadMethod((SVGGradientSpreadMethod) current->spreadMethod());
     117            attributes.setSpreadMethod((GradientSpreadMethod) current->spreadMethod());
    118118
    119119        if (!attributes.hasBoundingBoxMode() && current->hasAttribute(SVGNames::gradientUnitsAttr))
  • trunk/WebCore/svg/graphics/SVGPaintServerGradient.cpp

    r29663 r37605  
    3434namespace WebCore {
    3535
    36 TextStream& operator<<(TextStream& ts, SVGGradientSpreadMethod m)
     36TextStream& operator<<(TextStream& ts, GradientSpreadMethod m)
    3737{
    3838    switch (m) {
    39         case SPREADMETHOD_PAD:
     39        case SpreadMethodPad:
    4040            ts << "PAD"; break;
    41         case SPREADMETHOD_REPEAT:
     41        case SpreadMethodRepeat:
    4242            ts << "REPEAT"; break;
    43         case SPREADMETHOD_REFLECT:
     43        case SpreadMethodReflect:
    4444            ts << "REFLECT"; break;
    4545    }
     
    6161
    6262SVGPaintServerGradient::SVGPaintServerGradient(const SVGGradientElement* owner)
    63     : m_spreadMethod(SPREADMETHOD_PAD)
     63    : m_spreadMethod(SpreadMethodPad)
    6464    , m_boundingBoxMode(true)
    6565    , m_ownerElement(owner)
     
    9292}
    9393
    94 SVGGradientSpreadMethod SVGPaintServerGradient::spreadMethod() const
     94GradientSpreadMethod SVGPaintServerGradient::spreadMethod() const
    9595{
    9696    return m_spreadMethod;
    9797}
    9898
    99 void SVGPaintServerGradient::setGradientSpreadMethod(const SVGGradientSpreadMethod& method)
     99void SVGPaintServerGradient::setGradientSpreadMethod(const GradientSpreadMethod& method)
    100100{
    101101    m_spreadMethod = method;
     
    129129    // abstract, don't stream type
    130130    ts  << "[stops=" << gradientStops() << "]";
    131     if (spreadMethod() != SPREADMETHOD_PAD)
     131    if (spreadMethod() != SpreadMethodPad)
    132132        ts << "[method=" << spreadMethod() << "]";
    133133    if (!boundingBoxMode())
  • trunk/WebCore/svg/graphics/SVGPaintServerGradient.h

    r31899 r37605  
    3131#include "AffineTransform.h"
    3232#include "Color.h"
     33#include "GraphicsContext.h"
    3334#include "SVGPaintServer.h"
    3435
     
    4849    class SVGGradientElement;
    4950
    50     // FIXME: Remove the spread method enum in SVGGradientElement
    51     enum SVGGradientSpreadMethod {
    52         SPREADMETHOD_PAD = 1,
    53         SPREADMETHOD_REFLECT = 2,
    54         SPREADMETHOD_REPEAT = 3
    55     };
    56 
    5751#if PLATFORM(CG)
    5852    typedef std::pair<CGFloat, Color> SVGGradientStop;
     
    6054    typedef std::pair<float, Color> SVGGradientStop;
    6155#endif
    62 
    6356
    6457    class SVGPaintServerGradient : public SVGPaintServer {
     
    6962        void setGradientStops(const Vector<SVGGradientStop>&);
    7063
    71         SVGGradientSpreadMethod spreadMethod() const;
    72         void setGradientSpreadMethod(const SVGGradientSpreadMethod&);
     64        GradientSpreadMethod spreadMethod() const;
     65        void setGradientSpreadMethod(const GradientSpreadMethod&);
    7366
    7467        // Gradient start and end points are percentages when used in boundingBox mode.
     
    107100    private:
    108101        Vector<SVGGradientStop> m_stops;
    109         SVGGradientSpreadMethod m_spreadMethod;
     102        GradientSpreadMethod m_spreadMethod;
    110103        bool m_boundingBoxMode;
    111104        AffineTransform m_gradientTransform;
  • trunk/WebCore/svg/graphics/cairo/SVGPaintServerGradientCairo.cpp

    r36737 r37605  
    115115
    116116    switch (spreadMethod()) {
    117         case SPREADMETHOD_PAD:
     117        case SpreadMethodPad:
    118118            cairo_pattern_set_extend(pattern, CAIRO_EXTEND_PAD);
    119119            break;
    120         case SPREADMETHOD_REFLECT:
     120        case SpreadMethodReflect:
    121121            cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REFLECT);
    122122            break;
    123         case SPREADMETHOD_REPEAT:
     123        case SpreadMethodRepeat:
    124124            cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT);
    125125            break;
  • trunk/WebCore/svg/graphics/qt/SVGPaintServerGradientQt.cpp

    r36737 r37605  
    7171    painter->setBrush(Qt::NoBrush);
    7272
    73     if (spreadMethod() == SPREADMETHOD_REPEAT)
     73    if (spreadMethod() == SpreadMethodRepeat)
    7474        gradient.setSpread(QGradient::RepeatSpread);
    75     else if (spreadMethod() == SPREADMETHOD_REFLECT)
     75    else if (spreadMethod() == SpreadMethodReflect)
    7676        gradient.setSpread(QGradient::ReflectSpread);
    7777    else
Note: See TracChangeset for help on using the changeset viewer.