Gradient.h revision 7fb1198349cf58688611c0b98189560871faa49f
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 PLATFORM(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 PLATFORM(CAIRO)
58typedef struct _cairo_pattern cairo_pattern_t;
59typedef cairo_pattern_t* PlatformGradient;
60#elif USE(SKIA)
61#if PLATFORM(ANDROID)
62#include "SkShader.h"
63typedef class PlatformGradientRec* PlatformGradient;
64#else
65class SkShader;
66typedef class SkShader* PlatformGradient;
67typedef class SkShader* PlatformPattern;
68#endif
69#elif PLATFORM(HAIKU)
70class BGradient;
71typedef BGradient* PlatformGradient;
72#else
73typedef void* PlatformGradient;
74#endif
75
76namespace WebCore {
77
78    class Color;
79
80    class Gradient : public Generator {
81    public:
82        static PassRefPtr<Gradient> create(const FloatPoint& p0, const FloatPoint& p1)
83        {
84            return adoptRef(new Gradient(p0, p1));
85        }
86        static PassRefPtr<Gradient> create(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio = 1)
87        {
88            return adoptRef(new Gradient(p0, r0, p1, r1, aspectRatio));
89        }
90        virtual ~Gradient();
91
92        struct ColorStop;
93        void addColorStop(const ColorStop&);
94        void addColorStop(float, const Color&);
95
96        void getColor(float value, float* r, float* g, float* b, float* a) const;
97        bool hasAlpha() const;
98
99        bool isRadial() const { return m_radial; }
100        bool isZeroSize() const { return m_p0.x() == m_p1.x() && m_p0.y() == m_p1.y() && (!m_radial || m_r0 == m_r1); }
101
102        const FloatPoint& p0() const { return m_p0; }
103        const FloatPoint& p1() const { return m_p1; }
104
105        void setP0(const FloatPoint& p) { m_p0 = p; }
106        void setP1(const FloatPoint& p) { m_p1 = p; }
107
108        float startRadius() const { return m_r0; }
109        float endRadius() const { return m_r1; }
110
111        void setStartRadius(float r) { m_r0 = r; }
112        void setEndRadius(float r) { m_r1 = r; }
113
114        float aspectRatio() const { return m_aspectRatio; }
115
116#if OS(WINCE) && !PLATFORM(QT)
117        const Vector<ColorStop, 2>& getStops() const;
118#else
119#if PLATFORM(ANDROID)
120        SkShader* getShader(SkShader::TileMode);
121#endif
122        PlatformGradient platformGradient();
123#endif
124
125        struct ColorStop {
126            float stop;
127            float red;
128            float green;
129            float blue;
130            float alpha;
131
132            ColorStop() : stop(0), red(0), green(0), blue(0), alpha(0) { }
133            ColorStop(float s, float r, float g, float b, float a) : stop(s), red(r), green(g), blue(b), alpha(a) { }
134        };
135
136        void setStopsSorted(bool s) { m_stopsSorted = s; }
137
138        void setSpreadMethod(GradientSpreadMethod);
139        GradientSpreadMethod spreadMethod() { return m_spreadMethod; }
140        void setGradientSpaceTransform(const AffineTransform& gradientSpaceTransformation);
141        // Qt and CG transform the gradient at draw time
142        AffineTransform gradientSpaceTransform() { return m_gradientSpaceTransformation; }
143
144        virtual void fill(GraphicsContext*, const FloatRect&);
145        virtual void adjustParametersForTiledDrawing(IntSize& size, FloatRect& srcRect);
146
147        void setPlatformGradientSpaceTransform(const AffineTransform& gradientSpaceTransformation);
148
149#if PLATFORM(CG)
150        void paint(CGContextRef);
151        void paint(GraphicsContext*);
152#endif
153
154    private:
155        Gradient(const FloatPoint& p0, const FloatPoint& p1);
156        Gradient(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio);
157
158        void platformInit() { m_gradient = 0; }
159        void platformDestroy();
160
161        int findStop(float value) const;
162        void sortStopsIfNecessary();
163
164        bool m_radial;
165        FloatPoint m_p0;
166        FloatPoint m_p1;
167        float m_r0;
168        float m_r1;
169        float m_aspectRatio; // For elliptical gradient, width / height.
170        mutable Vector<ColorStop, 2> m_stops;
171        mutable bool m_stopsSorted;
172        mutable int m_lastStop;
173        GradientSpreadMethod m_spreadMethod;
174        AffineTransform m_gradientSpaceTransformation;
175
176        PlatformGradient m_gradient;
177    };
178
179} //namespace
180
181#endif
182