Home | History | Annotate | Download | only in css
      1 /*
      2  * Copyright (C) 2008 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef CSSGradientValue_h
     27 #define CSSGradientValue_h
     28 
     29 #include "CSSImageGeneratorValue.h"
     30 #include "CSSPrimitiveValue.h"
     31 #include <wtf/RefPtr.h>
     32 #include <wtf/Vector.h>
     33 
     34 namespace WebCore {
     35 
     36 class FloatPoint;
     37 class Gradient;
     38 
     39 enum CSSGradientType { CSSLinearGradient, CSSRadialGradient };
     40 
     41 struct CSSGradientColorStop {
     42     CSSGradientColorStop()
     43         : m_stop(0)
     44     {
     45     }
     46 
     47     float m_stop;
     48     RefPtr<CSSPrimitiveValue> m_color;
     49 };
     50 
     51 class CSSGradientValue : public CSSImageGeneratorValue {
     52 public:
     53     static PassRefPtr<CSSGradientValue> create()
     54     {
     55         return adoptRef(new CSSGradientValue);
     56     }
     57 
     58     virtual String cssText() const;
     59 
     60     virtual Image* image(RenderObject*, const IntSize&);
     61 
     62     CSSGradientType type() const { return m_type; }
     63     void setType(CSSGradientType type) { m_type = type; }
     64 
     65     void setFirstX(PassRefPtr<CSSPrimitiveValue> val) { m_firstX = val; }
     66     void setFirstY(PassRefPtr<CSSPrimitiveValue> val) { m_firstY = val; }
     67     void setSecondX(PassRefPtr<CSSPrimitiveValue> val) { m_secondX = val; }
     68     void setSecondY(PassRefPtr<CSSPrimitiveValue> val) { m_secondY = val; }
     69 
     70     void setFirstRadius(PassRefPtr<CSSPrimitiveValue> val) { m_firstRadius = val; }
     71     void setSecondRadius(PassRefPtr<CSSPrimitiveValue> val) { m_secondRadius = val; }
     72 
     73     void addStop(const CSSGradientColorStop& stop) { m_stops.append(stop); }
     74 
     75     void sortStopsIfNeeded();
     76 
     77 private:
     78     CSSGradientValue()
     79         : m_type(CSSLinearGradient)
     80         , m_stopsSorted(false)
     81     {
     82     }
     83 
     84     // Create the gradient for a given size.
     85     PassRefPtr<Gradient> createGradient(RenderObject*, const IntSize&);
     86 
     87     // Resolve points/radii to front end values.
     88     FloatPoint resolvePoint(CSSPrimitiveValue*, CSSPrimitiveValue*, const IntSize&, float zoomFactor);
     89     float resolveRadius(CSSPrimitiveValue*, float zoomFactor);
     90 
     91     // Type
     92     CSSGradientType m_type;
     93 
     94     // Points
     95     RefPtr<CSSPrimitiveValue> m_firstX;
     96     RefPtr<CSSPrimitiveValue> m_firstY;
     97 
     98     RefPtr<CSSPrimitiveValue> m_secondX;
     99     RefPtr<CSSPrimitiveValue> m_secondY;
    100 
    101     // Radii (for radial gradients only)
    102     RefPtr<CSSPrimitiveValue> m_firstRadius;
    103     RefPtr<CSSPrimitiveValue> m_secondRadius;
    104 
    105     // Stops
    106     Vector<CSSGradientColorStop> m_stops;
    107     bool m_stopsSorted;
    108 };
    109 
    110 } // namespace WebCore
    111 
    112 #endif // CSSGradientValue_h
    113