• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
3  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 #ifndef Gradient_h
28 #define Gradient_h
29 
30 #include "FloatPoint.h"
31 #include "Generator.h"
32 #include <wtf/PassRefPtr.h>
33 #include <wtf/Vector.h>
34 
35 #if PLATFORM(CG)
36 typedef struct CGShading* CGShadingRef;
37 typedef CGShadingRef PlatformGradient;
38 #elif PLATFORM(QT)
39 QT_BEGIN_NAMESPACE
40 class QGradient;
41 QT_END_NAMESPACE
42 typedef QGradient* PlatformGradient;
43 #elif PLATFORM(CAIRO)
44 typedef struct _cairo_pattern cairo_pattern_t;
45 typedef cairo_pattern_t* PlatformGradient;
46 #elif PLATFORM(SGL)
47 #include "SkShader.h"
48 typedef class PlatformGradientRec* PlatformGradient;
49 #elif PLATFORM(SKIA)
50 class SkShader;
51 typedef class SkShader* PlatformGradient;
52 typedef class SkShader* PlatformPattern;
53 #else
54 typedef void* PlatformGradient;
55 #endif
56 
57 namespace WebCore {
58 
59     class Color;
60 
61     class Gradient : public Generator {
62     public:
create(const FloatPoint & p0,const FloatPoint & p1)63         static PassRefPtr<Gradient> create(const FloatPoint& p0, const FloatPoint& p1)
64         {
65             return adoptRef(new Gradient(p0, p1));
66         }
create(const FloatPoint & p0,float r0,const FloatPoint & p1,float r1)67         static PassRefPtr<Gradient> create(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1)
68         {
69             return adoptRef(new Gradient(p0, r0, p1, r1));
70         }
71         virtual ~Gradient();
72 
73         void addColorStop(float, const Color&);
74 
75         void getColor(float value, float* r, float* g, float* b, float* a) const;
76 
77 #if PLATFORM(SGL)
78         SkShader* getShader(SkShader::TileMode);
79 #else
80         PlatformGradient platformGradient();
81 #endif
82 
83         struct ColorStop {
84             float stop;
85             float red;
86             float green;
87             float blue;
88             float alpha;
89 
ColorStopColorStop90             ColorStop() : stop(0), red(0), green(0), blue(0), alpha(0) { }
ColorStopColorStop91             ColorStop(float s, float r, float g, float b, float a) : stop(s), red(r), green(g), blue(b), alpha(a) { }
92         };
93 
setStopsSorted(bool s)94         void setStopsSorted(bool s) { m_stopsSorted = s; }
95 
96         virtual void fill(GraphicsContext*, const FloatRect&);
97 
98     private:
99         Gradient(const FloatPoint& p0, const FloatPoint& p1);
100         Gradient(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1);
101 
platformInit()102         void platformInit() { m_gradient = 0; }
103         void platformDestroy();
104 
105         int findStop(float value) const;
106 
107         bool m_radial;
108         FloatPoint m_p0;
109         FloatPoint m_p1;
110         float m_r0;
111         float m_r1;
112         mutable Vector<ColorStop> m_stops;
113         mutable bool m_stopsSorted;
114         mutable int m_lastStop;
115 
116         PlatformGradient m_gradient;
117     };
118 
119 } //namespace
120 
121 #endif
122