Gradient.h revision 5fc5e1f3883ecadd4fd00df28225a17d7d3a37e9
1/*
2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved.
3 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
4 * Copyright (C) 2008 Torch Mobile, Inc.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#ifndef Gradient_h
29#define Gradient_h
30
31#include "AffineTransform.h"
32#include "FloatPoint.h"
33#include "Generator.h"
34#include "GraphicsTypes.h"
35#include <wtf/PassRefPtr.h>
36#include <wtf/Vector.h>
37
38#if USE(CG)
39
40typedef struct CGContext* CGContextRef;
41
42#define USE_CG_SHADING defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD)
43
44#if USE_CG_SHADING
45typedef struct CGShading* CGShadingRef;
46typedef CGShadingRef PlatformGradient;
47#else
48typedef struct CGGradient* CGGradientRef;
49typedef CGGradientRef PlatformGradient;
50#endif
51
52#elif PLATFORM(QT)
53QT_BEGIN_NAMESPACE
54class QGradient;
55QT_END_NAMESPACE
56typedef QGradient* PlatformGradient;
57#elif USE(CAIRO)
58typedef struct _cairo_pattern cairo_pattern_t;
59typedef cairo_pattern_t* PlatformGradient;
60#elif USE(SKIA)
61class SkShader;
62typedef class SkShader* PlatformGradient;
63typedef class SkShader* PlatformPattern;
64#elif PLATFORM(HAIKU)
65class BGradient;
66typedef BGradient* PlatformGradient;
67#else
68typedef void* PlatformGradient;
69#endif
70
71namespace WebCore {
72
73    class Color;
74
75    class Gradient : public Generator {
76    public:
77        static PassRefPtr<Gradient> create(const FloatPoint& p0, const FloatPoint& p1)
78        {
79            return adoptRef(new Gradient(p0, p1));
80        }
81        static PassRefPtr<Gradient> create(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio = 1)
82        {
83            return adoptRef(new Gradient(p0, r0, p1, r1, aspectRatio));
84        }
85        virtual ~Gradient();
86
87        struct ColorStop;
88        void addColorStop(const ColorStop&);
89        void addColorStop(float, const Color&);
90
91        void getColor(float value, float* r, float* g, float* b, float* a) const;
92        bool hasAlpha() const;
93
94        bool isRadial() const { return m_radial; }
95        bool isZeroSize() const { return m_p0.x() == m_p1.x() && m_p0.y() == m_p1.y() && (!m_radial || m_r0 == m_r1); }
96
97        const FloatPoint& p0() const { return m_p0; }
98        const FloatPoint& p1() const { return m_p1; }
99
100        void setP0(const FloatPoint& p) { m_p0 = p; }
101        void setP1(const FloatPoint& p) { m_p1 = p; }
102
103        float startRadius() const { return m_r0; }
104        float endRadius() const { return m_r1; }
105
106        void setStartRadius(float r) { m_r0 = r; }
107        void setEndRadius(float r) { m_r1 = r; }
108
109        float aspectRatio() const { return m_aspectRatio; }
110
111#if OS(WINCE) && !PLATFORM(QT)
112        const Vector<ColorStop, 2>& getStops() const;
113#else
114        PlatformGradient platformGradient();
115#endif
116
117        struct ColorStop {
118            float stop;
119            float red;
120            float green;
121            float blue;
122            float alpha;
123
124            ColorStop() : stop(0), red(0), green(0), blue(0), alpha(0) { }
125            ColorStop(float s, float r, float g, float b, float a) : stop(s), red(r), green(g), blue(b), alpha(a) { }
126        };
127
128        void setStopsSorted(bool s) { m_stopsSorted = s; }
129
130        void setSpreadMethod(GradientSpreadMethod);
131        GradientSpreadMethod spreadMethod() { return m_spreadMethod; }
132        void setGradientSpaceTransform(const AffineTransform& gradientSpaceTransformation);
133        // Qt and CG transform the gradient at draw time
134        AffineTransform gradientSpaceTransform() { return m_gradientSpaceTransformation; }
135
136        virtual void fill(GraphicsContext*, const FloatRect&);
137        virtual void adjustParametersForTiledDrawing(IntSize& size, FloatRect& srcRect);
138
139        void setPlatformGradientSpaceTransform(const AffineTransform& gradientSpaceTransformation);
140
141#if USE(CG)
142        void paint(CGContextRef);
143        void paint(GraphicsContext*);
144#endif
145
146    private:
147        Gradient(const FloatPoint& p0, const FloatPoint& p1);
148        Gradient(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio);
149
150        void platformInit() { m_gradient = 0; }
151        void platformDestroy();
152
153        int findStop(float value) const;
154        void sortStopsIfNecessary();
155
156        bool m_radial;
157        FloatPoint m_p0;
158        FloatPoint m_p1;
159        float m_r0;
160        float m_r1;
161        float m_aspectRatio; // For elliptical gradient, width / height.
162        mutable Vector<ColorStop, 2> m_stops;
163        mutable bool m_stopsSorted;
164        mutable int m_lastStop;
165        GradientSpreadMethod m_spreadMethod;
166        AffineTransform m_gradientSpaceTransformation;
167
168        PlatformGradient m_gradient;
169    };
170
171} //namespace
172
173#endif
174