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